アプリケーション固有情報機能の使用

オブジェクト・レベルおよび属性レベルのアプリケーション固有情報 (ASI) を指定して、SOAP データ・ハンドラー機能を拡張および強化することができます。表 46 に、これらの属性を示します。各属性については、以下のセクションで説明します。表の項目はすべて、特に明記されていない限り、属性レベルの ASI です。

表 46. SOAP オブジェクト ASI の要約
ASI 指定可能な値 説明
soap_location SOAPHeader このビジネス・オブジェクト属性をヘッダー属性として指定します。
headerfault String 障害ビジネス・オブジェクト内の対応する SOAP ヘッダーの ビジネス・オブジェクト属性名を指定します。
elem_name String このビジネス・オブジェクト属性に対応する SOAP 要素の名前を指定します。
elem_ns String このビジネス・オブジェクト属性に対応する SOAP 要素のネーム・スペースを指定します。
type_name String このビジネス・オブジェクト属性に対応する SOAP 要素の型を指定します。
type_ns String このビジネス・オブジェクト属性に対応する要素の型ネーム・スペースを指定します。
xsdtype true このビジネス・オブジェクト属性に対応する要素の型ネーム・スペース として xsd を指定し、古いバージョンの xsd (1999、2000 など) を最新バージョンの xsd (2001 など) でオーバーライドします。
attr_name String このビジネス・オブジェクト属性に対応する SOAP 属性の名前を指定します。
attr_ns String このビジネス・オブジェクト属性に対応する SOAP 属性のネーム・スペースを指定します。
arrayof String 単純タイプ配列項目のプレースホルダーとして使用する必要のある、n カーディナリティー の子ビジネス・オブジェクト属性の名前を指定します。
dh_mimetype String この複合タイプの属性を変換するために使用される、データ・ハンドラー の mimeType を指定します。
cw_mo_* String このビジネス・オブジェクト・レベルの ASI では、SOAP データ・ハンドラー によって内容ではなくメタデータとして解釈される、子構成 MO の名前を指定します。メタデータとして処理される子構成 MO を指定する値は、cw_mo_soap のみです。それ以外のすべての cw_mo_* は、別のコンポーネントを表すため、SOAP データ・ハンドラーの処理対象から除外されます。他の cw_mo* はすべて無視されます。
cw_mo_soap String このビジネス・オブジェクト・レベルの ASI では、このビジネス・オブジェクトを変換するときに使用する必要のある、子構成 MO 属性の名前を指定します。
cw_mo_jms String このビジネス・オブジェクト・レベルの ASI では、使用する JMS プロトコル構成 MO の名前を指定します。
cw_mo_http String このビジネス・オブジェクト・レベルの ASI では、使用する HTTP プロトコル構成 MO の名前を指定します。
wrapper true このビジネス・オブジェクト内のラッパー・オブジェクトの 属性名を指定します。ラッパー・オブジェクトは特定のスキーマ標識で使用され、直列化してはなりません。
maxoccurs Integer このビジネス・オブジェクト属性について出現可能な、最大オカレンス件数を指定します。maxoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。
minoccurs Integer このビジネス・オブジェクト属性について可能な、最小オカレンス件数を指定します。minoccurs の値によって、ビジネス・オブジェクトにラッパーを含められる場合と、含められない場合があります。
all String スキーマの all 標識を表す子属性を指定します。
choice String スキーマの choice 標識を表す子属性を指定します。

ビジネス・オブジェクトから SOAP メッセージへの変換における ASI

SOAP データ・ハンドラーは、SOAP メッセージの構成方法を 決定するために、ビジネス・オブジェクトの ASI を使用します。別の指示が示されていないかぎり、以下のセクションで述べるすべての ASI は 属性レベルの ASI を表し、ストリング・ベースでの比較はすべて、大/小文字を 区別しないで行われます。

elem_name および elem_ns の処理

このセクションで示す例では、属性名が OrderId であって、SOAP 要素ネーム・スペース の接頭部が ns0 であると想定されています。

  1. elem_name も elem_ns も指定されていない場合、elem_name のデフォルト値としては属性名が使用され、elem_ns のデフォルト値としては要素の親のネーム・スペースが使用されます。ASI は指定されません。
    <OrderId>1</OrderId>
  2. elem_name が指定され、elem_ns が指定されていない場合、elem_name は ASI の elem_name 値 に設定され、elem_ns についてはデフォルト値として SOAP 本文のネーム・スペースが使用されます。ASI は以下のようになります。
    elem_name=CustOrderId
     <CustOrderId>2</CustOrderId>
  3. elem_ns が指定され、elem_name が指定されていない場合、elem_name についてはデフォルト値 として属性名が使用され、elem_ns は ASI の elem_ns 値に設定されます。xmlns 属性が明示的に書き込まれるのは、この要素のスコープ内における他のどの個所にも 要素ネーム・スペースが見付からない場合のみです。要素ネーム・スペースが検出された場合には、すでに定義されているネーム・スペースの接頭部 が使用されます。それ以外の場合 (要素ネーム・スペースが見付からない場合)、elem_ns のための 固有の接頭部が生成されます。次の例では、スコープ内で接頭部がすでに定義されているものと想定しています (ns1 は、この要素のスコープ内ですでに定義されているネーム・スペースに対応する接頭部を表します)。ASI は以下のようになります。
    elem_ns= http://www.w3.org/2001/XMLSchema
     <ns1:OrderId>3</ns1:OrderId>

    次の例では、接頭部が見付からない場合が想定されています (ns2 は固有の接頭部を表します)。ASI は以下のようになります。
    elem_ns=CustOrderIdNamespace
     <ns2:OrderId xmlns:ns2="CustOrderIdNamespace">3</ns2:OrderId>
  4. elem_name と elem_ns の両方が指定されている 場合、elem_name および elem_ns は、ASI の値に設定されます。すでに定義されているネーム・スペースに関しては、上記 3 の場合と同じ検査が行われます。3 の場合と同様に、ネーム・スペースがまだ定義されていない場合には、elem_ns のために 固有の接頭部が生成されます。ASI は以下のようになります。
    elem_name=CustOrderId;elem_ns=CustOrderIdNamespace
     <ns2:CustOrderId xmlns:ns2="CustOrderIdNamespace">1</ns2:OrderId>

