Ok, I have put together a simple example of the problem I am seeing with
query expressions.  This example does not include a forEach activity.  Also,
I am running this against a current build of Ode 1.X.

The attached process takes a single int as input and returns a single string
as output.  Valid arguments for the input are 1, 2, or 3.  The process
should return "one", "two", or "three", depending on the input.

The problem occurs when I try to assign values out of the RecordSet variable
into the Record variable.  When I use a query on the "to" side of the copy,
the process will throw a selectionFailure fault at runtime.  The process
works correctly if you replace the queries with expressions.

In case my attachments don't get through, I'll include the text of the files
here:

********** Begin QueryTest1.wsdl **********

<?xml version="1.0"?>
<definitions name="QueryTest1"
        targetNamespace="mynamespace"
        xmlns:tns="mynamespace"
        xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype";
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
        xmlns="http://schemas.xmlsoap.org/wsdl/";
        >
        
    <types>
        <schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
                targetNamespace="mynamespace"
                xmlns="http://www.w3.org/2001/XMLSchema";>

            <element name="QueryTest1Request" type="int" />
            <element name="QueryTest1Response" type="string" />
        
            <complexType name="RecordType">
                <sequence>
                    <element name="SomeValue" type="string"></element>
                    <element name="AnotherValue" type="string"></element>
                </sequence>
            </complexType>
        
            <complexType name="RecordSetType">
                <sequence>
                    <element ref="tns:Record" minOccurs="0"
maxOccurs="unbounded"></element>
                </sequence>
            </complexType>
            
            <element name="Record" type="tns:RecordType"></element>
            <element name="RecordSet" type="tns:RecordSetType"></element>
        </schema>
    </types>
    
    <message name="QueryTest1RequestMessage">
        <part name="payload" element="tns:QueryTest1Request"/>
    </message>
    <message name="QueryTest1ResponseMessage">
        <part name="payload" element="tns:QueryTest1Response"/>
    </message>
    
    <portType name="QueryTest1">
        <operation name="process">
            <input  message="tns:QueryTest1RequestMessage" />
            <output message="tns:QueryTest1ResponseMessage"/>
        </operation>
    </portType>
    
    <plnk:partnerLinkType name="QueryTest1">
        <plnk:role name="QueryTest1Provider" portType="tns:QueryTest1"/>
    </plnk:partnerLinkType>
    
    <binding name="QueryTest1Binding" type="tns:QueryTest1">
        <soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"; />
        <operation name="process">
            <soap:operation soapAction="mynamespace/process" />
            <input>
                <soap:body use="literal" />
            </input>
            <output>
                <soap:body use="literal" />
            </output>
        </operation>
    </binding>
    
    <service name="QueryTest1Service">
        <port name="QueryTest1Port" binding="tns:QueryTest1Binding">
            <soap:address location="http://[server]:[port]/ode/QueryTest1";
/>
        </port>
    </service>
</definitions>

********** End QueryTest1.wsdl **********

********** Begin QueryTest1.bpel **********

<?xml version="1.0" encoding="UTF-8"?>
<bpws:process exitOnStandardFault="yes"
    expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
    name="QueryTest1"
    queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
    suppressJoinFailure="yes" targetNamespace="mynamespace"
    xmlns:bpws="http://docs.oasis-open.org/wsbpel/2.0/process/executable";
    xmlns:ode="http://www.apache.org/ode/type/extension";
    xmlns:tns="mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema";>

    <bpws:import importType="http://schemas.xmlsoap.org/wsdl/";
        location="QueryTest1.wsdl" namespace="mynamespace"/>

    <bpws:partnerLinks>
        <bpws:partnerLink myRole="QueryTest1Provider" name="client"
partnerLinkType="tns:QueryTest1"/>
    </bpws:partnerLinks>

    <bpws:variables>
        <bpws:variable messageType="tns:QueryTest1RequestMessage"
name="input"/>
        <bpws:variable messageType="tns:QueryTest1ResponseMessage"
