通用数据推送 (4)-castor的使用

 这个通用的推送做了很久了,来早就想把它的思路整理一下。终于,想做下来整理的时候很快又发现不知道该怎么说了。

还是硬着头皮往下写吧。

    那就先说说castor 吧。由于在我们的推送配置是相对比较复杂的,不管是自己通过DOM或者SAX的调用来实现回事相当麻烦的。比如说我们根据我们的配置xml , 需要定义一些对象如config,task ,source 。。。(都对应我们的xml)。那么config下面是可以有不确定个数的task,task下又可以有不确定个数的source,而source下又可以有不确定个数source。这样在在初始化的时候要做大量的对List的操作。一个字麻烦。

    Castor是ExoLab Group下面的一个开放源代码的项目,它主要实现的是O/R映射功能。它主要API和数据接口为:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。它支持分布式目录事务处理和时间;提供处理XML、Directory、XADirectory的类库,提供从XML到JAVA类的转换机制。其中最重要的就是其XML映射机制和其独创的Castor JDO的机制了。我们就是使用了castor xml。
XML映射机制
组织(Marshalling)是为内存中的对象生成 XML 表示的过程。与 Java 序列化一样,这种表示需要包含所有依赖的对象:我们的主对象引用的对象、那些对象引用的对象,等等。
 
解组(Unmarshalling)是与组织相反的过程,在内存中根据 XML 表示构建一个对象(和依赖的对象)。
 
映射(Mapping)是用于组织和解组的一套规则。 Castor 有内置的规则定义本文的这一部分所描述的缺省映射。
就以,我们的配置文件为例:
xml 代码
  1. <source id="1" name="website" isTranstion="false" isMuTheard="true" futrueid="ID">   

 

首先 需要定义相应的对象

 

java 代码
  1. ublic class SourceConfig extends AbstractSendConfig {   
  2.     private static final long serialVersionUID = 3334769084824491180L;   
  3.     private boolean isTranstion;   
  4.     private boolean isMuTheard;   
  5.     private long interval = 0;   
  6.     private String futrueid;   
  7.   
  8.     public boolean getIsMuTheard() {   
  9.         return isMuTheard;   
  10.     }   
  11.   
  12.         public void setIsMuTheard(boolean isMuTheard) {   
  13.         this.isMuTheard = isMuTheard;   
  14.     }   
  15.   
  16.         public boolean getIsTranstion() {   
  17.         return isTranstion;   
  18.     }   
  19.   
  20.         public void setIsTranstion(boolean isTranstion) {   
  21.         this.isTranstion = isTranstion;   
  22.     }   
  23.   
  24.     public String getFutrueid() {   
  25.         return futrueid;   
  26.     }   
  27.   
  28.         public void setFutrueid(String futrueid) {   
  29.         this.futrueid = futrueid;   
  30.     }   
  31.   
  32.     public long getInterval() {   
  33.         return interval;   
  34.     }   
  35.     public void setInterval(long interval) {   
  36.         this.interval = interval;   
  37.     }   
  38. }  

 

第二步就是建立相应的map

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <!---->
  3.     "http://castor.org/mapping.dtd">  
  4. <mapping>  
  5. <class name="com.ninetowns.spider.sender.SourceConfig" auto-complete="true">  
  6.         <field name="id">  
  7.             <bind-xml name="id" node="attribute"/>  
  8.         field>  
  9.         <field name="name">  
  10.             <bind-xml name="name" node="attribute"/>  
  11.         field>  
  12.         <field name="futrueid">  
  13.             <bind-xml name="futrueid" node="attribute"/>  
  14.         field>  
  15.         <field name="isTranstion">  
  16.             <bind-xml name="isTranstion" node="attribute"/>  
  17.         field>  
  18.         <field name="isMuTheard">  
  19.             <bind-xml name="isMuTheard" node="attribute"/>  
  20.         field>  
  21.         <field name="interval">  
  22.             <bind-xml name="interval" node="attribute"/>  
  23.         field>  
  24.             class>  
  25. mapping>  

 

第三部 解组(Unmarshalling)

java 代码

 

  1. public class Xml2ObjectUtil {   
  2. public static synchronized Object xml2Object(Class objClass,   
  3.             String mapFile, String xmlFile) throws Exception {   
  4.         if (objClass == null || xmlFile == null)   
  5.             return null;   
  6.         URL mapping = null;   
  7.         if (mapFile != null && !mapFile.trim().equals(""))   
  8.             mapping = objClass.getClassLoader().getResource(mapFile);   
  9.         InputStream in = Xml2ObjectUtil.class.getClassLoader()   
  10.                 .getResourceAsStream(xmlFile);   
  11.         return xml2Object(objClass, mapping, in);   
  12.     }   
  13.   
  14.   
  15.     public static synchronized Object xml2Object(Class objClass, URL mapping,   
  16.             InputStream input) throws Exception {   
  17.         if (objClass == null || input == null)   
  18.             return null;   
  19.         if (mapping == null)   
  20.             mapping = getDefaultMap(objClass);   
  21.   
  22.         ClassDescriptorResolver resolver = getResolver(mapping);   
  23.   
  24.         Unmarshaller unmarshaller = new Unmarshaller();   
  25.         unmarshaller.setWhitespacePreserve(false);   
  26.         unmarshaller.setResolver((XMLClassDescriptorResolver) resolver);   
  27.   
  28.         InputStreamReader reader = new InputStreamReader(input);   
  29.         return unmarshaller.unmarshal(reader);   
  30.     }   
  31. }  

 

最后就是调用了

java 代码

 

  1. SourceConfig config = (SourceConfig ) Xml2ObjectUtil.xml2Object(   
  2.                     SourceConfig.class, “map文件”, “xml文件”);  

 

ok 这样就搞定了一个简单应用。castor还可以支持对象的聚合,还能支持一些基本数据类型同时还可以帮你做验证。castor本身也是给予dom方式访问xml的,它只是简化了我们编写程序的复杂度。

你可能感兴趣的:(sql,xml,jdbc)