単純属性の場合の type_name および type_ns の処理

このセクションの例では、属性名は OrderId、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは String になっています。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。

  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値 として単純タイプが使用され、type_ns のデフォルト値として、xml スキーマで定義された ネーム・スペース (xsd) が使用されます。ASI は指定されません。
    <OrderId xsi:type="xsd:string">1</OrderId>
  2. type_name が指定され、type_ns が指定されていない場合、type_name は ASI の type_name 値 に設定され、type_ns についてはデフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。
    type_name=CustString
     <OrderId xsi:type="ns0:CustString">2</OrderId>
  3. type_ns が指定され、type_name が指定されていない場合、type_ns のデフォルト値として 単純タイプ名が使用され、type_name は ASI の type_ns 値に設定されます。この接頭部は、elem_ns の作成に準じた方法で処理されます。要素スコープ内にその型ネーム・スペースがすでに存在している場合を除き、型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_ns=CustStringNamespace
     <OrderId xmlns:ns2="CustStringNamespace" xsi:type=
     "ns2:String">3</OrderId>
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_name=CustString;type_ns=CustStringNamespace
     <OrderId xmlns:ns2="CustStringNamespace" xsi:type=
     "ns2:CustString">1</OrderId>

単一カーディナリティー属性の場合の type_name および type_ns の処理

このセクションの例では、属性名は OrderStaus、SOAP 要素ネーム・スペースの接頭部は ns0、そして属性タイプは OrderStatus になっています。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。

  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値 としてビジネス・オブジェクト名が使用され、型ネーム・スペースのデフォルト値として 要素のネーム・スペースが使用されます。ASI は指定されません。
    <OrderStatus  xsi:type="ns0:OrderStatus">1</OrderStatus>
  2. type_name が指定され、type_ns が指定されていない場合、type_name は 割り当てられた ASI の値に設定され、type_ns については、デフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。
    type_name=CustOrderStatus
     <OrderStatus  xsi:type="ns0:CustOrderStatus">1</OrderStatus>
  3. type_ns が指定され、type_name が指定されていない場合、type_name のデフォルト値として ビジネス・オブジェクト名が使用され、type_ns は割り当てられた type_ns 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_ns=CustTypeNS
     <OrderStatus  xsi:type="ns2:SOAP_OrderStatusLine
     " xmlns:ns2="CustTypeNS">1</OrderStatus>
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_name=CustOrderStatus;type_ns=CustTypeNS
     <OrderStatus  
     xsi:type="ns2:CustOrderStatus" xmlns:ns2="CustTypeNS">1</OrderStatus>

複数カーディナリティー属性の場合の type_name および type_ns の処理

このセクションで示すすべての例では、属性名が MultiLines であって、SOAP 要素ネーム・スペース の接頭部が ns0 であると想定されています。属性タイプは OrderStatus であるものとします。

注:
type_name および type_ns の処理は、構成 MO の属性 TypeInfo が true になっている場合にのみ行われます。

  1. type_name も type_ns も指定されていない場合、type_name のデフォルト値 としてビジネス・オブジェクト名が使用され、type_ns のデフォルト値として 要素のネーム・スペースが使用されます。ASI は以下のようになります。
    <MultiLines SOAP-ENC:arrayType="ns0:OrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xsi:type="SOAP-ENC:Array">
  2. type_name が指定され、type_ns が指定されていない場合、type_name は、割り当てられた ASI の type_name 値に設定され、type_ns については、デフォルト値として要素のネーム・スペースが使用されます。ASI は以下のようになります。
    type_name=CustOrderStatus
     <MultiLines SOAP-ENC:arrayType="ns0:CustOrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xsi:type="SOAP-ENC:Array">
  3. type_ns が指定され、type_name が指定されていない場合、type_name のデフォルト値として ビジネス・オブジェクト名が使用され、type_ns は、割り当てられた ASI の type_ns 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_ns=CustTypeNS
     <MultiLines SOAP-ENC:arrayType="ns2:OrderStatus[2]" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/
     " xmlns:ns2="CustTypeNS" xsi:type="SOAP-ENC:Array">
  4. type_name と type_ns の両方が指定されている場合、これらは、割り当てられた ASI 値に設定されます。型ネーム・スペースのために固有の接頭部が生成されます。ASI は以下のようになります。
    type_name=CustOrderStatus;type_ns=CustTypeNS
     <MultiLines SOAP-ENC:arrayType="ns2:CustOrderStatus[2
     ]" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:ns2="CustTypeNS" xsi:type="SOAP-ENC:Array">

