本セクションでは、 SOAP エンコード配列型を持つ XML スキーマをマイグレーションまたは処理する方法について説明します。
SCA アプリケーションが、soapend:Array タイプを使用する外部サービスを呼び出す必要があるケースも出てきます。 場合によっては、これを避ける方法がないため、このような状態を処理する方法を次に示します。
<xsd:complexType name="Vendor"> <xsd:all> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phoneNumber" type="xsd:string" /> </xsd:all> </xsd:complexType> </xsd:schema> <xsd:complexType name="Vendors"> <xsd:complexContent mixed="false"> <xsd:restriction base="soapenc:Array"> <xsd:attribute wsdl:arrayType="tns:Vendor[]" ref="soapenc:arrayType" xmlnxsd:wsdl="http://schemas. xmlsoap.org/wsdl/" /> </xsd:restriction> </xsd:complexContent> <xsd:complexType name="VendorsForProduct"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="vendorList" type="tns:Vendors" /> </xsd:all> </xsd:complexType> <xsd:complexType name="Product"> <xsd:all> <xsd:element name="productId" type="xsd:string" /> <xsd:element name="productName" type="xsd:string" /> </xsd:all> </xsd:complexType> <message name="doFindVendorResponse"> <part name="returnVal" type="tns:VendorsForProduct" /> </message> <operation name="doFindVendor"> <input message="tns:doFindVendor" /> <output message="tns:doFindVendorResponse" /> </operation>
// ベンダー・サービスを探し、doFindVendor 操作を見つける Service findVendor=(Service)ServiceManager.INSTANCE.locateService("vendorSearch"); OperationType doFindVendorOperationType=findVendor.getReference().getOperationType("doGoogleSearch"); // 入力 DataObject を作成する DataObject doFindVendor=DataFactory.INSTANCE.create(doFindVendorOperationType.getInputType()); doFindVendor.setString("productId", “12345”); doFindVendor.setString("productName", “Refrigerator”); // FindVendor サービスを呼び出す DataObject FindVendorResult = (DataObject)findVendor.invoke(doFindVendorOperationType, doFindVendor); // 結果を表示する int resultProductId=findVendorResult.getString("productId"); DataObject resultElements=findVendorResult.getDataObject("vendorList"); Sequence results=resultElements.getSequence(0); for (int i=0, n=results.size(); i for (int i=0, n=results.size(); i
以下のもう 1 つの例は、データ・オブジェクトのルート・タイプが soapenc:Array である場合です。 sampleElements DataObject が、上にリストされた 2 番目のスキーマを使用し、 どのように作成されるかに注目してください。 最初に DataObject のタイプが取得され、 次に sampleStructElement のプロパティーが取得されています。 これは実際はプレースホルダー・プロパティーで、 DataObjects をシーケンスに追加するときに使用する有効なプロパティーを取得するためのみに使用されます。 このようなパターンをシナリオで使用することができます。
<s:schema elementFormDefault="qualified" targetNamespace="http://soapinterop.org/xsd"> <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <s:import namespace="http://schemas.xmlsoap.org/wsdl/" /> <s:complexType name="SOAPStruct"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varInt" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varString" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" form="unqualified" name="varFloat" type="s:float" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfSOAPStruct"> <s:complexContent mixed="false"> <s:restriction base="soapenc:Array"> <s:attribute wsdl:arrayType="s0:SOAPStruct[]" ref="soapenc:arrayType" /> </s:restriction> </s:complexContent> </s:complexType> </s:schema> <wsdl:message name="echoStructArraySoapIn"> <wsdl:part name="inputStructArray" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:message name="echoStructArraySoapOut"> <wsdl:part name="return" type="s0:ArrayOfSOAPStruct" /> </wsdl:message> <wsdl:operation name="echoStructArray"> <wsdl:input message="tns:echoStructArraySoapIn" /> <wsdl:output message="tns:echoStructArraySoapOut" /> </wsdl:operation> <schema targetNamespace="http://sample/elements" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://sample/elements"> <element name="sampleStringElement" type="string"/> <element name="sampleStructElement" type="any"/> </schema>
// 入力 DataObject を作成し、任意のエレメントの SDO シーケンス // を取得する DataFactory dataFactory=DataFactory.INSTANCE; DataObject arrayOfStruct = dataFactory.create("http://soapinterop.org/xsd","ArrayOfSOAPStruct"); Sequence sequence=arrayOfStruct.getSequence("any"); // シーケンスを移植するために、ここで使用したいサンプル・エレメントの // SDO プロパティーを取得する // このエレメントは XSD ファイルに定義済み。SampleElements.xsd を参照 DataObject sampleElements=dataFactory.create("http://sample/elements", "DocumentRoot"); Property property = sampleElements.getType().getProperty("sampleStructElement"); // エレメントをシーケンスに追加する DataObject item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 1); item.setString("varString", "Hello"); item.setFloat("varFloat", 1.0f); sequence.add(property, item); item=dataFactory.create("http://soapinterop.org/xsd", "SOAPStruct"); item.setInt("varInt", 2); item.setString("varString", "World"); item.setFloat("varFloat", 2.0f); sequence.add(property, item); // echoStructArray 操作を呼び出す System.out.println("[client] invoking echoStructArray operation"); DataObject echoArrayOfStruct = (DataObject)interopTest.invoke("echoStructArray", arrayOfStruct); // 結果を表示する if (echoArrayOfStruct!=null) { sequence=echoArrayOfStruct.getSequence("any"); for (int i=0, n=sequence.size(); i<n; i++) { item=(DataObject)sequence.getValue(i); System.out.println("[client] item varInt = "+ item.getInt("varInt")+" varString="+item.getString("varString")+" varFloat="+item.getFloat("varFloat"));