Added: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xquery10/runtime/XQuery10ExpressionRuntime.java URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xquery10/runtime/XQuery10ExpressionRuntime.java?rev=708740&view=auto ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xquery10/runtime/XQuery10ExpressionRuntime.java (added) +++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xquery10/runtime/XQuery10ExpressionRuntime.java Tue Oct 28 17:11:15 2008 @@ -0,0 +1,564 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.ode.bpel.elang.xquery10.runtime; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.namespace.QName; +import javax.xml.transform.TransformerFactory; +import javax.xml.xpath.XPathConstants; +import javax.xml.xquery.XQConnection; +import javax.xml.xquery.XQConstants; +import javax.xml.xquery.XQDataSource; +import javax.xml.xquery.XQException; +import javax.xml.xquery.XQItem; +import javax.xml.xquery.XQItemType; +import javax.xml.xquery.XQPreparedExpression; +import javax.xml.xquery.XQResultSequence; +import javax.xml.xquery.XQSequence; +import javax.xml.xquery.XQStaticContext; + +import net.sf.saxon.Configuration; +import net.sf.saxon.om.Validation; +import net.sf.saxon.trans.DynamicError; +import net.sf.saxon.value.DurationValue; +import net.sf.saxon.xqj.SaxonXQConnection; +import net.sf.saxon.xqj.SaxonXQDataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.ode.bpel.common.FaultException; +import org.apache.ode.bpel.elang.xpath20.compiler.Constants; +import org.apache.ode.bpel.elang.xpath20.compiler.WrappedResolverException; +import org.apache.ode.bpel.elang.xpath20.runtime.JaxpFunctionResolver; +import org.apache.ode.bpel.elang.xpath20.runtime.JaxpVariableResolver; +import org.apache.ode.bpel.elang.xquery10.compiler.XQuery10BpelFunctions; +import org.apache.ode.bpel.elang.xquery10.o.OXQuery10ExpressionBPEL20; +import org.apache.ode.bpel.explang.ConfigurationException; +import org.apache.ode.bpel.explang.EvaluationContext; +import org.apache.ode.bpel.explang.EvaluationException; +import org.apache.ode.bpel.explang.ExpressionLanguageRuntime; +import org.apache.ode.bpel.o.OExpression; +import org.apache.ode.utils.DOMUtils; +import org.apache.ode.utils.ISO8601DateParser; +import org.apache.ode.utils.NSContext; +import org.apache.ode.utils.xsd.Duration; +import org.apache.ode.utils.xsl.XslTransformHandler; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + + +/** + * XQuery 1.0 Expression Language run-time subsytem. Saxon implementation. + */ [EMAIL PROTECTED]("deprecation") +public class XQuery10ExpressionRuntime implements ExpressionLanguageRuntime { + static final short NODE_TYPE = 1; + static final short NODESET_TYPE = 2; + static final short STRING_TYPE = 3; + static final short BOOLEAN_TYPE = 4; + static final short NUMBER_TYPE = 5; + + /** Class-level logger. */ + private static final Log __log = LogFactory.getLog(XQuery10ExpressionRuntime.class); + + /** + * Creates a new XQuery10ExpressionRuntime object. + */ + public XQuery10ExpressionRuntime() { + } + + /** + * Initialize XSL Transformer + * + * @param properties properties + * + * @throws ConfigurationException ConfigurationException + */ + public void initialize(Map properties) throws ConfigurationException { + TransformerFactory trsf = new net.sf.saxon.TransformerFactoryImpl(); + XslTransformHandler.getInstance().setTransformerFactory(trsf); + } + + /** + * + * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluateAsString(org.apache.ode.bpel.o.OExpression, + * org.apache.ode.bpel.explang.EvaluationContext) + */ + public String evaluateAsString(OExpression cexp, EvaluationContext ctx) + throws FaultException, EvaluationException { + return (String) evaluate(cexp, ctx, XPathConstants.STRING); + } + + /** + * + * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluateAsBoolean(org.apache.ode.bpel.o.OExpression, + * org.apache.ode.bpel.explang.EvaluationContext) + */ + public boolean evaluateAsBoolean(OExpression cexp, EvaluationContext ctx) + throws FaultException, EvaluationException { + return (Boolean) evaluate(cexp, ctx, XPathConstants.BOOLEAN); + } + + /** + * Evaluate expression and return a number + * + * @param cexp cexp + * @param ctx ctx + * + * @return type + * + * @throws FaultException FaultException + * @throws EvaluationException EvaluationException + */ + public Number evaluateAsNumber(OExpression cexp, EvaluationContext ctx) + throws FaultException, EvaluationException { + return (Number) evaluate(cexp, ctx, XPathConstants.NUMBER); + } + + /** + * + * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluate(org.apache.ode.bpel.o.OExpression, + * org.apache.ode.bpel.explang.EvaluationContext) + */ + public List evaluate(OExpression cexp, EvaluationContext ctx) + throws FaultException, EvaluationException { + List result; + Object someRes = evaluate(cexp, ctx, XPathConstants.NODESET); + + if (someRes instanceof List) { + result = (List) someRes; + __log.debug("Returned list of size " + result.size()); + + if ((result.size() == 1) && !(result.get(0) instanceof Node)) { + // Dealing with a Java class + Object simpleType = result.get(0); + + // Dates get a separate treatment as we don't want to call toString on them + String textVal; + + if (simpleType instanceof Date) { + textVal = ISO8601DateParser.format((Date) simpleType); + } else if (simpleType instanceof DurationValue) { + textVal = ((DurationValue) simpleType).getStringValue(); + } else { + textVal = simpleType.toString(); + } + + // Wrapping in a document + Document d = DOMUtils.newDocument(); + + // Giving our node a parent just in case it's an LValue expression + Element wrapper = d.createElement("wrapper"); + Text text = d.createTextNode(textVal); + wrapper.appendChild(text); + d.appendChild(wrapper); + result = Collections.singletonList(text); + } + } else if (someRes instanceof NodeList) { + NodeList retVal = (NodeList) someRes; + __log.debug("Returned node list of size " + retVal.getLength()); + result = new ArrayList(retVal.getLength()); + + for (int m = 0; m < retVal.getLength(); ++m) { + Node val = retVal.item(m); + + if (val.getNodeType() == Node.DOCUMENT_NODE) { + val = ((Document) val).getDocumentElement(); + } + + result.add(val); + } + } else { + result = null; + } + + return result; + } + + /** + * Evaluate expression and return a node + * + * @param cexp cexp + * @param ctx ctx + * + * @return type + * + * @throws FaultException FaultException + * @throws EvaluationException EvaluationException + */ + public Node evaluateNode(OExpression cexp, EvaluationContext ctx) + throws FaultException, EvaluationException { + List retVal = evaluate(cexp, ctx); + + if (retVal.size() == 0) { + throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, + "No results for expression: " + cexp); + } + + if (retVal.size() > 1) { + throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, + "Multiple results for expression: " + cexp); + } + + return (Node) retVal.get(0); + } + + /** + * Evaluate expression and return a date + * + * @param cexp cexp + * @param context context + * + * @return type + * + * @throws FaultException FaultException + * @throws EvaluationException EvaluationException + */ + public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context) + throws FaultException, EvaluationException { + List literal = DOMUtils.toList(evaluate(cexp, context, + XPathConstants.NODESET)); + + if (literal.size() == 0) { + throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, + "No results for expression: " + cexp); + } + + if (literal.size() > 1) { + throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, + "Multiple results for expression: " + cexp); + } + + Object date = literal.get(0); + + if (date instanceof Calendar) { + return (Calendar) date; + } + + if (date instanceof Date) { + Calendar cal = Calendar.getInstance(); + cal.setTime((Date) date); + + return cal; + } + + if (date instanceof Element) { + date = ((Element) date).getTextContent(); + } + + try { + return ISO8601DateParser.parseCal(date.toString()); + } catch (Exception ex) { + String errmsg = "Invalid date: " + literal; + __log.error(errmsg, ex); + throw new FaultException(cexp.getOwner().constants.qnInvalidExpressionValue, + errmsg); + } + } + + /** + * Evaluate expression and return duration + * + * @param cexp cexp + * @param context context + * + * @return type + * + * @throws FaultException FaultException + * @throws EvaluationException EvaluationException + */ + public Duration evaluateAsDuration(OExpression cexp, + EvaluationContext context) throws FaultException, EvaluationException { + String literal = this.evaluateAsString(cexp, context); + + try { + return new Duration(literal); + } catch (Exception ex) { + String errmsg = "Invalid duration: " + literal; + __log.error(errmsg, ex); + throw new FaultException(cexp.getOwner().constants.qnInvalidExpressionValue, + errmsg); + } + } + + /** + * Evaluate expression and return opaque type + * + * @param cexp cexp + * @param ctx ctx + * @param type type + * + * @return type + * + * @throws FaultException FaultException + * @throws EvaluationException EvaluationException + */ + private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type) + throws FaultException, EvaluationException { + try { + OXQuery10ExpressionBPEL20 oxquery10 = ((OXQuery10ExpressionBPEL20) cexp); + + XQDataSource xqds = new SaxonXQDataSource(); + XQConnection xqconn = xqds.getConnection(); + + Configuration configuration = ((SaxonXQConnection) xqconn).getConfiguration(); + configuration.setAllNodesUntyped(true); + configuration.setHostLanguage(Configuration.XQUERY); + + XQStaticContext staticEnv = xqconn.getStaticContext(); + + NSContext nsContext = oxquery10.namespaceCtx; + Set<String> prefixes = nsContext.getPrefixes(); + for (String prefix : prefixes) { + String uri = nsContext.getNamespaceURI(prefix); + staticEnv.declareNamespace(prefix, uri); + } + + configuration.setSchemaValidationMode(Validation.SKIP); + xqconn.setStaticContext(staticEnv); + + // Prepare expression, for starters + String xquery = oxquery10.xquery.replaceFirst( + Constants.XQUERY_FUNCTION_HANDLER_COMPILER, + Constants.XQUERY_FUNCTION_HANDLER_RUNTIME); + XQPreparedExpression exp = xqconn.prepareExpression(xquery); + + JaxpFunctionResolver funcResolver = new JaxpFunctionResolver(ctx, + oxquery10); + JaxpVariableResolver variableResolver = new JaxpVariableResolver(ctx, + oxquery10, configuration); + // Bind external variables to runtime values + for (QName variable : exp.getAllUnboundExternalVariables()) { + // Evaluate referenced variable + Object value = variableResolver.resolveVariable(variable); + + // Figure out type of variable + XQItemType xqType = getItemType(xqconn, value); + + // Saxon doesn't like binding sequences to variables + if (value instanceof NodeList) { + // So extract the first item from the node list + NodeList nodeList = (NodeList) value; + ArrayList nodeArray = new ArrayList(); + for (int i = 0; i < nodeList.getLength(); i++) { + nodeArray.add(nodeList.item(i)); + } + value = xqconn.createSequence(nodeArray.iterator()); + } + + + // Bind value with external variable + if (value != null && xqType != null) { + if (value instanceof XQSequence) { + exp.bindSequence(variable, (XQSequence) value); + } else { + exp.bindObject(variable, value, xqType); + } + } + } + + // Set context node + Node contextNode = (ctx.getRootNode() == null) + ? DOMUtils.newDocument() : ctx.getRootNode(); + contextNode.setUserData(XQuery10BpelFunctions.USER_DATA_KEY_FUNCTION_RESOLVER, + funcResolver, null); + exp.bindItem(XQConstants.CONTEXT_ITEM, + xqconn.createItemFromNode(contextNode, xqconn.createNodeType())); + + // Execute query + XQResultSequence result = exp.executeQuery(); + + // Cast Saxon result to Java result + Object evalResult = getResultValue(type, result); + + if ((evalResult != null) && __log.isDebugEnabled()) { + __log.debug("Expression " + cexp.toString() + + " generated result " + evalResult + " - type=" + + evalResult.getClass().getName()); + + if (ctx.getRootNode() != null) { + __log.debug("Was using context node " + + DOMUtils.domToString(ctx.getRootNode())); + } + } + + return evalResult; + } catch (XQException xqe) { + // Extracting the real cause from all this wrapping isn't a simple task + Throwable cause = (xqe.getCause() != null) ? xqe.getCause() : xqe; + + if (cause instanceof DynamicError) { + Throwable th = ((DynamicError) cause).getException(); + + if (th != null) { + cause = th; + + if (cause.getCause() != null) { + cause = cause.getCause(); + } + } + } + + throw new EvaluationException( + "Error while executing an XQuery expression: " + cause.toString(), cause); + } catch (WrappedResolverException wre) { + __log.debug("Could not evaluate expression because of ", wre); + throw (FaultException) wre.getCause(); + } + } + + /** + * Return opaque object embedded in XQuery Item + * + * @param item item + * + * @return type + * + * @throws XQException XQException + */ + private Object getItemValue(XQItem item) throws XQException { + XQItemType itemType = item.getItemType(); + Object itemValue = null; + + switch (itemType.getBaseType()) { + case XQItemType.XQBASETYPE_BOOLEAN: + itemValue = item.getBoolean(); + + break; + + case XQItemType.XQBASETYPE_DECIMAL: + itemValue = item.getDouble(); + + break; + + case XQItemType.XQBASETYPE_BYTE: + itemValue = item.getByte(); + + break; + + case XQItemType.XQBASETYPE_FLOAT: + itemValue = item.getFloat(); + + break; + + case XQItemType.XQBASETYPE_INT: + case XQItemType.XQBASETYPE_INTEGER: + itemValue = item.getInt(); + + break; + + case XQItemType.XQBASETYPE_LONG: + itemValue = item.getLong(); + + break; + + case XQItemType.XQBASETYPE_ANYTYPE: + itemValue = item.getNode(); + + break; + + case XQItemType.XQBASETYPE_ANYURI: + itemValue = item.getNodeUri(); + + break; + + case XQItemType.XQBASETYPE_SHORT: + itemValue = item.getShort(); + + break; + + case XQItemType.XQBASETYPE_STRING: + case XQItemType.XQBASETYPE_ANYATOMICTYPE: + itemValue = item.getAtomicValue(); + + break; + } + + return itemValue; + } + + /** + * Return XQuery type corresponding to given value + * + * @param xqconn XQuery connection + * @param value value + * + * @return type + * + * @throws XQException XQException + */ + private XQItemType getItemType(XQConnection xqconn, Object value) throws XQException { + XQItemType xqType = null; + if (value instanceof Long) { + xqType = xqconn.createAtomicType(XQItemType.XQBASETYPE_LONG); + } else if (value instanceof String) { + xqType = xqconn.createAtomicType(XQItemType.XQBASETYPE_STRING); + } else if (value instanceof NodeList) { + NodeList nodeList = (NodeList) value; + + if (nodeList.getLength() == 1) { + xqType = xqconn.createNodeType(); + value = nodeList.item(0); + } else { + value = null; + } + } + return xqType; + } + + /** + * Cast XQuery sequence into an opaque list + * + * @param type type + * @param result result + * + * @return value + * + * @throws XQException XQException + */ + private Object getResultValue(QName type, XQResultSequence result) throws XQException { + Object resultValue = null; + if (XPathConstants.NODESET.equals(type)) { + List list = new ArrayList(); + + while (result.next()) { + Object itemValue = getItemValue(result.getItem()); + + if (itemValue != null) { + list.add(itemValue); + } + } + + resultValue = list; + } else { + resultValue = getItemValue(result.getItem()); + } + return resultValue; + } +}
Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java (original) +++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/elang/xpath20/runtime/MockCompilerContext.java Tue Oct 28 17:11:15 2008 @@ -18,6 +18,7 @@ */ package org.apache.ode.bpel.elang.xpath20.runtime; +import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -25,6 +26,7 @@ import javax.wsdl.Operation; import javax.xml.namespace.QName; +import javax.xml.transform.Source; import org.apache.ode.bpel.compiler.api.CompilationException; import org.apache.ode.bpel.compiler.api.CompilerContext; @@ -207,4 +209,9 @@ public Part resolveHeaderPart(Variable variable, String partname) throws CompilationException { return null; } + + public Map<URI, Source> getSchemaSources() { + // TODO Auto-generated method stub + return null; + } } Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/DataHandling20Test.java URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/DataHandling20Test.java?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/DataHandling20Test.java (original) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/DataHandling20Test.java Tue Oct 28 17:11:15 2008 @@ -18,10 +18,11 @@ */ package org.apache.ode.test; +import org.junit.Ignore; import org.junit.Test; public class DataHandling20Test extends BPELTestAbstract { - @Test public void testComposeUrl() throws Throwable { + @Test public void testComposeUrl() throws Throwable { go("/bpel/2.0/TestComposeUrl"); } @Test public void testCombineUrl() throws Throwable { @@ -54,7 +55,7 @@ @Test public void testSimpleVariableType() throws Throwable { go("/bpel/2.0/TestSimpleVariableType"); } - @Test public void testXslTransform() throws Throwable { + @Test public void testXslTransform() throws Throwable { go("/bpel/2.0/TestXslTransform"); } @Test public void testSplit() throws Throwable { @@ -75,4 +76,7 @@ @Test public void testAssignMissingData() throws Throwable { go("/bpel/2.0/TestAssignMissingData"); } + @Test public void testXQueryExpression() throws Throwable { + go("/bpel/2.0/TestXQueryExpression"); + } } Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity1/test.properties URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity1/test.properties?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity1/test.properties (original) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignActivity1/test.properties Tue Oct 28 17:11:15 2008 @@ -19,4 +19,4 @@ service=TestAssignService operation=testAssign request1=<message><TestPart>Hello</TestPart></message> -response1=.*Hello World7true3.* \ No newline at end of file +response1=.*Hello World7.*true3.* \ No newline at end of file Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignDate/NewDiagram-Pool.bpel URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignDate/NewDiagram-Pool.bpel?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignDate/NewDiagram-Pool.bpel (original) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestAssignDate/NewDiagram-Pool.bpel Tue Oct 28 17:11:15 2008 @@ -29,11 +29,11 @@ </bpel:assign> <bpel:assign bpmn:label="Task" bpmn:id="_e0Xz0Nw9Edye_tsy8V393Q"> <bpel:copy> - <bpel:from xmlns:xdt="http://www.w3.org/2003/11/xpath-datatypes">xs:dateTime($variable) + xdt:dayTimeDuration ("P1D")</bpel:from> + <bpel:from>xs:dateTime($variable) + xs:dayTimeDuration ("P1D")</bpel:from> <bpel:to>$variable</bpel:to> </bpel:copy> <bpel:copy> - <bpel:from xmlns:xdt="http://www.w3.org/2003/11/xpath-datatypes">$variable + xdt:dayTimeDuration ("P1D")</bpel:from> + <bpel:from>$variable + xs:dayTimeDuration ("P1D")</bpel:from> <bpel:to>$variable</bpel:to> </bpel:copy> </bpel:assign> Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestDuration/BugCastDayTimeDurationToDuration-Pool.bpel URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestDuration/BugCastDayTimeDurationToDuration-Pool.bpel?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestDuration/BugCastDayTimeDurationToDuration-Pool.bpel (original) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestDuration/BugCastDayTimeDurationToDuration-Pool.bpel Tue Oct 28 17:11:15 2008 @@ -21,7 +21,8 @@ </bpel:assign> <bpel:assign bpmn:label="Task" bpmn:id="_6_3QwOu1EdyUWbG-WWtMzg"> <bpel:copy> - <bpel:from xmlns:xdt="http://www.w3.org/2003/11/xpath-datatypes">xdt:dayTimeDuration ("PT2S")</bpel:from> + <!--<bpel:from xmlns:xdt="http://www.w3.org/2003/11/xpath-datatypes">xdt:dayTimeDuration ("PT2S")</bpel:from>--> + <bpel:from>xs:dayTimeDuration ("PT2S")</bpel:from> <bpel:to>$thisTaskRequestMsg.body/tns:duration</bpel:to> </bpel:copy> </bpel:assign> Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.bpel URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.bpel?rev=708740&view=auto ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.bpel (added) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.bpel Tue Oct 28 17:11:15 2008 @@ -0,0 +1,107 @@ +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<process name="HelloXQueryWorld" + targetNamespace="http://ode/bpel/unit-test" + xmlns:bpws="http://docs.oasis-open.org/wsbpel/2.0/process/executable" + xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable" + xmlns:tns="http://ode/bpel/unit-test" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:types="http://ode/bpel/types" + xmlns:test="http://ode/bpel/unit-test.wsdl" + xmlns:ode="http://www.apache.org/ode/type/extension" + queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xquery1.0" + expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xquery1.0"> + + <import location="HelloXQueryWorld.wsdl" + namespace="http://ode/bpel/unit-test.wsdl" + importType="http://schemas.xmlsoap.org/wsdl/"/> + + <partnerLinks> + <partnerLink name="HelloXQueryPartnerLink" + partnerLinkType="test:HelloXQueryPartnerLinkType" + myRole="me" /> + </partnerLinks> + + <variables> + <variable name="myVar" messageType="test:HelloXQueryMessage"/> + <variable name="tempVar" element="test:content"/> + <variable name="otherVar" type="xsd:string"/> + </variables> + + <sequence> + <receive + name="start" + partnerLink="HelloXQueryPartnerLink" + portType="test:HelloXQueryPortType" + operation="HelloXQuery" + variable="myVar" + createInstance="yes"/> + <assign name="assign1"> + <copy> + <from variable="myVar" part="TestPart"/> + <to variable="otherVar"/> + </copy> + <copy> + <from><![CDATA[<test:content>Hello</test:content>]]></from> + <to variable="tempVar"/> + </copy> + <copy> + <from> + typeswitch ($myVar.TestPart) + case $a as xs:string return "test" + default return "default" + </from> + <to variable="otherVar"/> + </copy> + <copy> + <from><![CDATA[ + typeswitch ($myVar.TestPart) + case $a as text() return <test:content/> + default return <test:content/> + ]]> + </from> + <to variable="otherVar"/> + </copy> + <!-- this copy will fail since saxon is not schema-aware + <copy> + <from> + typeswitch ($myVar.TestPart) + case $a as element(*, test:content) return "test" + default return "default" + </from> + <to variable="otherVar"/> + </copy> + --> + <copy> + <from> + for $loopOnce in (1) + return + concat(bpws:getVariableProperty("myVar", "test:content"), "XQuery World") + </from> + <to variable="myVar" part="TestPart"/> + </copy> + </assign> + <reply name="end" + partnerLink="HelloXQueryPartnerLink" + portType="test:HelloXQueryPortType" + operation="HelloXQuery" + variable="myVar"/> + </sequence> + +</process> Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.wsdl URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.wsdl?rev=708740&view=auto ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.wsdl (added) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/HelloXQueryWorld.wsdl Tue Oct 28 17:11:15 2008 @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> + +<wsdl:definitions + targetNamespace="http://ode/bpel/unit-test.wsdl" + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://ode/bpel/unit-test.wsdl" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:vprop="http://docs.oasis-open.org/wsbpel/2.0/varprop" + xmlns:types="http://ode/bpel/types" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:bpws="http://docs.oasis-open.org/wsbpel/2.0/process/executable" + xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"> + + <wsdl:types> + <xsd:schema targetNamespace="http://ode/bpel/types"> + <xsd:complexType name="ContentCT"> + <xsd:sequence> + <xsd:element name="content" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="HelloXQueryMessage"> + <wsdl:part name="TestPart" type="types:ContentCT"/> + </wsdl:message> + + <wsdl:portType name="HelloXQueryPortType"> + <wsdl:operation name="HelloXQuery"> + <wsdl:input message="tns:HelloXQueryMessage" name="TestIn"/> + <wsdl:output message="tns:HelloXQueryMessage" name="TestOut"/> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="HelloXQuerySoapBinding" type="tns:HelloXQueryPortType"> + <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> + <wsdl:operation name="HelloXQuery"> + <soap:operation soapAction="" style="rpc"/> + <wsdl:input> + <soap:body + namespace="http://ode/bpel/unit-test.wsdl" + use="literal"/> + </wsdl:input> + <wsdl:output> + <soap:body + namespace="http://ode/bpel/unit-test.wsdl" + use="literal"/> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="HelloXQueryService"> + <wsdl:port name="HelloXQueryPort" binding="tns:HelloXQuerySoapBinding"> + <soap:address location="http://localhost:8080/ode/processes/HelloXQueryWorld"/> + </wsdl:port> + </wsdl:service> + + <plnk:partnerLinkType name="HelloXQueryPartnerLinkType"> + <plnk:role name="me" portType="tns:HelloXQueryPortType"/> + <plnk:role name="you" portType="tns:HelloXQueryPortType"/> + </plnk:partnerLinkType> + + <vprop:property name="content" type="xsd:string"/> + <vprop:propertyAlias propertyName="tns:content" messageType="tns:HelloXQueryMessage" part="TestPart"> + + <vprop:query queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"> + content + </vprop:query> + + </vprop:propertyAlias> + +</wsdl:definitions> + Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/deploy.xml URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/deploy.xml?rev=708740&view=auto ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/deploy.xml (added) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/deploy.xml Tue Oct 28 17:11:15 2008 @@ -0,0 +1,29 @@ +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03" + xmlns:pns="http://ode/bpel/unit-test" + xmlns:wns="http://ode/bpel/unit-test.wsdl"> + + <process name="pns:HelloXQueryWorld"> + <active>true</active> + <provide partnerLink="HelloXQueryPartnerLink"> + <service name="wns:HelloXQueryService" port="HelloXQueryPort"/> + </provide> + </process> +</deploy> Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/test.properties URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/test.properties?rev=708740&view=auto ============================================================================== --- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/test.properties (added) +++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestXQueryExpression/test.properties Tue Oct 28 17:11:15 2008 @@ -0,0 +1,23 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +namespace=http://ode/bpel/unit-test.wsdl +service=HelloXQueryService +operation=HelloXQuery +request1=<message><TestPart><content>Hello</content></TestPart></message> +response1=.*HelloXQuery World.* + Modified: ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java (original) +++ ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java Tue Oct 28 17:11:15 2008 @@ -690,6 +690,15 @@ public static QName getElementQName(Element el) { return new QName(el.getNamespaceURI(),el.getLocalName()); } + + public static QName getNodeQName(String qualifiedName) { + int index = qualifiedName.indexOf(":"); + if (index >= 0) { + return new QName(qualifiedName.substring(0, index), qualifiedName.substring(index + 1)); + } else { + return new QName(qualifiedName); + } + } /** * Remove the child nodes under another node. @@ -1044,4 +1053,7 @@ return ll; } + public static Document getDocument(Node contextNode) { + return (contextNode == null) ? DOMUtils.newDocument() : contextNode.getOwnerDocument(); + } } \ No newline at end of file Modified: ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/Namespaces.java URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/Namespaces.java?rev=708740&r1=708739&r2=708740&view=diff ============================================================================== --- ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/Namespaces.java (original) +++ ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/Namespaces.java Tue Oct 28 17:11:15 2008 @@ -50,6 +50,7 @@ public static final String WSDL_20 = "http://www.w3.org/2006/01/wsdl"; public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; public static final String XML_INSTANCE = "http://www.w3. org/2001/XMLSchema-instance"; + public static final String XPATH_FUNCTIONS = "http://www.w3.org/2005/xpath-functions"; public static final String JBI_END_POINT_REFERENCE = "http://java.sun.com/jbi/end-point-reference"; public static final QName WS_ADDRESSING_ENDPOINT = new QName(WS_ADDRESSING_NS, "EndpointReference"); public static final QName WS_ADDRESSING_USINGADDRESSING = new QName(WS_ADDRESSING_WSDL_NS, "UsingAddressing");
