首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 新手入门 >> 基础入门 >> 正文

使用SDO跟踪XML数据的变化

   三、记录处理XML数据的变化

    我们可以利用在SDO中定义的ChangeSummary机制来跟踪订购单的变化。为了实现我们的第二个目的,我们先来编辑一个这个XML的schema文件po_orginal.xsd。代码如下:

   

 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/PO"
    xmlns:sdo="commonj.sdo"
    xmlns:sdoxml="commonj.sdo/xml"
targetNamespace="http://www.example.com/PO">

<xsd:import namespace="commonj.sdo/xml"
schemaLocation="C:\\eclipse\\workspace\\SDO\\src\\main\\resources\\sdo.xsd" />
    <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
    <xsd:element name="comment" type="xsd:string"/>
    <xsd:element name="status" type="StatusType"/>

<xsd:complexType name="PurchaseOrderType">
        <xsd:sequence>
            <xsd:element name="shipTo" type="USAddress"/>
            <xsd:element name="billTo" type="USAddress"/>
            <xsd:element ref="comment" minOccurs="0"/>
            <xsd:element name="items"  type="Items"/>
            <xsd:element ref="status" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="changes" type="sdo:ChangeSummaryType"/>
        </xsd:sequence>
        <xsd:attribute name="orderDate" type="xsd:date"/>
    </xsd:complexType>
   ......
</xsd:schema>

    这个被导入的sdo.xsd定义了ChangeSummaryType。我们在PurchaseOrderType中加一个ChangeSummaryType的元素。我们可以将这个元素命名为任何东西,当然,除了使用“changes”。

    为了使用新的schema,我们需要使用Util类的definePOTypes()方法来装载它。我们将要保存被CreatePO.java产生的XML文件为po.xml。这个文件和po_original.xml比较得知,po.xml在<po:purchaseOrder>: <changes logging="false" />中有一个新的子元素。ProcessPO.java类处理订购单。当运行时,程序保存了这个处理过程,并在po_processed.xml中产生了一条变化记录。po_processed.xml的代码如下:

   

 <?xml version="1.0" encoding="ASCII"?>
<po:purchaseOrder xmlns:po="http://www.example.com/PO" orderDate="1999-10-20">
  <shipTo country="US">
    <name>Alice Smith</name>
    <street>123 Maple Street</street>
    <city>Mill Valley</city>
    <state>CA</state>
    <zip>90952</zip>
  </shipTo>
  <billTo country="US">
    <name>Alice Smith</name>
    <street>8 Oak Avenue</street>
    <city>Mill Valley</city>
    <state>PA</state>
    <zip>95819</zip>
  </billTo>
  <po:comment>Hurry, my lawn is going wild!</po:comment>
  <items>
    <item partNum="872-AA">
      <productName>Lawnmower</productName>
      <price>148.95</price>
      <quantity>1</quantity>
      <po:comment>Confirm this is electric</po:comment>
    </item>
    <item partNum="926-AA">
      <productName>Baby Monitor</productName>
      <price>39.98</price>
      <quantity>2</quantity>
      <shipDate>2007-11-21</shipDate>
    </item>
    <item partNum="999-AA">
      <productName>armed Chair</productName>
      <price>299.95</price>
      <quantity>1</quantity>
      <po:comment>Make sure the cover is leather.</po:comment>
    </item>
  </items>
  <changes create="     ##//items/item[3]" delete="     ##//changes/items[1]/item[3]" logging="false" xmlns:sdo="commonj.sdo">
    <billTo sdo:ref="     ##//billTo">
      <name>Robert Smith</name>
    </billTo>
    <item sdo:ref="     ##//items/item[2]">
      <quantity>1</quantity>
    </item>
    <items sdo:ref="     ##//items">
      <item sdo:ref="     ##//items/item[1]" />
      <item sdo:ref="     ##//items/item[2]" />
      <item partNum="998-AA"><productName>Carpet</productName><price>439.98</price><quantity>1</quantity><shipDate>2007-12-01</shipDate></item>
    </items>
  </changes>