注:
各 Array 要素の親を表す項目要素の型およびネーム・スペースは、arrayType と同じです。

単純型、単一カーディナリティー型、および複数カーディナリティー型の場合の xsdtype

単純型、単一カーディナリティー型、および複数カーディナリティー型の場合、型名が SOAP メッセージの現行 XSD に従うときには、xsdtype ASI 属性を true に 設定してください。xsdtype プロパティーが読み取られるのは、type_name と type_ns の両方の プロパティーが設定されている場合のみです。type_name および type_ns が指定された場合、SOAP データ・ハンドラーは、最初に、SOAP API を使用してそれらのペアを Java 型にマップすることを試みます。データ・ハンドラーは、その後で、SOAP メッセージのための現行 XSD を使用して、Java 型 を SOAP 要素型に変換することを試みます。例えば、現行 XSD が以下のとおりであって

http://www.w3.org/2001/XMLSchema

ASI が以下のとおりである場合、

type_name=timeInstant;type_ns=http://www.w3.org/1999/XMLSchema;xsdtype=true

SOAP メッセージ型名は次のように書かれます。

<OrderDate xsi:type="xsd:dateTime">

これは、2001 XSD における dateTime が、1999 XSD における timeInstant と 同等であるためです。

xsdtype および単純型の配列

複数カーディナリティー・オブジェクトの場合、次のような単純型の配列を作成することができます。

<MultiLines SOAP-ENC:arrayType="xsd:string[4]" 
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
 xsi:type="SOAP-ENC:Array">

そのためには、type_name プロパティーを、希望する単純型 (例えば、string) に 設定し、type_ns プロパティーを適切な XSD 仕様に設定してください。その後で、xsdtype プロパティーを true に設定して、この型が現行の XSD 型に変換されるようにしてください。最後に、arrayOf プロパティーを、単純型値を保持すべきコンテナー内の属性の名前に設定する必要があります。ストリング配列の場合の ASI の例を次に示します。

arrayof=size;type_name=string;type_ns=http://www.w3.org/2001/XMLSchema;xsdtype=true

障害処理における ASI の効果

faultcode、faultactor、faultstring、および detail の各要素は、以下の規則に従います。

  1. これらの属性における elem_name、elem_ns、type_name、および type_ns ASI は無視されます。
  2. detail 要素のすべての子は、本文処理の説明で述べたとおりに書かれます。

ヘッダー処理における ASI の効果

ヘッダーの子オブジェクトのレベルおよびそれ以下では、すべての ASI プロパティー (表 46 を参照) を使用することができます。

SOAP 属性の指定

単純タイプの場合の attr_name の処理

simpleContent 拡張または制限を持つ complexTypes が値と属性の両方を持っている XML スキーマの事例があります。例えば、次の SOAP タグがあるとします。

<size system="us">10</size>

これは、次のスキーマに基づいています。

<complexType name="SizeType">
    <simpleContent>
        <extension base="int">
           <attribute name="system" type="string"/>
        </extension>
    </simpleContent>
 </complexType>
 <element name="size" type="ns:SizeType"/>
 

複合タイプに対応する、単純コンテント拡張または制限を持つビジネス・オブジェクトは、複合タイプ属性に対応するその他の属性に加えて、1 つの追加属性を持っていなければなりません。追加属性は、単純コンテント値 (前述の例の場合は要素サイズの値 10) を持っていなければなりません。このような複合タイプに対応するビジネス・オブジェクトをタイプとして持っているビジネス・オブジェクト属性は、属性レベル ASI として elem_value=simpleContentValue を持ちます。

図 45 は、対応するビジネス・オブジェクトを示しています。

図 45. 単純タイプの attr_name ビジネス・オブジェクト

単一カーディナリティー型および複数カーディナリティー型の場合の attr_name の処理

ビジネス・オブジェクト属性を SOAP 要素ではなく SOAP 属性に変換する ASI を 指定することができます。データ・ハンドラーは、単一および n カーディナリティーの複合タイプに対してのみ SOAP 属性の追加をサポートしています。次の例について考えてみましょう。

<CustInfo City="4" State="5" Street="2" Zip="6">
    <Name xsi:type="xsd:string">1</Name>
    <Street2 xsi:type="xsd:string">3</Street2>
 </CustInfo>

このビジネス・オブジェクト定義構造 (図 46 の各属性の右側に属性レベル ASI が指定されています) の場合、データ・ハンドラーは以下の処理ステップに従います。

図 46. attr_name ビジネス・オブジェクト

  1. データ・ハンドラーは、複合属性全体を探索する際に、まず、この複合ビジネス・オブジェクト属性に対応するタグを生成します。この例では、CustInfo が複合ビジネス・オブジェクト属性を表します。
  2. データ・ハンドラーは、複合ビジネス・オブジェクトの複数の子について繰り返し処理を行います。属性を作成する際に考慮されるのは、単純型属性のみです。ある単純型の ASI プロパティーの名前が attr_name である場合、データ・ハンドラーはこの単純型を SOAP 要素の属性として記述します。この例では、要素 (CustInfo) には Street、City、State、および Zip の 4 つの属性があります。
  3. ビジネス・オブジェクトのそれ以外の属性は、標準的な BODY 処理を使用して記述されます。これはつまり、関係のあるすべての ASI が、attr_name ASI を持たないビジネス・オブジェクト属性に対しても評価されるということです。

