別のグループによる変更を元に戻す
XMLデータ処理の3番目のフェーズでは、次の2つのタスクを実行できる必要があります。
- 変更された注文に関する要約情報を出力する。
- 処理フェーズで行われたすべての変更の情報を表示する。
前の変更記録フェーズのように注文をさらに変更することもできますが、このセクションでは、ReviewPO.javaを使ってすべての変更を元に戻す方法を説明します(リスト9を参照)。コメント2「Shows the information in the modified purchase order」(変更された注文の情報を表示する)の下の行では、上記の最初のタスクを実行します。このコードの意味については、もう説明の必要はないでしょう。コメント3「Display changes made in the second phase」(2番目のフェーズで行われた変更を表示する)の下にあるprintChangeSummary()
呼び出しによって、ProcessPO.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. load the processed purchase order XMLDocument xmlDoc = XMLHelper.INSTANCE.load(fis); DataObject purchaseOrder = xmlDoc.getRootObject(); //2. Shows the information in the modified purchase order 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. Display changes made in the second phase System.out.println(); System.out.println("---review changes in purchase order ---"); ChangeSummary chngSum = purchaseOrder.getChangeSummary(); Util.printChangeSummary(chngSum); //4. Undo all changes in the second phase System.out.println(); System.out.println( "---action taken after reviewing the changes---"); /* * should really work on changes here, * ChangeSummary only has a undoChanges() method; * ideally should have methods such as: * (1) restore() for deleted data object, * (2) delete() for newly added object, and * (3) revoke() for modified object * and those methods should apply directly * on the data objects or properties */ System.out.println("\t###undo all changes###"); chngSum.undoChanges(); //5. Modify the purchase order on the original version System.out.println(); System.out.println( "---changes made in purchase order review---"); chngSum.beginLogging(); //this clears old change summary information billTo.set("name", "Alice Smith"); chngSum.endLogging(); //6. print to the system console the new modifications Util.printChangeSummary(chngSum); //7. persist the reviewed version to an XML file Util.storeXML(purchaseOrder,"purchaseOrder", Constants.PO_REVIEWED_XML); } }
この2番目のタスクは、前のセクションのChangeSummaryの出力処理とは違います。前のセクションでは、JavaオブジェクトとしてのChangeSummaryに直接基づいて出力を実行しました。今回は、変更の要約がXMLファイルからランタイムに再度読み込まれます。この違いは、出力を比較すると明らかになります。前のセクションの出力では、削除アイテムに関してprintDataObject()
からはなにも生成されませんが、printDeletedProperty()
を呼び出すと、削除アイテムのすべてのプロパティと値が取得されます。今回の出力処理では、この正反対の結果になります。この不一致は、Apache Tuscany実装のバグと思われます(第二のバグらしきものがリスト2のCreatePO.javaのコメントに見られます)。ここからも、厳密な変更追跡メカニズムを実装することがいかに難しいかがわかります。
プログラムの残りの部分を見ていきましょう。コメント4「Undo all changes in the second phase」(2番目のフェーズで行った変更をすべて元に戻す)以下ではChangeSummaryのundoChanges()
メソッドを呼び出し、コメント5「Modify the purchase order on the original version」(元のバージョンの注文を変更する)以下では元に戻したばかりの注文に簡単な変更を加えています。永続化されたXML「po_reviewed.xml」を参照して、以上の操作の結果を確認してください。
SDOの明るい未来
今後、SDOはEclipse、BEA AquaLogic Data Services Platform(ALDSP)、IBM WebSphere Process Serverなどの主要なオープンソースソフトウェアや商用ソフトウェアだけでなく、Java、C++、PHPなどのさまざまな言語にも実装される予定です。
2007年、SDO界に2つの大きな前進が見られました。
- 3月、Open SOAはSDO仕様をOASISに提出すると発表しました。
- 4月、SDOをJava EEの将来のバージョンでサポートすることを検討するとJCPが公式に発表しました。
Apache TuscanyからもSDO Java実装が最近リリースされました。以上を総合すると、SDO採用の動きはますます盛んであると言えるでしょう。
この記事は、SDOの一機能を紹介したに過ぎません。他にも、パワーあふれる便利な機能がたくさんあります。SDOテクノロジを丹念に調べれば、サービスドメインにおけるデータ管理に広く求められる機能を簡単に実現する方法が他にも見つかることでしょう。