📄 oxmlmapping.java
字号:
/**
* @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 + -