複数カーディナリティー型を処理する際のロジックは、単一カーディナリティー型を処理するロジックと同じです。具体的には、それぞれの <item> タグは複数カーディナリティー・オブジェクトにおける各ビジネス・オブジェクト・インスタンスに対応し、ASI を使用して処理されます。例えば、この複数カーディナリティー・ビジネス・オブジェクト定義構造に、対応する ASI があるとします。

図 47. attr_name 複数カーディナリティー・ビジネス・オブジェクト

データ・ハンドラーに送られたイベントに、この複数カーディナリティー・オブジェクトのインスタンスが 2 つ含まれている場合、次のような SOAP メッセージが作成されます。

<CustInfo>
    <item City="Armonk" Street="Main Street">
       <Name>IBM</Name>
       <Street2>None</Street2>
    </item>
    <item City="Burlingame" State="Ca" Street="577 Airport Blvd" Zip="94010">
       <Name>Burlingame Labs</Name>
       <Street2>Suite 600</Street2>
    </item>
 </CustInfo>

item タグが複合要素型として扱われることに注意してください。ビジネス・オブジェクト定義に含まれている属性は、対応する item タグの SOAP 属性になります。

単純タイプ配列の arrayof 処理

arrayof ASI プロパティーは、SOAP でエンコードされた単純タイプ配列の場合にのみ使用してください。例えば、次のような直列化があるとします。

<CustomerNames SOAP-ENC:arrayType="xsd:string[4]" xmlns:SOAP-ENC=
 "http://schemas.xmlsoap.org/soap/encoding/" xsi:type="SOAP-ENC:Array">
 <item xsi:type="xsd:string">value1</item>
 <item xsi:type="xsd:string">value2</item>
 <item xsi:type="xsd:string">value3</item>
 <item xsi:type="xsd:string">value4</item>
 </CustomerNames>
 

これは、図 48 に示すようなビジネス・オブジェクト定義を必要とします。

図 48. arrayof ビジネス・オブジェクト

(わかりやすいように、ビジネス・オブジェクトは要求レベルから示します。)

注:
ここには示されていませんが、ビジネス・オブジェクト構造から前述の SOAP 直列化を派生させるために、この例の SOAP 構成 MO の TypeInfo プロパティーを true に設定する必要があります。

また、arrayof プロパティーを使用して、item 以外の名前の配列項目を作成できます。前述の例を使用する際、ビジネス・オブジェクト属性名および「arrayof」 ASI プロパティー値の両方が name である場合は、<item> タグを <name> タグに置き換えることができます。この場合、直列化は次のようになります。

<CustomerNames SOAP-ENC:arrayType="xsd:string[4]" 
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
 xsi:type="SOAP-ENC:Array">
 <name xsi:type="xsd:string">value1</name>
 <name xsi:type="xsd:string">value2</name>
 <name xsi:type="xsd:string">value3</name>
 <name xsi:type="xsd:string">value4</name>
 </CustomerNames>
 

attr_name および attr_ns の処理

作成される SOAP 属性に対応したネーム・スペースを指定することをお勧めします。そのためには、単純型の場合には ASI プロパティー attr_ns を指定します。データ・ハンドラーが attr_ns プロパティーを処理するのは、同じ属性の ASI に attr_name が存在する場合のみです。attr_name および attr_ns には、以下の規則が適用されます。

  1. attr_name も attr_ns も設定されていない場合には、ビジネス・オブジェクト属性は SOAP 要素に変換されます。
  2. attr_name のみが設定されている場合には、SOAP 属性のネーム・スペースのデフォルト値として、その要素のネーム・スペースが使用されます。
    <CustInfo Street="577 Airport"></CustomerInfo>
  3. attr_ns のみが設定されている場合には、このプロパティーは無視され、ビジネス・オブジェクト属性は SOAP 要素に変換されます。
  4. attr_name と attr_ns の両方が設定されている場合には、次のような SOAP 属性が作成されます。
    <CustInfo ns2:Street="577 Airport" xmlns:ns2=
     "AttrNS"></CustomerInfo>

dh_mimetype: データ・ハンドラーの呼び出し

SOAP データ・ハンドラーを使用して別のデータ・ハンドラーを呼び出し、ビジネス・オブジェクトを、対応するデータ・ハンドラーが存在する任意の形式に書き出すことができます。これは、SOAP 子ビジネス・オブジェクトを SOAP ストリングに変換 するときに、エンコードされたテキストを SOAP メッセージに追加することによって行います。

SOAP 要素の値をエンコードすることのできるフォーマットの 1 つに、RNIF 文書があります。この機能を使用するためには、任意のレベルの SOAP 子ビジネス・オブジェクト に RNIF BO を追加してください。この RNIF ビジネス・オブジェクトをストリングに変換するときに別のデータ・ハンドラー を呼び出すように SOAP データ・ハンドラーに通知するためには、その属性の ASI に dh_mimetype プロパティーを追加します。ASI プロパティー dh_mimetype の値は、MO_DataHandler_Default メタオブジェクト で指定された適格な mimeType でなければなりません。この mimeType は、ビジネス・オブジェクトを処理するために 呼び出すデータ・ハンドラーを判別するために使用されます。

