BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

アダプタの開発

 前 次 目次 索引 PDFで表示  

XML Toolkit

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

この章の内容は以下のとおりです。

 


Toolkit パッケージ

XML Toolkit は、主に 2 つの Java パッケージから構成されます。

これらのパッケージは、xmltoolkit.jar ファイル内にあり、WebLogic Integration のインストール時に、ADK と一緒にインストールされます。ここには、クラス、インタフェース、およびメソッドに関する詳細な Javadoc が格納されています。Javadoc を参照するには、次のディレクトリに移動してください。

WLI_HOME/docs/apidocs/index.html

この URL で、WLI_HOME のフォルダには、WebLogic Integration がインストールされています。

 


IDocument

com.bea.document.IDocument

IDocument は、W3C Document Object Model (DOM) と 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 を使用すると、簡単なコードでドキュメント内の情報をクエリおよび検索できます。

 


Schema Object Model (SOM)

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 スキーマ例

<スキーマ>
<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();
    // adding an  object to a SOMSchema defaults to 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-10 は、setMinOccurs()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 タイプの前で作成されています。このため、リストB-11 に示すコードを使用して、Items タイプ オブジェクトが利用可能になったら、参照を作成してタイプを設定する必要があります。

コードリスト B-11 品目タイプ オブジェクトが使用可能になった時点でのタイプの設定

poType_items.setType(itemType);

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

コードリスト 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 を参照してください。

WLI_HOME/docs/apidocs/com/bea/SOMSchema.html

isValid() の実装例

リストB-16 に、isValid() の実装例を示します。

コードリスト 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());
   }

 

ページの先頭 前 次