クライアント アプリケーション開発者ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容

データ プログラミング モデルと更新フレームワーク

BEA AquaLogic Data Services Platform (ALDSP) では、データ クライアント アプリケーション プログラミング モデルとしてサービス データ オブジェクト (SDO) が実装されています。この章では、ALDSP クライアント アプリケーション開発者に役に立つ SDO コンセプトおよび API について説明します。

 


はじめに

SDO は、ソースと非接続型のデータ オブジェクトを操作するためのアーキテクチャおよび API のセットです。ALDSP では、SDO 準拠のデータ オブジェクトは、型付きデータ オブジェクトであるか、型なしデータ オブジェクトであるかにかかわらず、Mediator API またはデータ サービス コントロールを介してデータ サービスから取得されます。(「サービス データ オブジェクト (SDO) について」を参照してください。)

クライアント アプリケーションでは、必要に応じてビジネス プロセスのデータ オブジェクトが操作されると、基底のデータ ソースに伝播するために、変更されたオブジェクトがデータ サービスに送信されます。SDO 仕様では、データ オブジェクトを送受信できる Mediator サービス定義について定義されていませんが、一般的な必要性について説明しています。また、この仕様では、実装を指定せずに、データ ソースに対する更新を処理する必要性についても説明されています。SDO 仕様では、Mediator サービスの実装方法および Mediator サービスによるデータ オブジェクトの更新処理方法に関して、その詳細を開発者に委ねています。

Data Service Mediator API について」で説明されるように、ALDSP の Data Service Mediator は、クライアント アプリケーションとデータ サービスとの間での送受信を処理するだけでなく、あらゆるデータ サービスを構成するさまざまなデータ ソースの更新を円滑化します。

この章では、SDO データ プログラミング モデルの ALDSP の実装と、その更新フレームワークに関する情報を説明されます。

 


ALDSP および SDO

Data Service Mediator API を通じてデータ サービスの読み込みオペレーションを呼び出す場合は、データ オブジェクトが返されます。データ オブジェクトは、SDO データ プログラミング モデルの基本アーティファクトです。

ヒント : Mediator API の詳細については、「Java クライアントからのデータ サービスの呼び出し」を参照してください。

データ オブジェクトは複合型の内容を表します。データ オブジェクトには、プロパティが含まれています。このプロパティは、要素と属性を表します。プロパティは単純型または複合型のどちらかです。SDO では、単純型のプロパティはデータ型プロパティと呼ばれ、複合型のプロパティには、データ オブジェクト (これにもプロパティがある) が入っています。

変更サマリという特別なプロパティを含むように、データ オブジェクトを定義できます。データ オブジェクトの変更を追跡するには、変更サマリが使用されます。プロパティ (またはネストされた子孫データ オブジェクトのプロパティ) を変更すると、その変更が変更サマリに取り込まれます。

変更サマリは Mediator により使用され、それによって更新プランが派生し、最終的にデータ ソースが更新されます。更新関数が成功したかどうかにかかわらず、変更済みの各 SDO とともに送信された変更サマリはそのまま残るため、必要に応じてロールバックをサポートできます。

データグラフは、組み込みデータ オブジェクト型であり、変更サマリのプロパティを持つために定義されます。これにより、変更追跡をカプセル化するにはデータグラフは便利です。データグラフには、直接のデータ オブジェクトの子が 1 つとこのデータ オブジェクトの変更を追跡する変更サマリが 1 つあります。図 2-1 では、データグラフの構造を示します。

図 2-1 DataGraph の構造

DataGraph の構造

静的および動的データ オブジェクト API

SDO は、データ オブジェクトの静的 (型付き) および動的 (型なし) インタフェースの両方が指定されます。

動的データ オブジェクト API は、開発時にデプロイされていなかったデータ型と共に使用することができます。

表 2-2 では、各アプローチの利点の概要を示しています。

表 2-2 静的および動的データ オブジェクト API
データ モデル
利点...
静的データ オブジェクト API
  • 実装が容易なインタフェース。コードの読み込みと維持が容易。
  • コンパイル時の型チェック。
  • Data Services Studio でコードの完了が可能。
動的データ オブジェクト API
  • 動的。検出が可能。
  • 実行時の型チェック。
  • 汎用的なコーディング スタイルが可能。

静的データ オブジェクト API

SDO の静的データ オブジェクト API は、データ サービスの XML スキーマ定義から生成される型付き Java インタフェースです。このインタフェースは JAXB または XMLBean の静的インタフェースと似ています。JAR にパッケージ化されているインタフェース ファイルは、通常、データ サービスの開発者によって生成されます。

生成されたインタフェースでは、commonj.sdo.DataObject インタフェースが拡張され、XML データ型付きのすべてのプロパティに対して型付きゲッターおよびセッターが提供されます。

