You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by rr...@apache.org on 2009/09/11 16:51:50 UTC
svn commit: r813864 [11/13] - in /ode/trunk: ./ axis2-war/src/main/webapp/
axis2-war/src/main/webapp/WEB-INF/ axis2-war/src/main/webapp/WEB-INF/classes/
axis2-war/src/main/webapp/WEB-INF/conf.hib-derby/
axis2-war/src/main/webapp/WEB-INF/conf.jpa-derby/...
Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xquery10/runtime/XQuery10ExpressionRuntime.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xquery10/runtime/XQuery10ExpressionRuntime.java?rev=813864&r1=813863&r2=813864&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xquery10/runtime/XQuery10ExpressionRuntime.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xquery10/runtime/XQuery10ExpressionRuntime.java Fri Sep 11 14:51:03 2009
@@ -1,581 +1,581 @@
-/*
- * 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.rtrep.v2.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.Properties;
-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.XQSequenceType;
-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.rtrep.common.ConfigurationException;
-import org.apache.ode.bpel.rtrep.common.Constants;
-import org.apache.ode.bpel.rtrep.v2.EvaluationContext;
-import org.apache.ode.bpel.rtrep.v2.ExpressionLanguageRuntime;
-import org.apache.ode.bpel.rtrep.v2.OExpression;
-import org.apache.ode.bpel.rtrep.v2.xpath20.JaxpFunctionResolver;
-import org.apache.ode.bpel.rtrep.v2.xpath20.JaxpVariableResolver;
-import org.apache.ode.bpel.rtrep.v2.xquery10.OXQuery10ExpressionBPEL20;
-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.
- */
-@SuppressWarnings("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 {
- 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 {
- return (Boolean) evaluate(cexp, ctx, XPathConstants.BOOLEAN);
- }
-
- /**
- * Evaluate expression and return a number
- *
- * @param cexp cexp
- * @param ctx ctx
- *
- * @return type
- *
- * @throws FaultException FaultException
- */
- public Number evaluateAsNumber(OExpression cexp, EvaluationContext ctx)
- throws FaultException {
- 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 {
- 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
- */
- public Node evaluateNode(OExpression cexp, EvaluationContext ctx)
- throws FaultException {
- 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
- */
- public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context)
- throws FaultException {
- 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
- */
- public Duration evaluateAsDuration(OExpression cexp,
- EvaluationContext context) throws FaultException {
- 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
- */
- private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type)
- throws FaultException {
- 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
- XQSequenceType xqType = getItemType(xqconn, value);
-
- // Saxon doesn't like binding sequences to variables
- if (value instanceof Node) {
- // a node is a node-list, but the inverse isn't true.
- // so, if the value is truly a node, leave it alone.
- } else 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 {
- if (xqType instanceof XQItemType) {
- exp.bindObject(variable, value, (XQItemType) 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 FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, cause.getMessage(), cause);
- } catch (Throwable t) {
- __log.debug("Could not evaluate expression because of ", t);
- throw new FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, t.getMessage(), t);
- }
- }
-
- /**
- * 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 XQSequenceType getItemType(XQConnection xqconn, Object value) throws XQException {
- XQSequenceType 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 Node) {
- xqType = xqconn.createNodeType();
- } else if (value instanceof NodeList || value instanceof XQSequence) {
- XQItemType xqItemType = xqconn.createNodeType();
- xqType = xqconn.createSequenceType(xqItemType, XQSequenceType.OCC_ZERO_OR_MORE);
- }
- 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 {
- Document document = DOMUtils.newDocument();
- Object resultValue = null;
- if (XPathConstants.NODESET.equals(type)) {
- List list = new ArrayList();
-
- while (result.next()) {
- Object itemValue = getItemValue(result.getItem());
- if (itemValue instanceof Node) {
- itemValue = DOMUtils.cloneNode(document, (Node) itemValue);
- }
-
- if (itemValue != null) {
- list.add(itemValue);
- }
- }
-
- resultValue = list;
- } else if (XPathConstants.NODE.equals(type)) {
- XQItem item = null;
- if (result.count() > 0) {
- result.first();
- if (result.isOnItem()) {
- item = result.getItem();
- }
- }
- if (item != null) {
- resultValue = getItemValue(item);
- if (resultValue instanceof Node) {
- resultValue = DOMUtils.cloneNode(document, (Node) resultValue);
- }
- }
- } else if (XPathConstants.STRING.equals(type)) {
- resultValue = result.getSequenceAsString(new Properties());
- } else if (XPathConstants.NUMBER.equals(type)) {
- resultValue = result.getSequenceAsString(new Properties());
- resultValue = Integer.parseInt((String) resultValue);
- } else if (XPathConstants.BOOLEAN.equals(type)) {
- resultValue = result.getSequenceAsString(new Properties());
- resultValue = Boolean.parseBoolean((String) resultValue);
- }
- return resultValue;
- }
-}
+/*
+ * 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.rtrep.v2.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.Properties;
+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.XQSequenceType;
+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.rtrep.common.ConfigurationException;
+import org.apache.ode.bpel.rtrep.common.Constants;
+import org.apache.ode.bpel.rtrep.v2.EvaluationContext;
+import org.apache.ode.bpel.rtrep.v2.ExpressionLanguageRuntime;
+import org.apache.ode.bpel.rtrep.v2.OExpression;
+import org.apache.ode.bpel.rtrep.v2.xpath20.JaxpFunctionResolver;
+import org.apache.ode.bpel.rtrep.v2.xpath20.JaxpVariableResolver;
+import org.apache.ode.bpel.rtrep.v2.xquery10.OXQuery10ExpressionBPEL20;
+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.
+ */
+@SuppressWarnings("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 {
+ 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 {
+ return (Boolean) evaluate(cexp, ctx, XPathConstants.BOOLEAN);
+ }
+
+ /**
+ * Evaluate expression and return a number
+ *
+ * @param cexp cexp
+ * @param ctx ctx
+ *
+ * @return type
+ *
+ * @throws FaultException FaultException
+ */
+ public Number evaluateAsNumber(OExpression cexp, EvaluationContext ctx)
+ throws FaultException {
+ 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 {
+ 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
+ */
+ public Node evaluateNode(OExpression cexp, EvaluationContext ctx)
+ throws FaultException {
+ 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
+ */
+ public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context)
+ throws FaultException {
+ 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
+ */
+ public Duration evaluateAsDuration(OExpression cexp,
+ EvaluationContext context) throws FaultException {
+ 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
+ */
+ private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type)
+ throws FaultException {
+ 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
+ XQSequenceType xqType = getItemType(xqconn, value);
+
+ // Saxon doesn't like binding sequences to variables
+ if (value instanceof Node) {
+ // a node is a node-list, but the inverse isn't true.
+ // so, if the value is truly a node, leave it alone.
+ } else 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 {
+ if (xqType instanceof XQItemType) {
+ exp.bindObject(variable, value, (XQItemType) 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 FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, cause.getMessage(), cause);
+ } catch (Throwable t) {
+ __log.debug("Could not evaluate expression because of ", t);
+ throw new FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, t.getMessage(), t);
+ }
+ }
+
+ /**
+ * 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 XQSequenceType getItemType(XQConnection xqconn, Object value) throws XQException {
+ XQSequenceType 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 Node) {
+ xqType = xqconn.createNodeType();
+ } else if (value instanceof NodeList || value instanceof XQSequence) {
+ XQItemType xqItemType = xqconn.createNodeType();
+ xqType = xqconn.createSequenceType(xqItemType, XQSequenceType.OCC_ZERO_OR_MORE);
+ }
+ 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 {
+ Document document = DOMUtils.newDocument();
+ Object resultValue = null;
+ if (XPathConstants.NODESET.equals(type)) {
+ List list = new ArrayList();
+
+ while (result.next()) {
+ Object itemValue = getItemValue(result.getItem());
+ if (itemValue instanceof Node) {
+ itemValue = DOMUtils.cloneNode(document, (Node) itemValue);
+ }
+
+ if (itemValue != null) {
+ list.add(itemValue);
+ }
+ }
+
+ resultValue = list;
+ } else if (XPathConstants.NODE.equals(type)) {
+ XQItem item = null;
+ if (result.count() > 0) {
+ result.first();
+ if (result.isOnItem()) {
+ item = result.getItem();
+ }
+ }
+ if (item != null) {
+ resultValue = getItemValue(item);
+ if (resultValue instanceof Node) {
+ resultValue = DOMUtils.cloneNode(document, (Node) resultValue);
+ }
+ }
+ } else if (XPathConstants.STRING.equals(type)) {
+ resultValue = result.getSequenceAsString(new Properties());
+ } else if (XPathConstants.NUMBER.equals(type)) {
+ resultValue = result.getSequenceAsString(new Properties());
+ resultValue = Integer.parseInt((String) resultValue);
+ } else if (XPathConstants.BOOLEAN.equals(type)) {
+ resultValue = result.getSequenceAsString(new Properties());
+ resultValue = Boolean.parseBoolean((String) resultValue);
+ }
+ return resultValue;
+ }
+}
Propchange: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/xquery10/runtime/XQuery10ExpressionRuntime.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CompatibilityTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CoreBpelTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/scheduler-simple/src/test/resources/HelloWorld2/HelloWorld2.bpel
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/ClineCommandContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/Command.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/CommandContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/CommandContextErrorHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/CommandTask.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/ExecutionException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/ToolMessages.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/BpelCompileCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/BpelCompileCommandMessages.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/ant/BpelCTask.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/ant/BpelSrcElement.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/ant/WsdlImportElement.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/bpelc/cline/BpelC.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/package.html
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/java/org/apache/ode/tools/sendsoap/cline/HttpSoapSender.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/tools/src/main/resources/org/apache/ode/tools/anttasks.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ode/trunk/utils/src/main/java/org/apache/ode/utils/CollectionUtils.java
------------------------------------------------------------------------------
svn:eol-style = native