図 49 に示す SOAP 子ビジネス・オブジェクトでは、CustomerInfo は複合子であり、RNET_Pip3A2PriceAndAvailabilityQuery は RNIF ビジネス・オブジェクトになっています。

図 49. dh_mimetype を有する RNIF ビジネス・オブジェクト

このビジネス・オブジェクトから作成される SOAP メッセージは、次のようになります。

<CustomerInfo>
 <Name>IBM Corporation</Name>
 <CustID>95626</CustID>
 <RNIFexample
 xsi:type="xsd:base64Binary">1AWERYER238W98EYR9238728374871892787ASRJK23423
 JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJK234
 34JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJK2
 4234JKAWERJ234AWERIJHI423488R4HASF1AWERYER238W98EYR9238728374871892787ASRJ
 234234JKAWERJ234AWERIJHI423488R4HASFWR234
 </RNIFexample>
 </CustomerInfo>

RNIF サンプル要素には RNIF エンコード・ストリングが含まれていますが、これは、その要素値としてエンコードされた base64 バイナリーだったものです。また、ASI プロパティー elem_name、elem_ns、type_name、type_ns、および xsdtype は、このビジネス・オブジェクト属性との関係を維持します。この例では、メッセージが作成されると、指定された elem_name が SOAP 要素 の名前になります。

注:
呼び出し先のデータ・ハンドラーによって戻される要素値がエンコード・テキスト である場合には、type_name プロパティーは base64Binary に 設定されていなければならず、type_ns は xsd ネーム・スペースに対応していなければならず、また xsdtype は true に設定されていなければなりません。
xsd:base64Binary

type_name および type_ns を xsd:base64Binary に解決されるように 設定すると、SOAP データ・ハンドラーは、対応する要素の値を設定する前に、ビジネス・オブジェクトから得られた値をエンコードします。データ・ハンドラーは Apache API を使用してレジストリーに対して base64Binary シリアライザー の照会を行い、呼び出し先データ・ハンドラーから戻されたストリングをシリアライズし、要素の値を設定します。

スキーマ complexType の標識

以下のセクションでは、スキーマ complexType の標識がビジネス・オブジェクトに 与える影響について説明します。標識には以下のものがあります。

単純タイプの場合の maxOccurs および minOccurs 標識

maxOccurs 標識は、1 つの複合タイプの中である要素が出現することのできる、最大回数を表します。 minOccurs 標識は、1 つの複合タイプの中である要素が出現する必要のある、最小回数を表します。

次のスキーマを検討してください。

<xs:element name="Address" type="Address">
 <xs:complexType name="Address">
      <xs:sequence>
         <xs:element name="AddressLine" type="xsd:string" maxOccurs="10"/>
         <xs:element name="SuiteNumber" type="xsd:string" minOccurs="3"
                              maxoccurs="unbounded"/>
      <xs:element name="City" type="xsd:string"/>
   </xs:sequence>
   </xs:complexType>
 </xs:element>

上の例では、Address 要素内で AddressLine 要素が最大 10 回 出現することができ、SuiteNumber 要素が少なくとも 3 回出現することを示しています。このスキーマに対応するビジネス・オブジェクトでは、次の ASI を備えた それぞれの maxoccurs/minoccurs 標識ごとに、N カーディナリティーのラッパー・オブジェクト が 1 つ存在しなければなりません。

maxOccurs=N;wrapper=true

または

minOccurs=3;wrapper=true;

wrapper=true ASI は、このオブジェクトがラッパーであること、およびその理由から、SOAP メッセージに明示的に書き込まれないことを示しています。明示的な書き込みが行われないため、このラッパー・オブジェクトには、単純型の子が 1 つ存在しなければなりません。実行時に SOAP からビジネス・オブジェクトへの変換を行うために、データ・ハンドラーは、ラッパーの子オブジェクトを N 個読み取り、それぞれの子オブジェクトごとに対応する要素を作成します。ビジネス・オブジェクトから SOAP メッセージへの変換を行う際には、データ・ハンドラーは、検出されたそれぞれの要素ごとに、N カーディナリティー・ラッパー 内に子オブジェクトを作成します。

これに対応する SOAP ビジネス・オブジェクトは、図 50 のようなものとなります。

図 50. SOAP ビジネス・オブジェクトにおける単純タイプ ASI の minOccurs および maxOccurs

図 50 に示したビジネス・オブジェクトに 対応する SOAP メッセージは、次のようになります。

<Address xsi:type="ns0:Address">
     <AddressLine xsi:type="xsd:string">Line1</AddressLine>
     <AddressLine xsi:type="xsd:string">Line2</AddressLine>
     <SuiteNumber xsi:type="xsd:string">600</SuiteNumber>
     <SuiteNumber xsi:type="xsd:string">650</SuiteNumber>
     <SuiteNumber xsi:type="xsd:string">700</SuiteNumber>
   <City xsi:type="xsd:string">San Francisco</City>
 </Address>

