四、通过一个不同的实体浏览数据的变化
XML数据处理的第三部分需要完成两个任务:
1. 程序需要按着编辑顺序打印出主要的信息。
2. 显示处理阶段所有的修改记录。
当我们可以更进一步根据着一个记录变化阶段编辑订购单时,这部分显示了如何使用ReviewPO.java调用所有的编辑记录。ReviewPO.java的代码如下:
package com.company.sdo.po; import java.io.FileInputStream; import java.util.List; import commonj.sdo.ChangeSummary; import commonj.sdo.DataObject; import commonj.sdo.helper.XMLDocument; import commonj.sdo.helper.XMLHelper; public class ReviewPO { public static void main(String[] args) throws Exception { Util.definePOTypes(); FileInputStream fis = new FileInputStream(Constants.PO_PROCESSED_XML); //1. 装载要处理的订购单 XMLDocument xmlDoc = XMLHelper.INSTANCE.load(fis); DataObject purchaseOrder = xmlDoc.getRootObject(); //2. 显示被编辑的订购单的信息 System.out.println(); System.out.println("---received purchase order information---"); System.out.println("Order date: " + purchaseOrder.get("orderDate")); System.out.println("Order comment: " + purchaseOrder.get("comment")); DataObject shipTo = purchaseOrder.getDataObject("shipTo"); System.out.println("Ship to name: "); Util.printDataObject(shipTo,1); DataObject billTo = purchaseOrder.getDataObject("billTo"); System.out.println("Bill to name: "); Util.printDataObject(billTo,1); DataObject items = purchaseOrder.getDataObject("items"); List itemList = items.getList("item"); System.out.println("Ordered items: "); for (int i = 0; i < itemList.size(); i++) { DataObject item = (DataObject) itemList.get(i); System.out.println("\tItem " + (i+1) + " :" ); Util.printDataObject(item,2); } //3. 显示了第二阶段的数据变化 System.out.println(); System.out.println("---review changes in purchase order ---"); ChangeSummary chngSum = purchaseOrder.getChangeSummary(); Util.printChangeSummary(chngSum); //4. 取消第二阶段的所有变化 System.out.println(); System.out.println("---action taken after reviewing the changes---"); System.out.println("\t###undo all changes###"); chngSum.undoChanges(); //5. 编辑订购单的原始版本 System.out.println(); System.out.println("---changes made in purchase order review---"); chngSum.beginLogging(); billTo.set("name", "Alice Smith"); chngSum.endLogging(); //6. 将新的变化输出到系统控制台 Util.printChangeSummary(chngSum); //7. 将改变记录保存到一个XML文件中 Util.storeXML(purchaseOrder,"purchaseOrder", Constants.PO_REVIEWED_XML); } }
要注意的是第二个任务不同于在前一部分打印ChangeSummary,在这里printout是直接基于ChangeSummary的。变化细节在运行时被重新装载。我们可以通过比较这两个printout来分辨它们的不同。在上一部分,printDataObject()在删除项时什么都没产生,而是调用了printDeletedProperty()来列出它们的属性和它们的值。在当前的printout中,恰恰相反。
在程序的其他部分,注释4通过调用undoChanges方法取消了在第二阶段的所有的变化,注释5对订购单做了一些小的变化。我们可以看看保存变化记录的文件(po_reviewed.xml)来验证这些操作结果。