また、インタフェースが各複合プロパティに対して生成されます。(たとえば、図 2-3 に示される CREDIT および ORDER など)。生成には複合型を構成するそれぞれのプロパティのゲッターおよびセッターが使用されます。

多数の値を持つプロパティの場合、java.util.List オブジェクトを返す get メソッドが生成されます。多数の値を持つプロパティは 1 より大きな maxOccurs を持つ XML スキーマ要素に対応します。多数の値を持つプロパティの get メソッドで返されたリストは「live」です。これは、List オブジェクトを変更すると、その変更がすぐに含まれているデータ オブジェクトに反映されると意味します。

静的データ オブジェクト API の生成方法の例として、図 2-3 には、CUSTOMER データ型を指定しています。この例では、型付きクライアント インタフェースの結果は、CUSTOMER、CREDIT、ORDER、および POITEM インタフェースに生成されます。各インタフェースには、ゲッター、セッター、ファクトリ クラスが入っています。(静的データ オブジェクトおよびそのプロパティをインスタンス化するために)。

図 2-3 DSP コンソール メタデータ ブラウザに表示されている CUSTOMER 戻り値の型

DSP コンソール メタデータ ブラウザに表示されている CUSTOMER 戻り値の型

SDO の静的データ オブジェクト API を使用する Java クライアント アプリケーションを開発するときは、これらの型付きインタフェースを Java クライアント コードにインポートします。たとえば、

import appDataServices.AddressDocument;

表 2-4 では、静的データ アクセッサおよび関連する API メソッドが表示されています。これらのメソッドが、名前の最初の文字が大文字に設定されたスキーマ名と一致する名前で生成されます。生成された名前と標準 Java 命名ルールとの衝突は回避しなければいけません。

表 2-4 静的 (型付き) データ オブジェクト API ゲッターおよびセッター
静的データ オブジェクト API (生成済み)
説明
Type getPropertyName()
プロパティの値を返す。ブール値を持つプロパティに対して生成されます。
String name = getLAST_NAME()
List<Type> getPropertyName()
複数回出現する要素は、すべての PropertyName 要素を返す。
List<ORDER> orders = getORDER()
void setPropertyName(Type newValue)
プロパティの値を newValue に設定します。
setLAST_NAME("Smith")
boolean isPropertyName()
PropertyName 要素または属性がデータ オブジェクトに存在するかどうか示す。
isSPECIAL_DELIVERY()
void createPropertyName()
非データ型プロパティのみに対して生成されます。指定されたプロパティに対してデータ オブジェクトを作成します。(作成した) データ オブジェクトは、プロパティに値を入れないでを初期化されます。
createORDER()
boolean isSetPropertyName()
プロパティに値を設定されているかどうかを決定します。
isSetLAST_NAME()
void unsetPropertyName()
プロパティの設定を解除する。そのあと、プロパティは設定できないようになります。
unsetLAST_NAME()

XML スキーマと Java 型のマッピング参照

ALDSP クライアント アプリケーション開発者は、Data Services Platform Console を使用して、データ サービスと関連する XML スキーマ型を表示することができます。(「図 2-3、DSP コンソール メタデータ ブラウザに表示されている CUSTOMER 戻り値の型」を参照してください)。[戻り値の型] タブには、各要素のデータ型が示されます。たとえば、string、int、または complex type などです。XML スキーマ データ型は、表 2-5 に示すデータ型マッピングによって対応する Java 型にマップされます。

表 2-5 XML スキーマと Java データ型のマッピング
XML スキーマ型
SDO Java 型
XML スキーマ型
SDO Java 型
xs:anyType
commonj.sdo.DataObject
xs:integer
java.math.BigInteger
xs:anySimpleType
java.lang.Object
xs:language
String
xs:anyURI
String
xs:long
long または java.lang.Long
xs:base64Binary
byte[]
xs:Name
String
xs:boolean
boolean または java.lang.Boolean
xs:NCName
String
xs:byte
byte または java.lang.Byte
xs:negativeInteger
java.math.BigInteger
xs:date
String
xs:NMTOKEN
String
xs:dateTime
String
xs:NMTOKENS
List<String>
xs:decimal
java.math.BigDecimal
xs:nonNegativeInteger
java.math.BigInteger
xs:double
double または java.lang.Double
xs:nonPositiveInteger
java.math.BigInteger
xs:duration
String
xs:normalizedString
String
xs:ENTITIES
List<String>
xs:NOTATION
String
xs:ENTITY
String
xs:positiveInteger
java.math.BigInteger
xs:float
float または java.lang.Float
xs:QName
String
xs:gDay
String
xs:short
short または java.lang.Short
xs:gMonth
String
xs:string
String
xs:gMonthDay
String
xs:time
String
xs:gYear
String
xs:token
String
xs:gYearMonth
String
xs:unsignedByte
short または java.lang.Short
xs:hexBinary
byte[]
xs:unsignedInt
long または java.lang.Long
xs:ID
String
xs:unsignedLong
java.math.BigInteger
xs:IDREF
String
xs:unsignedShort
int または java.lang.Integer
xs:IDREFS
List<String>
xs:keyref
String
xs:int
int または java.lang.Integer
   