name="output"/>
        <bpws:variable element="tns:RecordSet" name="RecordSet"/>
        <bpws:variable element="tns:Record" name="Record"/>
    </bpws:variables>

    <bpws:sequence name="QueryTest1">
        <bpws:receive createInstance="yes" name="ReceiveInput"
            operation="process" partnerLink="client"
            portType="tns:QueryTest1" variable="input"/>
        <bpws:assign name="InitializeRecordSetVariable" validate="no">
            <bpws:copy>
                <bpws:from>
                    <bpws:literal>
                        <tns:RecordSet xmlns:tns="mynamespace"
                   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="mynamespace QueryTest1.wsdl ">
                            <tns:Record>
                                <tns:SomeValue>one</tns:SomeValue>
                                <tns:AnotherValue>ONE</tns:AnotherValue>
                            </tns:Record>
                            <tns:Record>
                                <tns:SomeValue>two</tns:SomeValue>
                                <tns:AnotherValue>TWO</tns:AnotherValue>
                            </tns:Record>
                            <tns:Record>
                                <tns:SomeValue>three</tns:SomeValue>
                                <tns:AnotherValue>THREE</tns:AnotherValue>
                            </tns:Record>
                        </tns:RecordSet>
                    </bpws:literal>
                </bpws:from>
                <bpws:to variable="RecordSet"/>
            </bpws:copy>
        </bpws:assign>
        <bpws:assign name="InitializeRecordVariable" validate="no">
            <bpws:copy>
                <bpws:from>
                    <bpws:literal>
                        <tns:Record xmlns:tns="mynamespace"
                   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="mynamespace QueryTest1.wsdl ">
                            <tns:SomeValue/>
                            <tns:AnotherValue/>
                        </tns:Record>
                    </bpws:literal>
                </bpws:from>
                <bpws:to variable="Record"/>
            </bpws:copy>
        </bpws:assign>
        <bpws:assign name="AssignRequestedRecordToVariable" validate="no">
            <bpws:copy>
                <bpws:from variable="RecordSet">
                    <bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[tns:
Record[number($input.payload)]/tns:SomeValue]]></bpws:query>
                </bpws:from>

                <!------------ Selection failure. ------------>
                <bpws:to variable="Record">
                    <bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[tns:
SomeValue]]></bpws:query>
                </bpws:to>
                
                <!------------ This works.        ------------>
                <!-- <bpws:to
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA
[$Record/tns:SomeValue]]></bpws:to> -->

            </bpws:copy>
            <bpws:copy>
                <bpws:from variable="RecordSet">
                    <bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[tns:
Record[number($input.payload)]/tns:AnotherValue]]></bpws:query>
                </bpws:from>

                <!------------ Selection failure. ------------>
                <bpws:to variable="Record">
                    <bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[tns:
AnotherValue]]></bpws:query>
                </bpws:to>

                <!------------ This works.        ------------>
                <!-- <bpws:to
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA
[$Record/tns:AnotherValue]]></bpws:to> -->

            </bpws:copy>
        </bpws:assign>
        <bpws:assign name="AssignFromVariableToOutput" validate="no">
            <bpws:copy>
                <bpws:from variable="Record">
                    <bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[tns:
SomeValue]]></bpws:query>
                </bpws:from>
                <bpws:to part="payload" variable="output"/>
            </bpws:copy>
        </bpws:assign>
        <bpws:reply name="ReplyWithOutput" operation="process"
            partnerLink="client" portType="tns:QueryTest1"
variable="output"/>
    </bpws:sequence>

</bpws:process>

********** End QueryTest1.bpel **********

********** Begin deploy.xml **********

<?xml version="1.0" encoding="UTF-8"?>
<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03";
xmlns:ns1="mynamespace">
  <process name="ns1:QueryTest1">
    <active>true</active>
    <provide partnerLink="client">
      <service name="ns1:QueryTest1Service" port="QueryTest1Port"/>
    </provide>
  </process>
</deploy>

********** End deploy.xml **********

Reply via email to