注:
SOAP データ・ハンドラーは、maxOccurs 標識を処理する 場合にも minOccurs 標識を処理する場合にも、要素の最大および最小出現回数を検証しません。データ・ハンドラーは、maxOccurs および minOccurs 標識を備えた特定の要素 の複数のインスタンスを保持するためのコンテナー構造を提供するだけです。この方法は、単純タイプおよび複合タイプに適用されます。
複合タイプの場合の maxOccurs および minOccurs 標識

<maxOccurs> 標識は、1 つの複合タイプの中である要素が出現することのできる、最大回数を表します。<minOccurs> 標識は、1 つの複合タイプの中である要素が出現する必要のある、最小回数を表します。次のスキーマにおける maxOccurs 標識について検討してください。

<xs:element name="Address" type="Address">
 <xs:complexType name="Address">
      <xs:sequence>
      <xs:element name="AddressInfo" type="AddressInfo" maxOccurs="3"/>
      <xs:element name="City" type="xsd:string"/>
   </xs:sequence>
   </xs:complexType>
 </xs:element>
 
 <xs:complexType name="AddressInfo">
      <xs:sequence>
      <xs:element name="StreetLine" type="xsd:string"/>
      </xs:sequence>
   </xs:complexType>
 </xs:element>

上の例では、Address 要素内で AddressInfo 複合タイプ要素が最大 3 回 出現することができることを示しています。このスキーマに対応するビジネス・オブジェクトには、ラッパー・オブジェクトが ありません。complexType の AddressInfo 自体が N カーディナリティー の要素になりうるためです。N カーディナリティーの属性には、maxoccurs=3 という ASI が含められます。

図 51 は、これに対応する SOAP ビジネス・オブジェクトを示しています。

図 51. SOAP ビジネス・オブジェクトにおける複合タイプ ASI の minOccurs および maxOccurs

図 51 に示したビジネス・オブジェクトに 対応する SOAP メッセージは、次のようになります。

<Address xsi:type="ns0:Address">
      <AddressInfo xsi:type="ns0:AddressInfo">
         <StreetLine xsi:type="xsd:string">100 Market St.</ StreetLine>
         <StreetLine xsi:type="xsd:string">Apt 15</ StreetLine>
      </AddressInfo>
   <City xsi:type="xsd:string">San Francisco</City>
 </Address>
all 標識

all 標識は、デフォルトでは、この complexType に関する 子要素を任意の順序で指定できること、およびそれぞれの子要素がゼロまたは 1 回出現しなければ ならないことを指定します。次のスキーマについて考えてみましょう。

<complexType name="Item">
      <all>
         <element name="quantity" type="xsd:int"/>
         <element name="product" type="xsd:string"/>
      </all>
 </complexType>

上記の例は、SOAP メッセージ内で要素 quantity および product を 任意の順序で表示できることを示しています。quantity 要素を最初に表示して、product 要素を 2 番目に 表示することも、逆の順序で表示することもできます。

図 52 は、このスキーマに対応する ビジネス・オブジェクトを表しています。

図 52. SOAP ビジネス・オブジェクトにおける all 標識 ASI

対応する SOAP メッセージは次のようになります。

<Item xsi:type="ns0:Item">
     <quantity xsi:type="xsd:string">12</quantity>
     <product xsi:type="xsd:string">2</product>
 </Item>
「all」コンテント・モデルを持つ配列コンテントの処理

このセクションで説明するように、SOAP データ・ハンドラーは、「all」コンテント・モデルを持つ複合タイプ配列コンテントを処理します。例では、ArrayOfSOAPStruct が、「all」コンテント・モデルを持つ SOAPStruct を含んでいます。

<complexType name="SOAPStruct">
        <all>
        <element name="varString" type="string" />
        <element name="varInt" type="int" />
        <element name="varFloat" type="float" />
        </all>
 </complexType>
 <complexType   name ="ArrayOfSOAPStruct'">
   <complexContent>
    <restriction base='SOAP-ENC:Array'>
     <attribute ref='SOAP-ENC:arrayType'
      wsdl:arrayType='typens:SOAPStruct[]'/>
    </restriction>
   </complexContent>
  </complexType>

SOAP データ・ハンドラーは、直列化時に次の SOAP データを生成しなければなりません。

<?xml version='1.0' encoding='UTF-8'?>
 <SOAP-ENV:Envelope
         xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <SOAP-ENV:Body>
  <ns0:echoStructArray xmlns:ns0="http://soapinterop.org/">
   <inputStructArray SOAP-ENC:arrayType="ns1:SOAPStruct[2]"
            xmlns:ns1="http://soapinterop.org/xsd" xsi:type="SOAP-ENC:Array">
       <item>
                    <ns1:varFloat xsi:type="xsd:string">1.1</ns1:varFloat>
                    <ns1:varInt xsi:type="xsd:string">1</ns1:varInt>
            <ns1:varString xsi:type="xsd:string">hi</ns1:varString>
       <item>
       <item>
            <ns1:varString xsi:type="xsd:string">hello</ns1:varString>
            <ns1:varInt xsi:type="xsd:string">1</ns1:varInt>
            <ns1:varFloat xsi:type="xsd:string">1.1</ns1:varFloat>
          </item>
      </inputStructArray>
     </ns0:echoStructArray>
   </SOAP-ENV:Body>
     </SOAP-ENV:Envelope>

