The BPEL spec only addresses copy operations. As such, the to-spec for the copy 
operation must result in a target node that exists. A TII -> EII copy operation 
will never result in the creation of a child element in the target node. The 
result will be the target element having a single child text node, not an 
element node.

What you have run into is a valid exception being thrown because your second 
copy operation is targeting a node that does not exist in the variable $_b. 
After the first copy operation, the contents of $_b are:

<svc01:elemC/>

You are attempting to copy $_c into a child of $_b that doesn't exist. For 
example:

<svc01:elemC>
   <svc01:elemC/> <!-- This is the node you're targeting -->
<scv01:elemC>

The quote from the spec that you referenced pertains to the literal variant of 
the copy operation. With this variant, the from-spec must produce a single EII 
or a single TII. In your case, you are producing a single EII which is valid. 
Therefore it is not a TII -> EII copy operation, it's actually an EII -> EII 
copy operation.

Your choices are (in no particular order):

 *   initialize the entire target variable using the complete element in the 
literal from-spec
 *   use extensions to dynamically create missing target nodes
 *   use Xquery expressions in the from-spec to construct the complex variable 
dynamically in a simple EII -> EII copy op to update the whole variable or 
parts of it.

On 4/6/09 4:19 AM, "ZHAO Wenfeng" <[email protected]> wrote:

According to WS-BPEL(Version 2.0) specification, it seems that the "TII -> EII" 
type of copy can be used to initialize a complex variable - at least to create 
its first children. The section "8.4.2. Replacement Logic of Copy Operations" 
says(P.70):
  "To replace the destination content:
     If the destination is an EII, all [children] properties (if any) are 
removed and the source content TII is added as the child of the EII. "

But ODE 2.0 seems not to comply with it because in my case the assignment:
      <copy>
        <from><literal><svc01:elemC 
xmlns:svc01="http://example.com/service01.wsdl"/></literal></from>
        <to>$_b</to>
      </copy>
      <copy xmlns:svc01="http://example.com/service01.wsdl";>
        <from>$_c</from>
        <to>$_b/svc01:elemC</to>
      </copy>
will incur selectionFailure:
ERROR - GeronimoLog.error(104) | Assignment Fault: {http://docs.oasis-open.org/w
sbpel/2.0/process/executable}selectionFailure,lineNo=98,faultExplanation={http:/
/docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure: No results
for expression: {OXPath10Expression $_b/svc01:elemC}

But alternatively, using the XPath extention fuction insert-as-last-into() 
provided by ODE, the above initialization can be accomplished.


The version of ODE I use is ODE 2.0 Build #87 (2009-1-8 2:25:04). The 
declaration of the variables is as:
  <variables xmlns:ws0="http://example.com/service01.wsdl";>
    ... ...
    <variable name="_a" element="ws0:elemA" />
    <variable name="_b" element="ws0:elemB" />
    <variable name="_c" element="ws0:elemC" />
    <variable name="_a2" element="ws0:elemA2" />
  </variables>
And the schema is:
       <schema targetNamespace="http://example.com/service01.wsdl";
              xmlns="http://www.w3.org/2001/XMLSchema";
              elementFormDefault="qualified">
           ... ...
           <element name="ResultInfo">
              <complexType>
                  <sequence>
                     <element name="elemA">
                        <complexType>
                            <sequence>
                               <element name="elemB">
                                  <complexType>
                                      <sequence>
                                         <element name="elemC" type="string" 
maxOccurs="unbounded"/>
                                      </sequence>
                                  </complexType>
                               </element>
                            </sequence>
                        </complexType>
                     </element>
                     <element name="elemA2" type="string"/>
                  </sequence>
              </complexType>
           </element>
       </schema>
The complete file set is in the attachment.


If this disagreement in ODE is not a bug but a intentional design, I guess the 
reason is that, according to WS-BPEL, even if it is supported, only the first 
child can be created and the creation of other children must appeal to some 
extension mechanism.  See "8.4 Assignment"(P.62):
    "The fifth from-spec variant returns values as if it were a from-spec that 
selects the children of the <literal> element in the WS-BPEL source code. 
[SA00038] The return value MUST be a *single* EII or Text Information Item 
(TII) only."

Am I right?


Thanks & Regards
Wenfeng


----------
ZHAO Wenfeng
http://www.bupt.edu.cn




--
Mark Ford
MIT Lincoln Laboratory
244 Wood Street
Lexington MA 02420
(781) 981-1843

Reply via email to