動的データ オブジェクト API

各静的 (型付き) データ オブジェクトはデータ オブジェクト インタフェースを実装します。そのため、DataObject (動的) メソッドも静的 API も使用できます。この API には、特定の Java データ型 (たとえば、String、Date、List、BigInteger、および BigDecimal など) のために汎用プロパティのゲッターおよびセッターが用意されています。表 2-6 では、SDO の動的データ オブジェクト API からの代表的な API を示します。propertyName 引数は、取得したり設定する値のプロパティ名を示しています。propertyValue は新しい値です。動的データ オブジェクト API は、indexValue により DataObject のプロパティを設定および取得するメソッドを含めます。これは、setInt( )、setDate( )、getString( )、などのプリミティブ型としてプロパティを取得するおよび設定するメソッドです。

たとえば、CUSTOMER データ オブジェクトの参照があるとすれば、動的データ オブジェクト API を使用して以下のような LAST_NAME プロパティを取得できます。

String lastName = customer.getString("LAST_NAME");

SDO API は標準の実装です。完全な SDO 仕様「Java 仕様 V2.1 の SDO」は以下で入手可能です。


http://www.osoa.org/display/Main/Service+Data+Objects+Specifications

dev2dev で「Service Data Objects」も参照してください。

表 2-6 に、動的データ オブジェクト API ゲッターおよびセッターを示します。

表 2-6 動的 (型なし) データ オブジェクト API ゲッターおよびセッター
動的データ オブジェクト API
説明
get(int PropertyIndex)
指定されたインデックスの PropertyName 子要素を返す。
get(5)
set(int PropertyIndex, Object newValue)
プロパティの値を newValue に設定します。
set(5, CUSTOMER3)
set(String PropertyName, Object newValue)
PropertyName の値を newValue に設定します。
set("LAST_NAME", "Nimble")
set(commonj.sdo.Property property, Object newValue)
プロパティ オブジェクトの値を newValue に設定します。
set(LASTNAME, "Nimble")
getType(String PropertyName)
PropertyName の値が返されます。Type は取得する特定のデータ型を示しています。
getBigDecimal("CreditScore")
unset(int PropertyIndex)
プロパティの設定を解除します。そのあと、プロパティは設定できないようになります。
unset(5)
unset(commonj.sdo.Property property)
プロパティの設定を解除します。そのあと、プロパティは設定できないようになります。
unset(LASTNAME)
unset(String PropertyName)
プロパティの設定を解除します。そのあと、プロパティは設定できないようになります。
unset("LAST_NAME")
createDataObject(commonj.
sdo.Property property)
指定された包含プロパティの新規 DataObject を返す。
createDataObject(LASTNAME)
createDataObject(String PropertyName)
指された包含プロパティの新規 DataObject を返す。
createDataObject("LAST_NAME")
createDataObject(int PropertyIndex)
指された包含プロパティの新規 DataObject を返す。
createDataObject(5)
createDataObject(String PropertyName, String namespaceURI, String typeName)
指された包含プロパティの新規 DataObject を返す。
createDataObject("LAST_NAME","http://namespaceURI_here", "String")
delete()
コンテナからオブジェクトを削除し、すべての書き込み可能なプロパティの設定を解除します。
delete(CUSTOMER)

動的データ オブジェクト API における XPath の式

ALDSP は、SDO パス式という XPath 式の限定されたサブセットをサポートします。SDO パス式によって、動的 データ オブジェクト API アクセサ内のデータ オブジェクトおよび属性を検索する方法に柔軟性がもたらされます。たとえば、データ要素および値に基づいて get( ) メソッドの呼び出し結果をフィルタできます。

	company.get("CUSTOMER[1]/POITEMS/ORDER[ORDERID=3546353]")

SDO パス実装は、ゼロベースの配列インデックス表記 (".index_from_0") を XPath の標準カッコ付き表記 ([n]) に追加することで、XPath 1.0 サポートより増強されたものになります。例として、表 2-7 では、XPath 標準表記と SDO 拡張表記を比較し、同じ要素である CUSTOER の下の最初の ORDER 子ノード (表 2-7) を参照しています。

表 2-7 XPath 標準表記と SDO 拡張表記
XPath 標準表記
SDO 拡張表記
get("CUSTOMER/ORDER[1]");
get("CUSTOMER/ORDER.0");

ゼロベースのインデックスは、ゼロベースのカウンタに慣れている Java プログラマにとっては便利なものであり、1 を追加せずにインデックス値としてカウンタ値を使用することもできます。