この例において、echoStructArray は操作の名前であり、inputStructArray はタイプ ArrayOfSOAPStruct を持つパラメーター名です。

sequence 標識

sequence 標識は、子要素が、complexType で指定されたとおりの順序で 現れなければならないことを示します。

<complexType name="Item">
      <sequence>
         <element name="quantity" type="int"/>
         <element name="product" type="string"/>
      </sequence>
 </complexType>

SOAP データ・ハンドラーは、この標識のための特別な ASI または ラッパー・オブジェクトを必要としません。デフォルトでは、データ・ハンドラーは、ビジネス・オブジェクトで指定されたとおりの 順序で SOAP 要素の読み取りおよび書き込みを行います。

choice 標識

choice 標識は、complexType 内の要素のうちの 1 つだけを SOAP メッセージ に含めることができることを示します。次のスキーマについて考えてみましょう。

<complexType name="Item">
     <choice>
         <element name="quantity" type="int"/>
         <element name="product" type="string"/>
     </choice>
 </complexType>

SOAP データ・ハンドラーは、この標識のための特別な ASI または ラッパー・オブジェクトを必要としません。ビジネス・オブジェクトを SOAP メッセージに変換するときに、データ・ハンドラーは処理を中断し、SOAP メッセージにどの要素を含めるのかを ユーザーが選択できるようにします。SOAP メッセージをビジネス・オブジェクトに変換するときには、データ・ハンドラーは既存の要素を読み取り、それに対応する属性を取り込みます。

sequence、choice、group、および all における maxOccurs 標識

モデル・グループ (sequence、choice、group、および all) は、minOccurs 属性と maxOccurs 属性を持っています。minOccurs および maxOccurs のデフォルト値は 1 です。all グループの場合、maxOccurs は値 1 のみを取ることができます。WSDL ODA および SOAP データ・ハンドラーは、sequence、choice、および group に対するすべての指定可能な maxOccurs の値をサポートします。

SOAP からビジネス・オブジェクトへの変換における ASI

SOAP データ・ハンドラーは、着信 SOAP メッセージを読み取って 検証するために、ビジネス・オブジェクトの ASI を使用します。SOAP データ・ハンドラーによる ASI の検証には、以下の規則が適用されます。

注:
別の指示が示されていないかぎり、以下のセクションで述べるすべての ASI は 属性レベルの ASI です。

elem_name の検証

単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下の規則が適用されます。

  1. SOAP メッセージの構文解析中に要素が検出された場合、データ・ハンドラーは 最初にビジネス・オブジェクト・レベルのすべての ASI を検索し、その要素の名前と elem_name 値の突き合わせを行います。
  2. 要素の名前と elem_name 値が一致しない場合、データ・ハンドラーは、要素の名前を、そのビジネス・オブジェクト・レベルのそれぞれの属性名と突き合わせます。
  3. どちらの検索も成功しなかった場合、データ・ハンドラーは失敗します。

elem_ns の検証

単純、カーディナリティー 1、およびカーディナリティー n の属性の検証には、以下のケースが当てはまります。

  1. elem_ns ASI も、この要素に関する SOAP メッセージから得られる xmlns も 存在しない場合、この要素が適切に検証されます。
  2. elem_ns ASI が存在せず、それに対応する SOAP メッセージ内の要素 で xmlns が指定されている場合、データ・ハンドラーはデフォルトの elem_ns として、ビジネス・オブジェクトから最後に読み取った、スコープ内にある elem_ns を使用します。データ・ハンドラーはこの値を、SOAP メッセージから得られた xmlns と比較します。両者が一致しない場合、検証は失敗します。
  3. elem_ns ASI が存在し、それに対応する SOAP メッセージ内の要素 で xmlns が指定されていない場合、データ・ハンドラーは、ASI で指定されている elem_ns が、SOAP メッセージ の現行スコープ内のいずれかのネーム・スペースと一致するかどうかを調べます。両者が一致しない場合、検証は失敗します。

type_name および type_ns の検証

以下のセクションでは、type_name および type_ns の検証について説明します。

単純属性

xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。

xsdType が false の場合、type_name および type_ns の検証には以下の規則が適用されます。

複合属性 (カーディナリティー 1 および n)

xsdType が true の場合、type_name および type_ns の検証には以下の規則が適用されます。

xsdType が false の場合、type_name および type_ns の検証には以下の規則が適用されます。

attr_name および attr_ns の検証

SOAP メッセージをビジネス・オブジェクトに読み込む際には、SOAP 属性を探すために個々の SOAP 要素が検索されます。SOAP 属性が検出された場合は、対応するビジネス・オブジェクトから得られた attr_name プロパティー値と比較されます。例えば、次の SOAP メッセージについて考えてみましょう。

<CustInfo City="4" State="5" Street="2" Zip="6">
    <Name xsi:type="xsd:string">1</Name>
    <Street2 xsi:type="xsd:string">3</Street2>
 </CustInfo>

ここで、図 53 に示すビジネス・オブジェクト定義構造について考えてみます (各属性の右に属性レベル ASI が指定されています)。

図 53. attr_name および attr_ns の検証

データ・ハンドラーは以下の処理ステップに従います。

  1. 要素名 CustInfo を読み取ります。
  2. この要素名に対応するビジネス・オブジェクト属性を解決します。
  3. SOAP 要素の属性を読み取り、それらを子属性の ASI と突き合わせます。この例では、SOAP メッセージの Street とビジネス・オブジェクト属性 Street1 の 突き合わせ、City とビジネス・オブジェクト属性 City の突き合わせ、さらに、以下同様の突き合わせが行われます。
  4. CustInfo の子要素が、本文の残りの部分と同じ方法で読み取られ、処理されます。

注:
attr_ns の検証は行われません。

データ・ハンドラーは、所定の要素の SOAP 属性について繰り返し処理を行います。属性に出会うたびに、データ・ハンドラーは、対応する属性のためのビジネス・オブジェクトを検索します。ビジネス・オブジェクトが見付かったら、そのビジネス・オブジェクト属性に SOAP 属性の値を取り込みます。対応するビジネス・オブジェクト属性が見付からない場合、データ・ハンドラーは次の SOAP 属性に移って処理を続けます。

SOAP データ・ハンドラー内部からのデータ・ハンドラーの呼び出し

SOAP データ・ハンドラーは、別のデータ・ハンドラーを使用して、エンコードされた要素値を、SOAP メッセージからビジネス・オブジェクトに読み込むことができます。例えば、SOAP 要素の値がエンコードされるフォーマットの 1 つに、RNIF 文書があります。この機能を使用するためには、RNIF ビジネス・オブジェクトを任意のレベルの SOAP 子ビジネス・オブジェクトに追加します。この RNIF エンコード・ストリングを RNIF ビジネス・オブジェクトに変換するときに別のデータ・ハンドラーを使用しなければならないことを SOAP データ・ハンドラーに通知するためには、その属性の ASI に dh_mimetype プロパティーを追加する必要があります。dh_mimetype ASI の値は、MO_DataHandler_Default ビジネス・オブジェクトで指定された適格な mimeType でなければなりません。mimeType は、ストリング上で使用するデータ・ハンドラーを判別するために使用されます。例えば、次の SOAP メッセージでは、RNIFExample が SOAP 要素で、ここには RNIF エンコード・ストリングが含まれています。

<CustInfo>
 <Name>IBM Corporation</Name>
 <CustID>95626</CustID>
 <RNIFexample xsi:type="xsd:base64Binary">
 1AWERYER238W98EYR9238728374871892787ASRJK234234JKAWER
 J234AWERIJHI423488R4HASF1AWERYER238W98EYR923872837487
 1892787ASRJK234234JKAWERJ234AWERIJHI423488R4HASF1AWER
 YER238W98EYR9238728374871892787ASRJK234234JKAWERJ234A
 WERIJHI423488R4HASF1AWERYER238W98EYR92387283748718927
 87ASRJK234234JKAWERJ234AWERIJHI423488R4HASFWR234
 </RNIFexample>
 </CustomerInfo>
 

SOAP ビジネス・オブジェクトは、図 54 のようなものとなります。

図 54. RNIFExample ビジネス・オブジェクト

RNIFExample 要素には、その要素値として RNIF エンコード・ストリングが含まれています。また、ASI プロパティー elem_name、elem_ns、type_name、type_ns、および xsdtype は、このビジネス・オブジェクト属性との関係を依然として維持しています。

注:
呼び出し先のデータ・ハンドラーによって戻される要素値がエンコード・テキストである場合には、type_name プロパティーは base64Binary に設定されていなければならず、type_ns は xsd ネーム・スペースに対応していなければならず、また xsdtype は true に設定されていなければなりません。

デフォルトのビジネス・オブジェクト解決

SOAP からビジネス・オブジェクトへの変換では、SOAP データ・ハンドラーと Web サービス・コネクターは、情報を交換してビジネス・オブジェクト名を解決する特殊な契約に準拠しています。このコネクターは、SOAP データ・ハンドラーに、BodyName と BodyNamespace のペアにマップされるビジネス・オブジェクト名のリストを提供します。さらに、TLO に defaultfault ビジネス・オブジェクトが設定されている場合は、この情報がデータ・ハンドラーに渡されます。この情報が渡されると、SOAP データ・ハンドラーは、以下のステップに従って処理します。

  1. SOAP メッセージを受け取ります。
  2. そのメッセージが SOAP 要求メッセージか応答メッセージか、あるいは障害メッセージかを判断します。
    1. SOAP 要求メッセージまたは応答メッセージである場合は、SOAP-ENV:Body 要素の最初の子要素から、BodyName および BodyNamespace を読み取ります。
    2. SOAP 障害メッセージである場合は、その障害メッセージ内の detail 要素の最初の子要素から、BodyName および BodyNamespace を読み取ります。障害メッセージに detail 要素がない場合は、この変換用の defaultfault ビジネス・オブジェクトを使用します。
  3. defaultfault ビジネス・オブジェクトがまだ選択されていない場合、データ・ハンドラーは、ステップ 2 で検出した BodyName および BodyNamespace を、コネクターが提供するリストで検出されるペアと一致させようとします。一致させられれば、ビジネス・オブジェクトの解決は成功したことになります。一致しない場合、データ・ハンドラーは失敗し、失敗を意味するエラー・メッセージが出されます。

Copyright IBM Corp. 2004, 2005