⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oxmlmapping.java

📁 一个“对象--XML 映射”(Object-Xml Mapping) 的类库。 它的目的是帮助开发者方便、快速的从XML 文件构建出Java 对象
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/**
 * @author 沈东良 Edward Shen<a href="mailto:shendl_s@hotmail.com">shendl_s@hotmail.com</a>
 * 2007-8-15 上午10:04:41
 */
package net.sf.oxmled.mapping.service;

import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.List;

import net.sf.oxmled.common.util.ClassLoaderUtil;
import net.sf.oxmled.common.util.ClassUtil;
import net.sf.oxmled.mapping.annotation.XMLAttribute;
import net.sf.oxmled.mapping.annotation.XMLNode;
import net.sf.oxmled.model.INode;
import net.sf.oxmled.model.Node;
import net.sf.oxmled.service.INodeService;
import net.sf.oxmled.service.NodeService;

import org.apache.commons.lang.ArrayUtils;

/**
 * @author 沈东良 Edward Shen<a href="mailto:shendl_s@hotmail.com">shendl_s@hotmail.com</a>
 * 2007-8-15 上午10:04:41
 * 使用annotation的信息,实现BO对象和INode对象之间的转换。  这是在JavaBean和XML之间执行转换的服务类。
 *    节点的属性:  节点的名称(类名)    fullClassName="类的全名"
 *
 *Class.getName()是类的全部名,需要类的局部名
 *   反射怎样得到私有的字段值?
 *   ///////////////////////
 *  1, 设计:castMethod  使用xml配置类,它们的方法,
 *  2, 
 *    如果字段是iterator或者数组,则生成多个xml属性
 */
public class OXmlMapping implements IOXmlMapping {
	/**
	 * 
	 */
	private IConvertCastUtil convertCastUtil=null;
	
	public IConvertCastUtil getConvertCastUtil() {
		synchronized(this){
			if(this.convertCastUtil==null){
				this.convertCastUtil=new ConvertCastUtil();
			}
			
		}
		
		return convertCastUtil;
	}

	public void setConvertCastUtil(IConvertCastUtil convertCastUtil) {
		this.convertCastUtil = convertCastUtil;
	}

	/**
	 * 
	 * @param aClass
	 * @return
	 */
	private String getLocalClassName(Class aClass){
		/**
		 * 不能处理数组类型的信息!
		 */
		return aClass.getName().substring(aClass.getPackage().getName().length()+1);
	
	}
	
	/**
	 * 服务类
	 */
	private INodeService nodeService=null;
	
	
	/**
	 * @return the nodeService
	 */
	public INodeService getNodeService() {
		synchronized(this){
			if(this.nodeService==null){
				this.nodeService=new NodeService();
				
			}
		
		}
	
		return nodeService;
	}

	/**
	 * @param nodeService the nodeService to set
	 */
	public void setNodeService(INodeService nodeService) {
		this.nodeService = nodeService;
	}
	

	/* (non-Javadoc)
	 * @see net.sf.oxmled.mapping.service.IOXmlMapping#save(java.lang.Object)
	 */
	public void save(Object object) throws URISyntaxException, IllegalArgumentException, MalformedURLException, IllegalAccessException, IOException{
		/**
		 * 
		 */
		String className=object.getClass().getName();
		this.save(object, className);
		
		
	}
	
