[ http://issues.apache.org/jira/browse/ODE-71?page=all ]
Dave MacLean updated ODE-71:
----------------------------
Attachment: AsyncProcess2.zip
Ported the AsyncProcess2 example to work with the axis 2 war deployment. See
the bug comments for possible fix suggestions that make this test run correctly.
To run, unzip to a AsyncProcess2 folder in your processes directory.
Then, using the command line run:
sendsoap http://localhost:8080/ode/processes/AsyncProcess2/Invoke message.soap
When successful, you should see a list of orders returned.
> AsyncProcess2 test ported to Axis2 deployment not functioning properly do to
> an error when evaluating the XPath10 expression
> ----------------------------------------------------------------------------------------------------------------------------
>
> Key: ODE-71
> URL: http://issues.apache.org/jira/browse/ODE-71
> Project: Apache Ode
> Issue Type: Bug
> Components: BPEL Runtime, BPEL Compilation/Parsing
> Affects Versions: Incubator
> Environment: win32_x86, windows xp, Tomcat with ode's generated axis2
> war, debugging with Eclipse dev environment
> Reporter: Dave MacLean
> Attachments: AsyncProcess2.zip
>
>
> (Pasting post from mailing list, will attach unit test in a zip)
> Following up, I think a more correct change would be to pursue what I listed
> as "a)" below:
> In org.apache.ode.bpel.engine.BpelRuntimeContextImpl, under the method
> "getPartData", we currently have the code:
> public Node getPartData(Element message, Part part) {
> Element partEl = DOMUtils.findChildByName(
> (Element) message,
> new QName(null, part.name),
> false);
> if (partEl == null)
> return null;
> Node container = DOMUtils.getFirstChildElement(partEl);
> if (container == null)
> container = partEl.getFirstChild(); // either a text node / element
> return container;
> }
> This seems incorrect. Shouldn't part data return the actual part and not the
> part's first child?
> I would propose to change this to:
> public Node getPartData(Element message, Part part) {
> return DOMUtils.findChildByName(
> (Element) message,
> new QName(null, part.name),
> false);
> }
> For a wsdl that contains a message like this:
> <message name="ProcessInputMessage">
> <part name="payload" element="typ:AllOrders"/>
> </message>
> The dom-parsed xml structure ends up looking like:
> <?xml version="1.0" encoding="UTF-8"?>
> <message>
> <payload>
> <AllOrders xmlns="uri:com.bptest.types">
> <Order>
> <OrderId>1161286397524-1</OrderId>
> <OrderType>BookOrder</OrderType>
> <!-- etc... -->
> The current version of the method getPartData method returns the "AllOrders"
> tag, the proposed version would return the "payload" tag.
> Does this make sense? With this change, the xpath evaluation works
> correctly, since when the XPath10 libaries start their evaluation of
> "/typ:AllOrders" on the first child of "payload", it matches "AllOrders"
> correctly.
> I guess it just makes more sense that "getPartData" would actually get the
> part instead of getting the part's first child...
> Any comments on this?
> Thanks,
> Dave
> -----Original Message-----
> From: Dave MacLean [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 19, 2006 12:06 PM
> To: [email protected]
> Subject: XPath10 expression evaluation and the AsyncProcess2 example -
> potential fix
> Hello,
> I've been working on getting the AsyncProcess2 example to work under an axis
> 2 deployment, and I think I ran into a bug.
> The xpath evaluation was failing when trying to evaluate this "from"
> line of the first assign in the bpel:
> <from
> expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0">
> count(bpws:getVariableData('Input', 'payload',
> '/typ:AllOrders')/typ:Order)
> </from>
> In particular, it had trouble evaluating the /typ:AllOrders expression.
> The actual xml I'm using for the soap message is the one that appears in
> subversion for the example, and starts like this:
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
> <SOAP-ENV:Body>
> <AllOrders xmlns="uri:com.bptest.types">
> <Order >
> <!-- etc... -->
> Tracing into
> org.apache.ode.bpel.elang.xpath10.runtime.XPath10ExpressionRuntime, in the
> createContext method, the code instantiates a new ContextSupport with a
> BpelDocumentNavigator created using:
> new BpelDocumentNavigator(ctx.getRootNode())
> where ctx is the EvaluationContext passed in.
> The problem is the root node returned here points to the AllOrders element.
> That would appear to be ok, but when tracing into the jaxen evaluation later
> on, it starts comparisons with the *first child* of the root node given -
> That is, the order of the nodes returned by the AxisNodeIterator used in the
> jaxen source never returns the root node itself, just the children and
> siblings.
> This leads to the first comparison being against that first "<Order>"
> tag, which causes no matches to occur and an empty array resulting from the
> evaluation (when it should match that first "<AllOrders>" tag and return that
> one match. Since I'm assuming the jaxen evaluation code is correct, it looks
> like we *need* to have some document wrapping the root node in this case *or*
> we need to have the EvaluationContext's root node returning a "parent" node
> of the node we're actually interested in...
> For example, changing the createContext method to the below did fix the
> problem I was having (but I'm worried this exact change may cause other
> unexpected behavior):
> private Context createContext(OXPath10Expression oxpath, EvaluationContext
> ctx) {
> JaxenContexts bpelSupport = new JaxenContexts(oxpath,
> _extensionFunctions, ctx);
> Node rootNode = ctx.getRootNode();
> if (rootNode!=null && rootNode.getParentNode()!=null)
> {
> rootNode = rootNode.getParentNode();
> }
> ContextSupport support = new ContextSupport(new
> JaxenNamespaceContextAdapter(oxpath.namespaceCtx),
> bpelSupport, bpelSupport,
> new
> BpelDocumentNavigator(rootNode));
> Context jctx = new Context(support);
> if (ctx.getRootNode() != null)
> jctx.setNodeSet(Collections.singletonList(ctx.getRootNode()));
> return jctx;
> }
> Basically, it just sets the BpelDocumentNavigator to use the parent node of
> the root node returned by the EvaluationContext, if available. With this
> change and a proper deploy.xml file (and a few minor wsdl changes), the
> AsyncProcess2 example runs and returns correctly in the Axis2 environment.
> Can any one provide guidance on the "proper" way to be doing something
> equivalent?
> a) Should the EvaluationContext.getRootNode() method return a wrapping
> document/parent node?
> Or,
> b) Should we be doing something like I have above, where we pass in the
> proper root node when creating the navigator?
> Or,
> c) Should the navigator somehow be modified so that it uses the correct root
> node when calling the jaxen libraries to find matches to the expression?
> I'm going to attach another thread below that might be related to this
> same issue, although it's related to XPath20 and not XPath10.
> Thanks in advance,
> Dave
> From "Matthieu Riou" <[EMAIL PROTECTED]>
> Subject Re: XPath 20
> Date Tue, 19 Sep 2006 17:45:38 GMT
> Ok, I've found it. Your part is a type, not an element. And the
> expression
> $request.requestMessageData points to the part itself, any XPath
> expression
> will therefore be evaluated on the nodeset of the part child nodes. So
> the
> full expression should be $request.requestMessageData/requestID, you
> don't
> need to repeat the part name in there as there's no element for it.
> On 9/18/06, Lance Waterman <[EMAIL PROTECTED]> wrote:
> >
> >
> >
> > On 9/18/06, Matthieu Riou <[EMAIL PROTECTED]> wrote:
> >
> > > Hi Lance,
> > >
> > > See my comments inline...
> > >
> > > 1) XPath20ExpressionRuntime ( line 173 )
> > > >
> > > > Object evalResult =
> expr.evaluate(DOMUtils.newDocument(),
> > > > type);
> > > >
> > > > Does this imply that all xpath syntax must contain a variable
> > > reference?
> > >
> > >
> >
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira