使用SDO跟踪XML数据的变化(2)

上一篇 / 下一篇  2008-04-24 21:11:00 / 个人分类:技术文章

2、建立根数据对象:SDO的动态API可以通过数据对象的层次和属性或是一个DataGraph(包含了数据对象元数据的一个图)来描述结构化数据。SDO提供了用于建立一个未连接的数据对象的DataFactory接口。

3、设置根数据对象的数据类型属性:订购单在SDO中是一个类型,并且根据schema,它有一个叫orderDate的数据类型属性,这是一个日期类型。

4、建立子数据对象:数据对象订购单有一些子数据对象。例如,上面代码中的注释4在purchaseOrder中建立shipTo子结点。除了这种 方法,我们还可以使用DataFactory来建立一个未连接的shipTo数据对象,并使用setDataObject方法将他设置成 purchaseOrder的一个子结点。代码如下:

DataObject shipTo = DataFactory.INSTANCE.create(CONSTANTS.PO_NAMESPACE, "USAddress");
......
PurchaseOrder.setDataObject("shipTo", shipTo);

5、设置子对象结点的数据类型属性:基于USAddress类型的定义,shipTo数据对象有不同的数据类型属性。上面注释5建立了这些属性。

6、为子数据对象“item”建立一个子数据对象:这部分显示了建立XML时SDO数据模型。

在下一部分将讨论如何使用SDO的动态API,我们可以编辑订购单,并且在同时跟踪他们的变化。

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

我们可以利用在SDO中定义的ChangeSummary机制来跟踪订购单的变化。为了实现我们的第二个目的,我们先来编辑一个这个XML的schema文件po_orginal.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">


schemaLocation="C:\\eclipse\\workspace\\SDO\\src\\main\\resources\\sdo.xsd" />



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


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

http://www.example.com/PO" rderDate="1999-10-20">

Alice Smith
123 Maple Street
Mill Valley
CA
90952


Alice Smith
8 Oak Avenue
Mill Valley
PA
95819

Hurry, my lawn is going wild!


Lawnmower
148.95
1
Confirm this is electric


Baby Monitor
39.98
2
2007-11-21


Armed Chair
299.95
1
Make sure the cover is leather.




Robert Smith


1




Carpet439.9812007-12-01


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

现在让我我们看一下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!");
}
}



TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-05  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 55049
  • 日志数: 24223
  • 建立时间: 2007-12-06
  • 更新时间: 2008-06-15

RSS订阅

Open Toolbar