アダプタの開発

     前  次    目次     
ここから内容

XML ツールキット

BEA WebLogic Integration の ADK (Adapter Development Kit) に付属の XML ツールキットを使用すると、有効な XML ドキュメントを作成し、EIS からアダプタ側のアプリケーションに情報を送信できます。XML 操作に必要な処理の多くを 1 箇所に統合できるので、作業を軽減できます。

この節では、以下の内容を扱います。

 


ツールキットのパッケージ

XML ツールキットは、主に次の 2 つの Java パッケージで構成されます。

これらのパッケージは xmltoolkit.jar ファイル内にあり、WebLogic Integration のインストール時に ADK と共にインストールされます。ここには、クラス、インタフェース、およびメソッドに関する詳細な Javadoc が格納されています。

 


IDocument

com.bea.document.IDocument

IDocument は、W3C DOM (Document Object Model) と XPath インタフェースを XML ドキュメント内の要素に統合するコンテナです。この統合により、XPath 文字列を使用するだけで、IDocument オブジェクトをクエリおよび更新できます。XPath 文字列を使用すると、クエリする要素だけを指定し、そのクエリへの応答を返すことができるため、XML ドキュメント全体を解析して特定の情報を探す必要がなくなります。

たとえば、コード リスト B-1 に示す XML ドキュメントには、「Bob」という人物に関する記述が格納されています。

コード リスト B-1 XML の例
<Person name="Bob">
<Home squareFeet="2000"/>
<Family>
<Child name="Jimmy">
<Stats sex="male" hair="brown" eyes="blue"/>
</Child>
<Child name="Susie">
<Stats sex="female" hair="blonde" eyes="brown"/>
</Child>
</Family>
</Person>

ここで、<child> 要素から、「Jimmy」の髪の色を取得するとします。DOM を使用する場合、コード リスト B-2 に示すコードを使用する必要があります。