ADSP は、従来のインデックス表記と拡張表記の両方を完全にサポートしています。

ALDSP の XPath サポートに関する以下に挙げる点についても注意してください。

引数として XPath 式の指定」も参照してください。

データ オブジェクトに関する型情報の取得

動的データ オブジェクト API では、汎用的なデータ オブジェクトが返されます。データ オブジェクトのプロパティに関する情報を入手するには、SDO の Type インタフェースで使用可能なメソッドを使用します。(commonj.sdo パッケージ中にある) Type インタフェースには複数のメソッドが用意されており、データ オブジェクトの型、プロパティ、それぞれの型など、データ オブジェクトに関する情報を実行時に取得できます。

SDO 仕様による、Type インタフェース (表 2-8 を参照) および Property インタフェース (表 2-9 を参照) は、データ オブジェクトのモデルの内部検査に使用される最小のメタデータ API を構成します。たとえば、以下ではデータ オブジェクトの型を取得し、プロパティの値を出力します。

DataObject o = ...; 
Type type = o.getType();
if (type.getName().equals("CUSTOMER") {
System.out.println(o.getString("CUSTOMERNAME")); }

オブジェクトのデータ型を入手すると、(リストとして) すべてのプロパティを取得し、コード リスト 2-1 で示すように、Type インタフェースの get Properties( ) メソッドを使用してプロパティの値にアクセスできます。

コード リスト 2-1 SDO の Type インタフェースを使用したデータ オブジェクト プロパティの取得
public void printDataObject(DataObject dataObject, int indent) {
Type type = dataObject.getType();
List properties = type.getProperties();
for (int p=0, size=properties.size(); p < size; p++) {
if (dataObject.isSet(p)) {
Property property = (Property) properties.get(p);
// 多数の値を持つプロパティの場合、値のリストを処理する。
if (property.isMany()) {
List values = dataObject.getList(p);
for (int v=0; count=values.size(); v < count; v++) {
printValue(values.get(v), property, indent);
}
else { // 単一の値を持つプロパティの場合、値を出力する。
printValue(dataObject.get(p), property, indent);
}
}
}
}

表 2-8 に、Type インタフェースでのその他の有効なメソッドが表示されます。

表 2-8 Type インタフェースのメソッド
メソッド
説明
java.lang.Class getInstanceClass()
この型が表す Java クラスを返す。
java.lang.String getName()
型の名前を返す。
java.lang.List getProperties
この型のプロパティのリストを返す。
Property getProperty(
java.lang.String propertyName)
指定された型のすべての Property オブジェクトの中から、指定された名前の Property オブジェクトを 1 つ返す。たとえば、dataObject.get("name") または dataObject.get(dataObject.getType().getProperty("name"))
java.lang.String getURI()
この型のネームスペース URI を返す。
boolean isInstance(
java.lang.Object object)
指定されたオブジェクトがこの型のインスタンスであれば True を返し、それ以外の場合は false を返す。

表 2-9 に、Property インタフェースのメソッドを示します。

表 2-9 Property インタフェースのメソッド
メソッド
説明
Type getContainingType()
このプロパティを包含する型を返す。
java.lang.Object getDefault()
プロパティが設定されていないデータ オブジェクトで、このプロパティのデフォルト値を返す。
java.lang.String getName()
プロパティの名前を返す。
Type getType()
プロパティの型を返す。
boolean isContainment()
プロパティが by-value 構成を表していれば True を返す。
boolean isMany()
プロパティが many-valued であれば True を返す。

 


Mediator API および SDO の役割

ALDSP では、データ サービスとクライアント アプリケーションとの間でデータ オブジェクトが渡されます。たとえば、クライアント アプリケーションがデータ サービスで読み込み関数を呼び出すと、データ オブジェクトがクライアント アプリケーションに送信されます。クライアント アプリケーションにより (たとえば注文書に注文が追加されるなど) 適宜コンテンツが変更され、変更されたデータ オブジェクトがデータ サービスに送られます。Data Service Mediator とは、更新されたデータ オブジェクトを受信し、変更を基底のデータ ソースに伝播する API のことです。

Data Service Mediator とは更新プロセスの基軸です。他のアーティファクトとともに送信されたデータ オブジェクト (たとえば、変更サマリなど) からの情報を使用して、基底のデータ ソースを変更する更新プランを派生します。関連するデータ ソースに対して、更新は自動的に行われます。Mediator などの DSP の更新フレームワークを構成するアーティファクトおよびデフォルト プロセスが機能する方法については、『データ サービス開発者ガイド』の「更新マップの管理」章で説明しています。

Web サービス クライアントおよび Java クライアントの Mediator API の使い方の詳細については、以下を参照してください。


  ページの先頭       前  次