	/* 
	 * 实际的实现方式
	 * (non-Javadoc)
	 * @see net.sf.oxmled.mapping.service.IOXmlMapping#save(java.lang.Object, java.net.URI)
	 */
	public void save(Object object,URI uri) throws IllegalArgumentException, IllegalAccessException, MalformedURLException, IOException, URISyntaxException{
		/**
		 * 转换对象为INode,最后保存为文件。
		 * 1,INode downCast(Object object){}
		 * 2,INode loadXmlFile(URI)
		 * 3,Object upCast(INode)
		 * 
		 * writeToPrettyPrint(INode node, URL url)
		 * ============================================
		 * 1,object->INode  向下转型
		 * 2,保存为uri
		 * 
		 * 
		 */
		INode node=this.downCast(object);
		this.getNodeService().writeToPrettyPrint(node, uri.toURL());
		
		
		
	}
	/**
	 * private void findBaseClassImplementsInterface(List result,Class claze){
		Class[] interfaces=claze.getInterfaces();
		
	}
	 * @param result
	 * @param claze
	 */
	
	
	/**
	 * 把业务对象转换成INode对象
	 * @param object 一般对象
	 * @return  INode对象
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public INode downCast(Object object) throws IllegalArgumentException, IllegalAccessException{
		/**
		 * 
		 * 作为根节点的类,必须标注XMLNode
		 * =====================================================
		 *                  BO变为INode,需要区分数组和集合
		 * 
		 */
		if(!object.getClass().isAnnotationPresent(XMLNode.class)){
			throw new RuntimeException("没有标注为XMLType的类型,不能保存为xml文件");
			
		}else{
		INode rootNode=new Node();
		//对象的根节点
		XMLNode rootNodeType=object.getClass().getAnnotation(XMLNode.class);
		if("".equals(rootNodeType.name())){
			rootNode.setName(getLocalClassName(object.getClass()));
		}else{
			rootNode.setName(rootNodeType.name());
		}
		rootNode.setEncoding(rootNodeType.encoding());
		rootNode.setRoot(rootNodeType.root());
		//类的全名作为节点的属性名,用于反向构建对象。
		rootNode.getAttributes().put(IOXmlMapping.CLASSNAME,object.getClass().getName());
		//属性
		/**
		 * 得到的字段数是0,出错!
		 * 
		 */
		Field[] fields=object.getClass().getDeclaredFields();
		for(int i=0;i<fields.length;i++){
			XMLAttribute attribute=fields[i].getAnnotation(XMLAttribute.class);
			//如果字段有设置属性
			if(attribute!=null){
				/**
				 * 如果字段是集合
				 * 1,取出每一个元素
				 * 2,变为一个属性
				 * ============属性名相同,这会出错!
				
				if(fields[i].getType().isArray() || this.isImplementsInterface(fields[i].getType(), Iterable.class)){
					String key=null,value=null;
					if("".equals(attribute.name())){
						key=fields[i].getName();
						
					}else{
						key=attribute.name();
					}
					
					
				}else{
					//如果字段不是集合
					 *  */
					 
					//node.getAttributes().put(key, value)
					String key=null,value=null;
					if("".equals(attribute.name())){
						key=fields[i].getName();
						
					}else{
						key=attribute.name();
					}
					if("".equals(attribute.value())){
						//java.lang.IllegalAccessException:
						fields[i].setAccessible(true);
						if(fields[i].get(object)!=null){
							value=fields[i].get(object).toString();
							rootNode.getAttributes().put(key, value);
							
						}
						
						//value=fields[i].getDouble(object).toString();
					}else{
						value=attribute.value();
						rootNode.getAttributes().put(key, value);
					}
				
		
			}
			
			//子节点
			/**
			 * 循环执行 节点和属性的
			 * 
			 */
			XMLNode childNodeType=fields[i].getAnnotation(XMLNode.class);
			if(childNodeType!=null){
				//downCastRecursion(node,fields[i].get(object));
				/**
				 * 子节点可能是一个集合
				 * 
				 */
				fields[i].setAccessible(true);
				if(fields[i].getType().isArray()){
					//for(Object tmp : fields[i].get(object).){
					//}
					int length=ArrayUtils.getLength(fields[i].get(object));
					for(int j=0;j<length;j++){
						//数组的一个元素
						Object tmp=Array.get(fields[i].get(object),j);
						if(tmp!=null){
						INode childNode=new Node();
						if("".equals(childNodeType.name())){
							childNode.setName(fields[i].getName());
						}else{
							childNode.setName(childNodeType.name());
						}
						//类的全名作为节点的属性名,用于反向构建对象。
						//不能是数组的全名
						childNode.getAttributes().put(IOXmlMapping.CLASSNAME,tmp.getClass().getName());
						childNode.setEncoding(childNodeType.encoding());
						childNode.setRoot(childNodeType.root());
						/**
						 * 再拿子节点的属性和子节点的字节点
						 */
						
					
						
						this.downCastRecursion(rootNode,childNode, tmp);
					}
					
					
					
					
				}
				}else if(ClassUtil.isImplementsInterface(fields[i].getType(), Iterable.class)){
					for(Object tmp : (Iterable)fields[i].get(object)){
						if(tmp!=null){
							INode childNode=new Node();
							if("".equals(childNodeType.name())){
								childNode.setName(fields[i].getName());
							}else{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -