SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

XMLデータの変更をSDOで簡単に追跡する

SDOのJava実装を使ってXMLデータへの変更を追跡する

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (12.6 KB)

別のグループによる変更を元に戻す

 XMLデータ処理の3番目のフェーズでは、次の2つのタスクを実行できる必要があります。

  1. 変更された注文に関する要約情報を出力する。
  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で行われた変更がシステムコンソールに再度出力されます。

リスト9 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. 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つの大きな前進が見られました。

  1. 3月、Open SOAはSDO仕様をOASISに提出すると発表しました。
  2. 4月、SDOをJava EEの将来のバージョンでサポートすることを検討するとJCPが公式に発表しました。

 Apache TuscanyからもSDO Java実装が最近リリースされました。以上を総合すると、SDO採用の動きはますます盛んであると言えるでしょう。

 この記事は、SDOの一機能を紹介したに過ぎません。他にも、パワーあふれる便利な機能がたくさんあります。SDOテクノロジを丹念に調べれば、サービスドメインにおけるデータ管理に広く求められる機能を簡単に実現する方法が他にも見つかることでしょう。

謝辞
 この記事の初稿とサンプルソースコードを校閲し、貴重な意見を提供していただいたLaxma Reddy氏に感謝いたします。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Young Yang(Young Yang)

ウォール街の金融会社に勤務する上級エンタープライズアーキテクト。数学博士号を取得。IBM社のeビジネスデザイン、DB2管理、ビジネスインテリジェンス、XMLおよび関連テクノロジ、WebSphere Application Serverの認定資格、BEA社のWebLogic Application S...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2225 2008/03/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング