SDOの disconnected data architecture
エンドユーザーは通常、Data Access Service (DAS)を通してデータグラフにアクセスします。DASはデータの格納場所からデータグラフをロードし、データグラフを格納場所に保存するメソッドを提供するJavaのクラスです。例えば、XML File DASはXMLファイルを格納場所とするデータグラフを扱い、JDBC DASはRDBを格納場所とするデータグラフを扱います。(それぞれのDASの仕様はSDOの仕様の範囲外。)
DASは典型的なディスコネクテッド・データ・アーキテクチャを採用しています。クライアントは、データグラフを読み込む時と書き出す時のみDASにアクセスします。そのため、データグラフにアクセスする一般的なシナリオは、以下のようなイメージです。
- アプリケーションは、DASにデータグラフのロードをリクエストする。
- DASは、永続的なデータの格納場所に対してトランザクションを開始し、データグラフを作成してトランザクションを終了する。
- DASは、リクエストがあったアプリケーションにデータグラフを渡す。
- アプリケーションは、データグラフに対して何かしらの処理を行う。
- アプリケーションは、DASにデータグラフの更新をリクエストする。
- DASは、新しいトランザクションを開始し、データグラフの変更点を元に永続化されているデータを更新し、トランザクションを終了する。
DataGraph
全てのデータグラフは、単一のルートDataObjectを持ちます。ルートDataObjectは、データグラフに含まれている全てのDataObjectを直接的または間接的に含んでいます。
あるデータグラフに含まれる全てのDataObjectが同じデータグラフ内のDataObjectだけを参照している場合、そのデータグラフは「closedなデータグラフ」と呼ばれます。データグラフは通常、closedです。
データグラフの構成要素
- ルートDataObject
- ルートDataObjectからcontainment propertyとして再帰的に横断できる全てのDataObject
closedなデータグラフはtreeを形成します。
データグラフは含まれているDataObjectを描写している図式を覚えています。また、DataObjectの変更を表すChangeSummaryを管理しています。
“data graph” と DataGraph
ようやくDataGraphにたどり着きました。
DataGraphは関連している複数のDataObjectをまとめる封筒のようなものです。
仕様書では”data graph”と”DataGraph”という記述が見られます。”data graph”と書かれている場合は、任意のDataObjectのセットを意味します。”DataGraph”と書かれている場合は、ある特定のDataGraphオブジェクトを意味します。日本語では”data graph”を”データグラフ”とし、”DataGraph”はそのまま”DataGraph”と書くのが良さそうです。
Open Content
DataObjectは2種類のプロパティを持つことができます。
- Typeを特定したプロパティ
- Typeを特定しないプロパティ
2の、Typeを特定しないプロパティをOpen Contentと呼びます。
Typeが特定されたDataObjectのプロパティは、getType().getProperties()メソッドでリストを取得します。
DataObjectは次のような場合にTypeを特定しないプロパティも持つことができます。
- XMLのオープンコンテントモデルを扱う場合
- 動的に生成されたプロパティを扱う場合
オープンコンテントプロパティは、Type.openの値がtrueの場合に使用可能です。DataObjectのコンセプトでも触れていますが、オープンコンテントプロパティは、getType().getProperties()で取得されるプロパティのリストには含まれません。getInstanceProperties()メソッドで取得します。
TypeとProperty
TypeとPropertyは、DataObject内部のメタデータAPIです。DataObjectのモデル、及びデータ型のモデルを内観するためのもの。
PropertyがDataObjectの値を保持しているので、DataObjectが直接Propertyを持っている印象がありますが、Propertyを持っているのは実はType。なので、DataObjectが持っているプロパティの一覧を取得するには、 getType().getProperties()メソッドを呼びます。
SDOとプログラミング言語、データモデリング言語のマッピング
Java、C++、UML、EMOFのクラス
- クラスはType
- 各フィールドはProperty
XML Schema
- 単純型と複合型はType
- 要素と属性はProperty
C言語の構造体
- 構造体はType
- 構造体の各フィールドはProperty
リレーショナルデータベース
- テーブルはType
- カラムはProperty
Sequence
If a DataObject’s Type is sequenced then getSequence() returns that Sequence, otherwise getSequence() returns null.
いきなりこんなことを言われても、sequencedだったら、という意味がよくわかりませんね。とりあえずSequenceの特徴を見てみましょう。DataObjectのコンセプトには
プロパティ内部、複数のプロパティ間の順序が保持されているJavaBeanと言うことができます。XMLのDOMに相当します。
と書いてあります。 これも、わかるような、わからないような。
ひとつずつ整理してみます。
- DataObjectの値はPropertyに割り当てられる。
- ひとつのPropertyは複数の値を持つことができる。「プロパティ内部の順序」というのは、ひとつのPropertyが持っている値の順序。
- 「複数のプロパティ間の順序」というのは、複数の値を持つ、複数のProperty間の順序。int型のプロパティ”numbers”と、文字列型プロパティ”letters”を持つDataObjectがあるとします。それぞれのプロパティは、複数の値を持っています。このDataObjectのSequenceに対して以下の操作を行った場合にどうなるかを考えてみましょう。
- numbersプロパティに1という値を追加
- “annotation text”という文字列をSequenceに追加
- lettersプロパティに”A”という値を追加
- numbersプロパティに2という値を追加
- lettersプロパティに”B”という値を追加
この場合、Sequenceに格納されている値を順番に読むと
{<numbers, 1>, <null, ”annotation text”>, <letters, ”A”>,<numbers, 2>, <letters, ”B”>}
となります。
numbersプロパティには{1, 2}、 lettersプロパティには{“A”, “B”}という値が格納されていますが、numbersプロパティとlettersプロパティを横断した順序はSequenceインタフェースを通してアクセスした場合のみ取得可能です。
Type Conversion
データ型を変換するコードを書くのはつまらない作業なので、DataObjectのType Conversionは便利かもしれません。
getterだけでなくsetterも用意されています。次のコードは、どちらも同じ結果を出力します。
private static void printDataObject(DataObject fireworks) {
System.out.println(fireworks.getString(“score”));
System.out.println(fireworks.getInt(“score”));fireworks.setInt(“score”, 100);
System.out.println(fireworks.getString(“score”));
System.out.println(fireworks.getInt(“score”));
}
private static void printDataObject(DataObject fireworks) {
System.out.println(fireworks.getString(“score”));
System.out.println(fireworks.getInt(“score”));fireworks.setString(“score”, “100″);
System.out.println(fireworks.getString(“score”));
System.out.println(fireworks.getInt(“score”));
}
単にDataObjectのset()メソッドを呼ぶ場合は自動的に型変換されません。set()の前にDataHelperのconvert()を呼ぶ必要があります。
dataObject.set(property, dataHelper.convert(property, value));
型変換テーブル
次の表のxが記入されている組み合わせの変換は、DataObjectまたはDataHelperでサポートされています。Xは入力と出力の型が同じことを意味しています。
DataObjectの値とProperty
DataObjectのコンセプトでも出てきたように、DataObjectの値はPropertyに割り当てられます。例えば、purchase order(注文)を表すDataObjectは、orderDateという名前のプロパティがあり、そこに2005-06-30という値が割り当てられるという感じ。
orderDateプロパティの値はDataObjectのget(“orderDate”)とset(“orderDate”)アクセッサを使ってアクセスします。PurchaseOrderインタフェースのコードが自動生成される場合は、getOrderDate()メソッド、setOrderDate()メソッドを使ってもアクセス可能です
DataObjectインタフェースからプロパティの値には、プロパティの名前、インデックス、またはPropertyオブジェクトを渡してアクセスします。名前は、単純なプロパティの名前や、XPathをベースにした名前を指定できます。
なんだかこの値のアクセス方法が、便利なのか不便なのか、よくわからなくなってきました。実際に何かアプリケーションを作ってみないと実感できないところでしょう。 また、Propertyオブジェクトを渡して値を得る、というのも私には馴染みのないスタイルです。もう少し使ってみてからまたレポートしたいと思います。
DataObject
SDOのDataObjectは、プログラムの中で扱うビジネスデータを保持するためのものです。データを”Property”として保持しています。DataObjectのインタフェースには、データにアクセスする一般的な方法(名前、インデックス、パスの指定など)が用意されていて、プログラミングが簡単になるように設計されています。
コンセプトは次の3つ。
- Basic
- Open
- Sequenced
Basic
JavaBeanのようなもの。フィールドを”Property”として保持しているイメージ。取得可能なPropertyのリストは、getType().getProperties()で取得でき、それぞれのPropertyの値はget(Property property)で取得します。プロパティ内部の順番は維持されますが、プロパティ間の順序は維持されません。
Open
追加のPropertyを持つことができるJavaBeanのようなもの。XMLのワイルドカードを含んだ内容に相当するものです。新しいPropertyを保持するためのMapを持ったJavaBeanに似ています。追加のプロパティは、getType().getProperties()で取得されるリストには含まれません。getInstanceProperties()で取得します。値はget(Property property)で取得します。プロパティの順序についてはBasicと同じです。
Sequenced
プロパティ内部、複数のプロパティ間の順序が保持されているJavaBeanと言うことができます。XMLのDOMに相当します。Sequenceインタフェースを通じてアクセスします。
※ OpenとSequencedのコンセプトは、個別でも、合わせても使うことができます。
SDO Java API
SDOのJava APIは、上図のような構成になっています。この図はService Data Objects For Java Specification (Version 2.1.0, November 2006)から取得したもの。ステレオタイプが付いてないけれど、全て<<interface>>です。
構成要素は次の3つ。
- インタフェース
- 軽量メタデータAPI
- ヘルパーインタフェース
インタフェース
- DataObject – A business data object.
- DataGraph – An envelope for a graph of DataObjects.
- ChangeSummary – Summary of changes to the DataObjects in a data graph.
- Sequence – A sequence of settings.
軽量メタデータAPI
- Type – The Type of a DataObject or Property.
- Property – A Property of a DataObject.
ヘルパーインタフェース
上図にはヘルパーインタフェースは書かれていません。
- DataFactory
- TypeHelper
- CopyHelper
- EqualityHelper
- XMLHelper
- XMLDocument
- XSDHelper
- DataHelper
- HelperProvider