コード リスト B-2 DOM データ取得のサンプル
String strJimmysHairColor = null;
org.w3c.dom.Element root = doc.getDocumentElement();
if (root.getTagName().equals("Person") && root.getAttribute("name").
equals("Bob") {
org.w3c.dom.NodeList list = root.getElementsByTagName("Family"); if
(list.getLength() > 0) {
org.w3c.dom.Element family = (org.w3c.dom.Element)list.item(0);
org.w3c.dom.NodeList childList = family.getElementsByTagName ("Child");
for (int i=0; i < childList.getLength(); i++) {
org.w3c.dom.Element child = childList.item(i);
if (child.getAttribute("name").equals("Jimmy")) {
org.w3c.dom.NodeList statsList = child.
getElementsByTagName("Stats");
if (statsList.getLength() > 0) {
org.w3c.dom.Element stats = statsList.item(0);
strJimmysHairColor = stats.getAttribute("hair");
}
}
}
}
}

IDocument を使用すると、コード リスト B-3 に示す XPath 文字列を作成し、同じように「Jimmy」の髪の色を取得できます。

コード リスト B-3 IDocument データ取得のサンプル
System.out.println("Jimmy's hair color: " + person.getStringFrom
("//Person[@name=\"Bob\"] /Family/Child[@name=\"Jimmy\"]/Stats/@hair");

このように、IDocument を使用すると、ドキュメント内の情報をクエリおよび取得するコードを簡素化できます。

 


SOM (Schema Object Model)

SOM は、XML スキーマを構築するためのインタフェースです。アダプタによって、特定の要求メタデータや応答メタデータの EIS が呼び出されます。このメタデータは、プログラムで XML スキーマに変換する必要があります。SOM は、構文的に複雑なスキーマなどの詳細な一般 XML スキーマ情報を抽出し、有効性を検証するための一連のツールです。このツールを使用すると、XML ドキュメントのより基本的な部分の作業に専念できます。

SOM の仕組み

XML スキーマは、アダプタで接続している EIS とアダプタ側のアプリケーションとの間で、契約書のような役割を果たします。この契約書には、アプリケーションで操作するために、EIS のデータをどのように表示するかが定義されます。ドキュメント (XML で記述された EIS のメタデータの集合) は、スキーマで定義されたルールに準拠していれば、ドキュメントの XML コードが正しいかどうかに関係なく、有効とみなされます。たとえば、<name> 要素に名前を表示するスキーマを定義していて、この要素が <firstname><lastname> の 2 つの子要素を必要とする場合、EIS のドキュメントを有効にするには、このドキュメントをコード リスト B-4 に示すフォームで表示し、スキーマをコード リスト B-5 に示すように定義する必要があります。

コード リスト B-4 ドキュメントの例
<name>
<firstname>Joe</firstname>
<lastname>Smith</lastname>
</name>
コード リスト B-5 スキーマの例
<schema>
<element name="name">
<complexType>
<sequence>
<element name="firstname" />
<element name="lastname" />
</sequence>
</complexType>
</element>
</schema>

正しい XML コードとして作成されていても、<name></name> 以外のフォームは無効になります。たとえば、以下に示すフォームは無効です。

<name>Joe Smith</name>

スキーマの作成

SOM が提供するクラスおよびメソッドを使用して、プログラムで XML スキーマを作成できます。このツールを使用する利点は、プログラムに変数を入力するだけで、スキーマを要件に合わせて調整できることです。たとえば、以下のコード例により、発注書ドキュメントを検証するスキーマが作成されます。コード リスト B-6 によって、スキーマが設定されて必要な要素が追加されます。

コード リスト B-6 発注書のスキーマ
import com.bea.schema.*;
import com.bea.schema.type.SOMType;
public class PurchaseOrder
{
public static void main(String[] args)
{
System.out.println(getSchema().toString());
}
    public static SOMSchema getSchema()
{
SOMSchema po_schema = new SOMSchema();
    po_schema.addDocumentation("Purchase order schema for
Example.com.\nCopyright 2000 Example.com.\nAll rights
reserved.");
        SOMElement purchaseOrder =
po_schema.addElement("purchaseOrder");
        SOMElement comment = po_schema.addElement("comment");
        SOMComplexType usAddress =
po_schema.addComplexType("USAddress");
        SOMSequence seq2 = usAddress.addSequence();
    // SOMSchema にオブジェクトを追加して、type="string" とする
seq2.addElement("name");
seq2.addElement("street");
seq2.addElement("city");
seq2.addElement("state");
seq2.addElement("zip", SOMType.DECIMAL);

属性の設定は、コード リスト B-7 で示すように、要素の作成と同じように行うことができます。属性を正しく設定するには、アドレス指定を正確に記述する必要があります。

コード リスト B-7 親属性の設定
SOMAttribute country_attr = usAddress.addAttribute("country",
SOMType.NMTOKEN);
country_attr.setUse("fixed");
country_attr.setValue("US");

コード リスト B-8 で示すように、complexTypes と同様に、simpleTypes をスキーマのルートに追加できます。

コード リスト B-8 スキーマのルートへの SimpleTypes の追加
SOMSimpleType skuType = po_schema.addSimpleType("SKU");
SOMRestriction skuRestrict = skuType.addRestriction
(SOMType.STRING);
skuRestrict.setPattern("\\d{3}-[A-Z]{2}");
SOMComplexType poType =
po_schema.addComplexType("PurchaseOrderType");
purchaseOrder.setType(poType); 
poType.addAttribute("orderDate", SOMType.DATE);

SOMComplexType オブジェクトの addSequence() メソッドによって、SOMSequence 参照が返されるため、ユーザはそのスキーマに追加された要素を変更できます。コード リスト B-9 で示すように、このようにしてオブジェクトがスキーマに追加されます。

コード リスト B-9 要素を変更するための addSequence() の実装
SOMSequence poType_seq = poType.addSequence();
poType_seq.addElement("shipTo", usAddress);
poType_seq.addElement("billTo", usAddress);

スキーマ内の要素の属性を設定するには、SOMElement オブジェクトのセッター メソッドを呼び出します。たとえば、コード リスト B-10setMinOccurs()setMaxOccurs() の実装を示します。

コード リスト B-10 setMinOccurs() および setMaxOccurs() の実装
SOMElement commentRef = new SOMElement(comment);
commentRef.setMinOccurs(0);
poType_seq.add(commentRef);
SOMElement poType_items = poType_seq.addElement("items");
SOMComplexType itemType = po_schema.addComplexType("Items");
SOMSequence seq3 = itemType.addSequence();
SOMElement item = new SOMElement("item");
item.setMinOccurs(0);
item.setMaxOccurs(-1);
seq3.add(item);
SOMComplexType t = new SOMComplexType();
item.setType(t);
SOMSequence seq4 = t.addSequence();
seq4.addElement("productName");
SOMElement quantity = seq4.addElement("quantity");
SOMSimpleType st = new SOMSimpleType();
quantity.setType(st);
SOMRestriction restrict =
st.addRestriction(SOMType.POSITIVEINTEGER);
restrict.setMaxExclusive("100");

この例では、PurchaseOrderTypeitems 要素は、Items タイプの前に作成されています。このため、Items タイプ オブジェクトが利用可能になったら、コード リスト B-11 に示すコードを使用して、参照を作成してタイプを設定する必要があります。

コード リスト B-11 Items タイプ オブジェクトが使用可能になった場合のタイプの設定
poType_items.setType(itemType);

最後に、要素をスキーマに追加します。要素を追加するには、SOMSequenceaddElement() メソッド、または以前に作成した SOMElementadd() メソッドを実装します。この 2 つのメソッドをコード リスト B-12 に示します。

コード リスト B-12 スキーマへの要素の追加
seq4.addElement("USPrice", SOMType.DECIMAL);
    SOMElement commentRef2 = new SOMElement(comment);
commentRef2.setMinOccurs(0);
seq4.add(commentRef2);
    SOMElement shipDate = new SOMElement("shipDate", SOMType.DATE);
shipDate.setMinOccurs(0);
seq4.add(shipDate);
t.addAttribute("partNum", skuType);
    return po_schema;  
}
}

作成されるスキーマ

これまでに紹介した 7 つのリスト (コード リスト B-6 からコード リスト B-12) に示すコードを実行すると、コード リスト B-13 に示すスキーマが作成されます。

コード リスト B-13 XML スキーマ定義ドキュメント
<?xml version="1.0" ?>
<!DOCTYPE schema (View Source for full doctype...)>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/XMLSchema">
<xsd:annotation>
        <xsd:documentation>Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights
reserved.</xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType name="SKU">
<xsd:annotation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}" />
</xsd:restriction>
</xsd:simpleType>
    <xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element type="USAddress" name="shipTo" />
<xsd:element type="USAddress" name="billTo" />
<xsd:element ref="comment" minOccurs="0" />
<xsd:element type="Items" name="items" />
</xsd:sequence>
        <xsd:attribute name="orderDate" type="xsd:date" />
</xsd:complexType>
    <xsd:complexType name="Items">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="item"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element type="xsd:string"
name="productName"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base=
"xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element type="xsd:decimal" name=
"USPrice" />
<xsd:element ref="comment"
minOccurs="0" />
<xsd:element type="xsd:date"
name="shipDate" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="partNum" type="SKU" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
  <xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element type="xsd:string" name="name" />
<xsd:element type="xsd:string" name="street" />
<xsd:element type="xsd:string" name="city" />
<xsd:element type="xsd:string" name="state" />
<xsd:element type="xsd:number" name="zip" />
</xsd:sequence>
    <xsd:attribute name="country" use="fixed" value="US"
type="xsd:NMTOKEN" />
</xsd:complexType>
<xsd:element type="PurchaseOrderType" name="purchaseOrder" />
<xsd:element type="xsd:string" name="comment" />
</xsd:schema>

XML ドキュメントの検証

次に、コード リスト B-13 のスキーマを使用して、EIS から送信されたドキュメントを検証します。たとえば、コード リスト B-14 に示すドキュメントは、先ほど作成したスキーマに基づくスキーマの検証にパスします。

コード リスト B-14 検証対象の XML ドキュメント
<?xml version="1.0" ?>
<!DOCTYPE PurchaseOrder (View Source for full doctype...)>
<purchaseOrder orderDate="1/14/00">
<shipTo Country="US">
<name>Bob Jones</name>
<street>1000 S. 1st Street</street>
<city>Denver</city>
<state>CO</state>
<zip>80111</zip>
</shipTo>
<billTo Country="US">
<name>Bob Jones</name>
<street>1000 S. 1st Street</street>
<city>Denver</city>
<state>CO</state>
<zip>80111</zip>
</billTo>
<comment>None</comment>
<items>
<item partNum="123-AA">
<productName>Washer</productName>
<quantity>20</quantity>
<USPrice>0.22</USPrice>
<comment>Only shipped 10</comment>
<shipDate>1/14/00</shipDate>
</item>
<item partNum="123-BB">
<productName>Screw</productName>
<quantity>10</quantity>
<USPrice>0.30</USPrice>
<comment>None</comment>
<shipDate>1/14/00</shipDate>
</item>
</items>
</purchaseOrder>

ドキュメントの検証方法

SOM では、SOMSchema メソッドの isValid() を使用して、XML DOM ドキュメントを検証できます。SOMElement クラスには対応する isValid() メソッドがインクルードされ、DOM ドキュメントではなく要素が検証されます。

isValid() メソッドは、ドキュメントまたは要素が有効かどうかを検証し、無効の場合にはエラー リストを作成します。ドキュメントが有効な場合、isValid() は True を返し、エラー リストが空白になります。

isValid() の実装

コード リスト B-15 では、isValid() を実装する 2 つの方法を示します。

コード リスト B-15 isValid() の実装例
public boolean isValid(org.w3c.dom.Document doc, 
java.util.List errorList)
public boolean isValid(IDocument doc,
List errorList)

以下のパラメータを使用します。

このスキーマに基づいて、ドキュメントが有効であると判断されると、isValid() は True のブール値を返します。有効でないと判断されると、isValid() は False を返し、errorList が作成されます。

errorList は、doc ドキュメント内で検出されたエラーを報告するためのもので、java.util.List です。ドキュメントの検証前に、エラー リストはクリアされます。このため、使用するリスト実装が、clear() メソッドをサポートする必要があります。isValid() が False を返す場合、エラー リストには、検証プロシージャの実行中に検出されたエラーが入力されます。リスト内の項目は、クラス com.bea.schema.SOMValidationException のインスタンスです。isValid() が True を返す場合、errorList は空白になります。

API の詳細については、以下の URL の isValid() の Javadoc を参照してください。

http://edocs.bea.com/wli/docs92/wli.javadoc/

isValid() の実装のサンプル

isValid() の実装のサンプルをコード リスト B-16 に示します。

コード リスト B-16 isValid() の実装のサンプル
SOMSchema schema = ...;
IDocument doc = DocumentFactory.createDocument(new FileReader(f));
java.util.LinkedList errorList = new java.util.LinkedList();
boolean valid = schema.isValid(doc, errorList);...
if (! valid){
System.out.println("Document was invalid.Errors were:");
for (Iterator i = errorList.iterator; i.hasNext();)
{
       System.out.println(((SOMValidationException) i.next).
toString());
   }

  ページの先頭       前  次