</po:purchaseOrder>

    上面的代码显示了XML文件的变化记录,但是我们更感兴趣的是<changes>元素,这个元素现在变得更复杂了。这个元素捕捉了订购单的所有的变化。基本这些变化,应用程序可以恢复以前的未变化的数据。

    现在让我我们看一下ProcessPO.java类,并分析一个SDO如何允许我们获得这样详细的变化数据。

    1. 注释1中在运行时转载了po.xml。

    2. 注释2建立了和purchaseOrder数据对象相关的ChangeSummary对象。

    3. 为了跟踪变化,注释3打开了ChangeSummary对象的日志功能。

    4. 在注释4中,日志是关闭的,purchaseOrder的所有变化和它的子数据对象在ChangeSummary对象中被捕捉。

    5. 在注释5中输出了结果,我们可以看看Util类中的printChangeSummary方法,代码如下:

 

 public static void printChangeSummary(ChangeSummary chngSum) {
if (chngSum == null) {
System.out.println("ChangeSummary is not in existence!");
return;
}
for (Iterator it = chngSum.getChangedDataObjects().iterator(); it.hasNext();) {
DataObject changedObject = (DataObject) it.next();
System.out.println();
if (chngSum.isCreated(changedObject)) {//is the changed object newly created
                System.out.println("Created: " + changedObject);
if (changedObject.getContainer()!=null){
System.out.println("\t--- to be contained in : "
                        + changedObject.getContainer().getType().getName()
+ " ---");
}else{
System.out.println("\t--- created object has no container --- ");
}
printAnnotatedDataObject("newly created",changedObject, 2);
} else if (chngSum.isDeleted(changedObject)) {
System.out.println("Deleted: " + changedObject);
if (chngSum.getOldContainer(changedObject) != null){
System.out.println("\t--- originally contained in : " + chngSum.getOldContainer(changedObject).getType().getName() + " ---");
}else{
System.out.println("\t--- deleted object has no container ---");
}
// a potential bug in Tuscany SDO, this shows nothing in ProcessPO.java
                printAnnotatedDataObject("deleted",changedObject, 2);
// drill down to deleted property
                System.out.println("\t--- deleted property information --- ");
// a potential bug in Tuscany SDO, this section shows nothing in ReviewPO.java
                for (Iterator settingIt = chngSum.getOldValues(changedObject).iterator(); settingIt.hasNext();) {
printDeletedProperty((ChangeSummary.Setting) settingIt.next());
}
System.out.println("\t--- deleted property information --- ");
} else if (chngSum.isModified(changedObject)) {
System.out.println("Updated:  " + changedObject);
// print out the updated object
                printAnnotatedDataObject("after update", changedObject, 2);
// drill down to changed property
                System.out.println("\t--- property update information --- ");
for (Iterator settingIt = chngSum.getOldValues(changedObject).iterator(); settingIt.hasNext();) {
ChangeSummary.Setting changeSetting = (ChangeSummary.Setting) settingIt.next();
printUpdatedProperty(changeSetting, changedObject,chngSum);
}
System.out.println("\t--- property update information --- ");
} else
                System.out.println("Should never come here!");
}
}

    在这个方法中,我们首先使用了getChangedDataObjects()来获得所有变化了的数据对象,然后按着他们的种类处理,即建立、删除或编辑。如果数据对象是新建的,我们会打印对象的信息和所有的属性。

    在下一部分,我们来浏览被编辑的订购单。

上一页  [1] [2] [3] [4] 下一页

【责编:Zenghui】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·C++箴言大合集
 ·开源框架 Structs 2.0入门教程
 ·诱人的奶酪 J2ME手机开发技术
 ·Oracle外键及外键约束修改行为
 ·开源软件测试工具学习专题
 ·JSP Web开发 入门基础到高手进阶教程
 ·JavaFX—是Java桌面的新希望么?
 ·安全至上 .NET开发安全策略
 ·测试用例设计之道-测试用例学习专题
 ·面向Java开发人员的Scala指南
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航