SDOを使ってXMLを作成、永続化する
CreatePO.javaクラス(リスト2を参照)で、このサンプルのXML作成フェーズが完結します。このクラスで特に注目する必要があるのは、コメントが付けられた7ヶ所です。
package com.company.sdo.po; import commonj.sdo.DataObject; import commonj.sdo.helper.DataFactory; public class CreatePO { public static void main(String[] args) throws Exception { //1. Define Types and Properties with XSD Util.definePOTypes(); //2. Create the root DataObject DataObject purchaseOrder = DataFactory.INSTANCE.create(Constants.PO_NAMESPACE, "PurchaseOrderType"); //3. Set data type Property for the root DataObject purchaseOrder.setString("orderDate", "1999-10-20"); //4. Create child DataObjects DataObject shipTo = purchaseOrder.createDataObject("shipTo"); //5. Set data type Property for the child DataObject shipTo.set("country", "US"); shipTo.set("name", "Alice Smith"); shipTo.set("street", "123 Maple Street"); shipTo.set("city", "Mill Valley"); shipTo.set("state", "CA"); shipTo.setString("zip", "90952"); DataObject billTo = purchaseOrder.createDataObject("billTo"); billTo.set("country", "US"); billTo.set("name", "Robert Smith"); billTo.set("street", "8 Oak Avenue"); billTo.set("city", "Mill Valley"); billTo.set("state", "PA"); billTo.setString("zip", "95819"); purchaseOrder.set("comment", "Hurry, my lawn is going wild!"); DataObject items = purchaseOrder.createDataObject("items"); //6. Create a child DataObject for the child DataObject “items” DataObject item1 = items.createDataObject("item"); item1.set("partNum", "872-AA"); item1.set("productName", "Lawnmower"); item1.setInt("quantity", 1); item1.setString("price", "148.95"); item1.set("comment", "Confirm this is electric"); DataObject item2 = items.createDataObject("item"); item2.set("partNum", "926-AA"); item2.set("productName", "Baby Monitor"); item2.setInt("quantity", 1); item2.setString("price", "39.98"); item2.setString("shipDate", "2007-11-21"); DataObject item3 = items.createDataObject("item"); item3.set("partNum", "998-AA"); item3.set("productName", "Carpet"); item3.setInt("quantity", 1); item3.setString("price", "439.98"); item3.setString("shipDate", "2007-12-01"); //7. Persist the XML data to an XML file //Util.storeXML(purchaseOrder,"purchaseOrder", // Constants.PO_XML_ORIGINAL); /*use the following line instead of the above * one for tracking changes*/ Util.storeXML(purchaseOrder,"purchaseOrder", Constants.PO_XML); } }
- Define Types and Properties with XSD(XSDでデータ型とプロパティを定義する)― データはXMLスキーマによってモデル化されるため、最初に必要なことは、このスキーマに基づいてSDOのデータ型とプロパティをランタイムに定義することです。この操作を行うのは、Utilクラスの
definePOTypes()
メソッドから呼び出されるXSDHelperです。
public static void definePOTypes() throws Exception { FileInputStream fis = new FileInputStream(PO_MODEL_ORIGINAL); XSDHelper.INSTANCE.define(fis, null); fis.close(); }
- Create the root DataObject(ルートデータオブジェクトを作成する)― SDOの動的APIは、データオブジェクト階層(オブジェクト別にプロパティを持つ階層)またはDataGraph(データオブジェクトのグラフをメタデータごとパッケージ化したもの)によって構造化データを表します。SDOのDataFactoryインターフェイスを使って未接続のデータオブジェクトを作成できるため、ここで必要な作業は、注文処理のルートデータオブジェクトを作成することです。
- Set data type Property for the root DataObject(ルートデータオブジェクトのデータ型プロパティを設定する)― SDOの場合、注文はデータ型です。スキーマの定義に従うと、注文のデータ型プロパティは
orderDate
であり、これは日付型です。コメント3の下の行で、orderDate
に日付の文字列を設定します。これは、JavaのDateオブジェクトを作成し、DataObjectのsetDate()
メソッドを使用することに相当します。
- Create child DataObjects(子データオブジェクトを作成する)― データオブジェクトpurchaseOrderには、複数の子データオブジェクトがあります。たとえば、コメント4の下の行では、"shipTo"と名前を指定してshipTo子オブジェクトをpurchaseOrderから直接作成します。これは、DataFactoryを使って未接続のshipToデータオブジェクトを作成し、これをDataObjectのいずれかの
setDataObject()
メソッドを使ってpurchaseOrderの子として設定することに相当します。
DataObject shipTo = DataFactory.INSTANCE.create(CONSTANTS.PO_NAMESPACE, "USAddress"); ...... PurchaseOrder.setDataObject("shipTo", shipTo);
- Set data type Property for the child DataObject(子データオブジェクトのデータ型プロパティを設定する)― USAddressデータ型の定義に従い、shipToデータオブジェクトにはさまざまなデータ型プロパティが与えられます。コメント5の下の行で、これらのプロパティを作成します。
- Create a child DataObject for the child DataObject “items”(子データオブジェクト"items"の子データオブジェクトを作成する)― ここでは、XMLをモデル化した場合のSDOデータモデルの階層的な特性について説明します。ItemsはルートデータオブジェクトpurchaseOrderの子であり、これに複数のitemデータオブジェクトの子が含まれます。
- Persist the XML data to an XML file(XMLデータをXMLファイルに永続化する)― SDOの動的APIに用意されたXMLHelperインターフェイスを使って、XMLデータをXMLファイルに永続化できます。コメント7の下のコードで、Utilクラスを呼び出し、メソッドを次のように定義します。
public static void storeXML(DataObject data, String rootElementName, String xmlFile) throws Exception { OutputStream stream = new FileOutputStream(xmlFile); XMLHelper.INSTANCE.save(data, PO_NAMESPACE, rootElementName, stream); }
永続化した注文処理用XMLファイルは、「po_original.xml」という名前です。
XML用のSDO動的APIは非常に簡単に使用できるため、DOM APIを使って同等の操作を行うよりもずっと便利です。
次のセクションでは、SDOの動的APIを使って注文処理に改良を加え、変更を追跡できるようにします。