You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2008/10/29 22:14:22 UTC

svn commit: r709010 - in /ode/branches/APACHE_ODE_1.X: bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ bpel-obj/src/main/java/org/apache/ode/bpel/o/ bpel-runtime/src/main/java/org/...

Author: karthick
Date: Wed Oct 29 14:14:21 2008
New Revision: 709010

URL: http://svn.apache.org/viewvc?rev=709010&view=rev
Log:
This patch resolves the issue raised in https://issues.apache.org/jira/browse/ODE-371.

Added:
    ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
    ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/
    ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/TestInsertMissingData.bpel
    ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/deploy.xml
    ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties
Modified:
    ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
    ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Copy.java
    ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
    ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OLValueExpression.java
    ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
    ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
    ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
    ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_abstract_common_base.xsd
    ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_executable.xsd
    ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/DataHandling20Test.java
    ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/DOMUtils.java

Modified: ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java Wed Oct 29 14:14:21 2008
@@ -66,6 +66,7 @@
             ocopy.keepSrcElementName = scopy.isKeepSrcElement();
             ocopy.ignoreMissingFromData = scopy.isIgnoreMissingFromData();
             ocopy.ignoreUninitializedFromVariable = scopy.isIgnoreUninitializedFromVariable();
+            ocopy.insertMissingToData = scopy.isInsertMissingToData();
             ocopy.debugInfo = new DebugInfo(_context.getSourceLocation(), scopy.getLineNo(),
                     source.getExtensibilityElements());
             try {

Modified: ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Copy.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Copy.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Copy.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/Copy.java Wed Oct 29 14:14:21 2008
@@ -60,4 +60,8 @@
     public boolean isIgnoreUninitializedFromVariable() {
         return getAttribute("ignoreUninitializedFromVariable", "no").equals("yes");
     }
+    
+    public boolean isInsertMissingToData() {
+        return getAttribute("insertMissingToData", "no").equals("yes");
+    }
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java Wed Oct 29 14:14:21 2008
@@ -53,6 +53,7 @@
         public boolean keepSrcElementName;
         public boolean ignoreMissingFromData;
         public boolean ignoreUninitializedFromVariable;
+        public boolean insertMissingToData;
 
         public Copy(OProcess owner) {
             super(owner);
@@ -133,6 +134,12 @@
         public Variable getVariable() {
             return expression.getVariable();
         }
+        public boolean isInsertMissingToData() {
+        	return expression.insertMissingData;
+        }
+        public void setInsertMissingToData(boolean insertMissingToData) {
+        	expression.insertMissingData = insertMissingToData;
+        }
       
     }
     public static class Expression extends OBase implements RValue {

Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OLValueExpression.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OLValueExpression.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OLValueExpression.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OLValueExpression.java Wed Oct 29 14:14:21 2008
@@ -23,6 +23,14 @@
     private static final long serialVersionUID = 1L;
     
     /**
+     * Indicates whether the expression, if it is a simple path, must
+     * be created if missing By a simple path, we mean a path expression whose
+     * steps are fully-qualified names separated by slashes. In case any of
+     * the steps in the simple path is non-existent, then we must create it.
+     */
+    public boolean insertMissingData;
+    
+    /**
      * @param owner
      */
     public OLValueExpression(OProcess owner) {

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/JaxpFunctionResolver.java Wed Oct 29 14:14:21 2008
@@ -31,6 +31,7 @@
 import java.util.Map;
 
 import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.xpath.XPathFunction;
@@ -925,12 +926,20 @@
 		            }
 	            }
             }
-            Element clonedElmt = (Element) parentElmt.cloneNode(true);
+            final Element clonedElmt = (Element) parentElmt.cloneNode(true);
             children = clonedElmt.getChildNodes();
             for (int target = 0; target < positions.length; target++) {
 	            Element deleteElmt = (Element) children.item(positions[target]);
 	            clonedElmt.removeChild(deleteElmt);
             }
+            // Saxon doesn't like clones with no children, so I'll oblige
+            if (clonedElmt.getChildNodes().getLength() == 0) {
+            	try {
+	            	clonedElmt.appendChild(DOMUtils.toDOMDocument(parentElmt).createTextNode(""));
+            	} catch (TransformerException te) {
+            		throw new XPathFunctionException(te);
+            	}
+            }
             return clonedElmt;
     	}
     }

Added: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java?rev=709010&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionModifier.java Wed Oct 29 14:14:21 2008
@@ -0,0 +1,198 @@
+package org.apache.ode.bpel.elang.xpath20.runtime;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
+import javax.xml.xpath.XPathExpression;
+
+import net.sf.saxon.expr.AxisExpression;
+import net.sf.saxon.expr.Expression;
+import net.sf.saxon.expr.ItemChecker;
+import net.sf.saxon.expr.PathExpression;
+import net.sf.saxon.expr.VariableReference;
+import net.sf.saxon.om.Axis;
+import net.sf.saxon.om.NamePool;
+import net.sf.saxon.pattern.NameTest;
+import net.sf.saxon.pattern.NodeKindTest;
+import net.sf.saxon.pattern.NodeTest;
+import net.sf.saxon.xpath.XPathExpressionImpl;
+
+import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.NSContext;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * A helper utility that modifies XPath Expression in-place.  This is meant
+ * to be reusable across the XPath and XQuery runtimes.
+ */
+public class XPath20ExpressionModifier {
+    private NSContext contextUris;
+    private NamePool namePool;
+
+    /**
+     * Creates a new XPath20ExpressionModifier object.
+     *
+     * @param contextUris 
+     * @param namePool 
+     */
+    public XPath20ExpressionModifier(NSContext contextUris, NamePool namePool) {
+        this.contextUris = contextUris;
+        this.namePool = namePool;
+    }
+
+    /**
+     * Insert nodes into the specified XPath expression wherever
+     * required To be precise, an node is added to its parent if: 
+     * a) the node is an element... 
+     * b) that corresponds to an step... 
+     * c) that has a child axis... 
+     * d) whose parent had no children with its name... 
+     * e) and all preceding steps are element name tests.
+     *
+     * @param xpathExpr
+     * @param namePool
+     *
+     * @throws DOMException
+     * @throws TransformerException
+     */
+    @SuppressWarnings("unchecked")
+    public void insertMissingData(XPathExpression xpathExpr, Node contextNode)
+        throws DOMException, TransformerException {
+        if ((contextNode == null) || !(contextNode instanceof Element) ||
+                !(xpathExpr instanceof XPathExpressionImpl)) {
+            return;
+        }
+
+        Expression expression = ((XPathExpressionImpl) xpathExpr).getInternalExpression();
+        Iterator<Expression> subExpressions = (Iterator<Expression>) expression.iterateSubExpressions();
+
+        if (!subExpressions.hasNext()) {
+            return;
+        }
+
+        Expression subExpr = (Expression) subExpressions.next();
+
+        if (!(subExpr instanceof PathExpression)) {
+            return;
+        }
+
+        Document document = DOMUtils.toDOMDocument(contextNode);
+        PathExpression pathExpr = (PathExpression) subExpr;
+        Expression step = pathExpr.getFirstStep();
+
+        while (step != null) {
+            if (step instanceof AxisExpression) {
+                AxisExpression axisExpr = (AxisExpression) step;
+
+                NodeTest nodeTest = axisExpr.getNodeTest();
+
+                if (!(nodeTest instanceof NameTest)) {
+                    break;
+                }
+
+                NameTest nameTest = (NameTest) nodeTest;
+
+                QName childName = getQualifiedName(nameTest.getFingerprint(),
+                        namePool, contextUris);
+                
+                if (Axis.CHILD == axisExpr.getAxis()) {
+                    if (NodeKindTest.ELEMENT.getNodeKindMask() != nameTest.getNodeKindMask()) {
+                        break;
+                    }
+                	
+                    NodeList children = ((Element) contextNode).getElementsByTagNameNS(childName.getNamespaceURI(),
+                            childName.getLocalPart());
+                    if ((children == null) || (children.getLength() == 0)) {
+                        Node child = document.createElementNS(childName.getNamespaceURI(),
+                                DOMUtils.getQualifiedName(childName));
+                        contextNode.appendChild(child);
+                        contextNode = child;
+                    } else if (children.getLength() == 1) {
+                        contextNode = children.item(0);
+                    } else {
+                        break;
+                    }
+                } else if (Axis.ATTRIBUTE == axisExpr.getAxis()) {
+                    if (NodeKindTest.ATTRIBUTE.getNodeKindMask() != nameTest.getNodeKindMask()) {
+                        break;
+                    }
+                    
+                    Attr attribute = ((Element) contextNode).getAttributeNodeNS(childName.getNamespaceURI(), childName.getLocalPart());
+                    if (attribute == null) {
+                    	attribute = document.createAttributeNS(childName.getNamespaceURI(), childName.getLocalPart());
+                    	((Element) contextNode).setAttributeNode(attribute);
+                    	contextNode = attribute;
+                    } else {
+                    	break;
+                    }
+                	
+                } else {
+                	break;
+                }
+
+
+            } else if (step instanceof ItemChecker) {
+                ItemChecker itemChecker = (ItemChecker) step;
+                Expression baseExpr = itemChecker.getBaseExpression();
+
+                if (!(baseExpr instanceof VariableReference)) {
+                    break;
+                }
+            } else {
+                break;
+            }
+
+            if (pathExpr != null) {
+                Expression remainingSteps = pathExpr.getRemainingSteps();
+
+                if (remainingSteps instanceof PathExpression) {
+                    pathExpr = (PathExpression) remainingSteps;
+                    step = pathExpr.getFirstStep();
+                } else if (remainingSteps instanceof AxisExpression) {
+                    pathExpr = null;
+                    step = (AxisExpression) remainingSteps;
+                }
+            } else {
+                break;
+            }
+        }
+    }
+
+    /**
+     * Create the QName by running the given finger print against the
+     * given context
+     *
+     * @param fingerprint
+     * @param namePool
+     * @param nsContext
+     *
+     * @return The QName corresponding to the finger print
+     */
+    private QName getQualifiedName(int fingerprint, NamePool namePool,
+        NSContext nsContext) {
+        String localName = namePool.getLocalName(fingerprint);
+        String prefix = namePool.getPrefix(fingerprint);
+        String uri = namePool.getURI(fingerprint);
+
+        // Unfortunately, NSContext.getPrefix(String URI) doesn't always work
+        // So, we need to find the prefix for the URI the hard way
+        if ((prefix == null) || "".equals(prefix)) {
+            for (String nsPrefix : nsContext.getPrefixes()) {
+                String nsUri = nsContext.getNamespaceURI(nsPrefix);
+
+                if (nsUri.equals(uri)) {
+                    prefix = nsPrefix;
+                }
+            }
+        }
+
+        return new QName(uri, localName, prefix);
+    }
+}

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/elang/xpath20/runtime/XPath20ExpressionRuntime.java Wed Oct 29 14:14:21 2008
@@ -18,20 +18,30 @@
  */
 package org.apache.ode.bpel.elang.xpath20.runtime;
 
-import net.sf.saxon.dom.DocumentWrapper;
+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 javax.xml.namespace.QName;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
 import net.sf.saxon.om.NamespaceConstant;
-import net.sf.saxon.om.NodeInfo;
 import net.sf.saxon.trans.DynamicError;
 import net.sf.saxon.value.DurationValue;
-import net.sf.saxon.xpath.XPathEvaluator;
 import net.sf.saxon.xpath.XPathFactoryImpl;
 
 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.xpath10.o.OXPath10Expression;
-import org.apache.ode.bpel.elang.xpath20.runtime.JaxpFunctionResolver;
-import org.apache.ode.bpel.elang.xpath20.runtime.JaxpVariableResolver;
 import org.apache.ode.bpel.elang.xpath20.compiler.WrappedResolverException;
 import org.apache.ode.bpel.elang.xpath20.o.OXPath20ExpressionBPEL20;
 import org.apache.ode.bpel.explang.ConfigurationException;
@@ -39,23 +49,15 @@
 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.bpel.o.OScope;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.ISO8601DateParser;
 import org.apache.ode.utils.xsd.Duration;
 import org.apache.ode.utils.xsl.XslTransformHandler;
-import org.w3c.dom.*;
-
-import javax.xml.namespace.QName;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import java.util.*;
+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;
 
 /**
  * XPath 2.0 Expression Language run-time subsytem.
@@ -232,7 +234,11 @@
             xpe.setNamespaceContext(oxpath20.namespaceCtx);
             XPathExpression expr = xpe.compile(((OXPath10Expression)cexp).xpath);
             Node contextNode = ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode();
-
+            // Create step nodes in XPath in case it is incompletely instantiated 
+            if (oxpath20.insertMissingData) {
+            	XPath20ExpressionModifier modifier = new XPath20ExpressionModifier(oxpath20.namespaceCtx, ((XPathFactoryImpl) xpf).getConfiguration().getNamePool());
+                modifier.insertMissingData(expr, ctx.getRootNode());
+            }
             Object evalResult = expr.evaluate(contextNode, type);
             if (evalResult != null && __log.isDebugEnabled()) {
                 __log.debug("Expression " + cexp.toString() + " generated result " + evalResult
@@ -259,6 +265,5 @@
         	 __log.debug("Could not evaluate expression because of ", t);
             throw new EvaluationException("Error while executing an XPath expression: ", t);
         }
-
     }
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java Wed Oct 29 14:14:21 2008
@@ -388,6 +388,7 @@
                                 lvalue));
             } else if (ocopy.to instanceof OAssign.LValueExpression) {
                 LValueExpression lexpr = (LValueExpression) ocopy.to;
+	            lexpr.setInsertMissingToData(ocopy.insertMissingToData);
                 lvaluePtr = evalQuery(lvalue, null, lexpr.expression,
                         new EvaluationContextProxy(lexpr.getVariable(), lvalue));
                 if (__log.isDebugEnabled())
@@ -630,14 +631,14 @@
         private Node _rootNode;
 
         private EvaluationContext _ctx;
+        
 
         private EvaluationContextProxy(Variable var, Node varNode) {
             _var = var;
             _varNode = varNode;
             _ctx = getEvaluationContext();
-
         }
-
+        
         public Node readVariable(OScope.Variable variable, OMessageVarType.Part part) throws FaultException {
             if (variable.name.equals(_var.name)) {
                 if (part == null) return _varNode;

Modified: ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_abstract_common_base.xsd
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_abstract_common_base.xsd?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_abstract_common_base.xsd (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_abstract_common_base.xsd Wed Oct 29 14:14:21 2008
@@ -590,7 +590,8 @@
 				</xsd:sequence>
 				<xsd:attribute name="keepSrcElementName" type="tBoolean" use="optional" default="no"/>
 				<xsd:attribute name="ignoreMissingFromData" type="tBoolean" use="optional" default="no"/>
-        <xsd:attribute name="ignoreUninitializedFromVariable" type="tBoolean" use="optional" default="no"/>
+                <xsd:attribute name="ignoreUninitializedFromVariable" type="tBoolean" use="optional" default="no"/>
+                <xsd:attribute name="insertMissingToData" type="tBoolean" use="optional" default="no"/>
 			</xsd:extension>
 		</xsd:complexContent>
 	</xsd:complexType>

Modified: ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_executable.xsd
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_executable.xsd?rev=709010&r1=709009&r2=709010&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_executable.xsd (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/resources/ws-bpel_executable.xsd Wed Oct 29 14:14:21 2008
@@ -659,6 +659,8 @@
 				</xsd:sequence>
 				<xsd:attribute name="keepSrcElementName" type="tBoolean" use="optional" default="no"/>
 				<xsd:attribute name="ignoreMissingFromData" type="tBoolean" use="optional" default="no"/>
+                <xsd:attribute name="ignoreUninitializedFromVariable" type="tBoolean" use="optional" default="no"/>
+                <xsd:attribute name="insertMissingToData" type="tBoolean" use="optional" default="no"/>
 			</xsd:extension>
 		</xsd:complexContent>
 	</xsd:complexType>
@@ -1222,4 +1224,4 @@
 		</xsd:restriction>
 	</xsd:simpleType>
 	
-</xsd:schema>
\ No newline at end of file
+</xsd:schema>

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=709010&r1=709009&r2=709010&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 Wed Oct 29 14:14:21 2008
@@ -18,7 +18,6 @@
  */
 package org.apache.ode.test;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class DataHandling20Test extends BPELTestAbstract {
@@ -79,4 +78,7 @@
     @Test public void testXQueryExpression() throws Throwable {
         go("/bpel/2.0/TestXQueryExpression");
     }
+    @Test public void testInsertMissingData() throws Throwable {
+        go("/bpel/2.0/TestInsertMissingData");
+    }
 }

Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/TestInsertMissingData.bpel
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/TestInsertMissingData.bpel?rev=709010&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/TestInsertMissingData.bpel (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/TestInsertMissingData.bpel Wed Oct 29 14:14:21 2008
@@ -0,0 +1,105 @@
+<!--
+	~ 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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://docs.oasis-open.org/wsbpel/2.0/process/executable ../../../../../../../bpel-schemas/src/main/resources/wsbpel_executable.xsd"
+ xmlns:tns="http://ode/bpel/unit-test/TestInsertMissingData"
+ xmlns:prb="http://ode/bpel/unit-test/ProbeService.wsdl"
+ xmlns:types="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"
+ xmlns:foo="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wns="http://ode/bpel/unit-test/TestInsertMissingData.wsdl"
+ xmlns:ode="http://www.apache.org/ode/type/extension"
+ xmlns:fn="http://www.w3.org/2005/xpath-functions"
+ xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
+ targetNamespace="http://ode/bpel/unit-test/TestInsertMissingData"
+ name="TestInsertMissingData"
+ queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
+ expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
+ suppressJoinFailure="yes">
+	
+	<import location="TestInsertMissingData.wsdl"
+		namespace="http://ode/bpel/unit-test/TestInsertMissingData.wsdl"
+		importType="http://schemas.xmlsoap.org/wsdl/" />
+	<import location="../ProbeService/probeService.wsdl"
+		namespace="http://ode/bpel/unit-test/ProbeService.wsdl"
+		importType="http://schemas.xmlsoap.org/wsdl/"/>
+ 	
+ 	<partnerLinks>
+ 		<partnerLink name="request" partnerLinkType="wns:TestInsertMissingDataRequest" myRole="TestInsertMissingDataService"/>
+ 	</partnerLinks>
+ 	<variables>
+ 		<variable name="request" messageType="wns:requestMessage"/>
+ 		<variable name="testType" element="types:aTestMessage"/>
+ 		<variable name="reply" messageType="wns:replyMessage"/>
+ 	</variables>
+ 	<sequence>
+ 		<receive name="receive1" partnerLink="request" portType="wns:TestInsertMissingDataPT" operation="request" variable="request" createInstance="yes"/>
+ 
+ 		<!-- test cases for ignore missing to data -->
+ 		<assign name="assign1">			
+            <copy insertMissingToData="yes">
+ 				<from>$request.requestMessageData/typeIndicators/types:indicatorTwo</from>
+ 				<to>$testType/@xsi:nil</to>
+ 			</copy>
+            <copy insertMissingToData="yes">
+ 				<from>$request.requestMessageData/typeIndicators/types:indicatorTwo</from>
+ 				<to>$testType/typeIndicators/types:indicatorTwo</to>
+ 			</copy>
+ 			<copy>
+ 				<from>ode:delete($testType/typeIndicators)</from>
+ 				<to>$testType</to>
+ 			</copy>
+            <copy insertMissingToData="yes">
+ 				<from>$request.requestMessageData/typeIndicators/types:indicatorTwo</from>
+ 				<to>$testType/child::typeIndicators/types:indicatorTwo</to>
+ 			</copy>
+ 			<copy>
+ 				<from>ode:delete($testType/typeIndicators)</from>
+ 				<to>$testType</to>
+ 			</copy>
+            <copy insertMissingToData="yes">
+ 				<from>$request.requestMessageData/typeIndicators/types:indicatorTwo</from>
+ 				<to>$testType/child::typeIndicators/child::types:indicatorTwo</to>
+ 			</copy>
+ 			<copy>
+ 				<from>ode:delete($testType/typeIndicators)</from>
+ 				<to>$testType</to>
+ 			</copy>
+            <copy insertMissingToData="yes">
+ 				<from>$request.requestMessageData/typeIndicators/types:indicatorTwo</from>
+ 				<to variable="testType">/typeIndicators/child::types:indicatorTwo</to>
+ 			</copy>
+ 		</assign>
+ 		
+ 		<assign name="assign3">			
+ 			<copy>
+ 				<from>$request.requestMessageData/requestID</from>
+ 				<to variable="reply" part="replyID"/>
+ 			</copy>
+ 			<copy>
+ 				<from>
+ 					<literal><![CDATA[pass]]></literal>
+ 				</from>
+ 				<to>$reply.replyText</to>
+ 			</copy>
+ 		</assign>
+        
+ 		<reply name="reply" partnerLink="request" portType="wns:TestInsertMissingDataPT" operation="request" variable="reply"/>
+ 	</sequence>
+ </process>

Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/deploy.xml
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/deploy.xml?rev=709010&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/deploy.xml (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/deploy.xml Wed Oct 29 14:14:21 2008
@@ -0,0 +1,31 @@
+<!--
+	~ 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/TestInsertMissingData" 
+	xmlns:wns="http://ode/bpel/unit-test/TestInsertMissingData.wsdl">
+
+
+	<process name="pns:TestInsertMissingData">
+		<active>true</active>
+		<provide partnerLink="request">
+			<service name="wns:TestInsertMissingDataService" port="wns:TestInsertMissingDataPort"/>
+		</provide>
+	</process>
+</deploy>

Added: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties?rev=709010&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/resources/bpel/2.0/TestInsertMissingData/test1.properties Wed Oct 29 14:14:21 2008
@@ -0,0 +1,22 @@
+#
+#    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/TestInsertMissingData.wsdl
+service=TestInsertMissingDataService
+operation=request
+request1=<message><requestMessageData><ens:aTestMessage xmlns:ens="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"><requestID>Start InsertMissingData</requestID><requestText>Event InsertMissingData</requestText><typeIndicators xmlns:foo="http://ode/bpel/unit-test/TestInsertMissingData.wsdl.types"><foo:indicatorOne>fail</foo:indicatorOne><foo:indicatorTwo>fail</foo:indicatorTwo></typeIndicators></ens:aTestMessage></requestMessageData></message>
+response1=.*<replyID>Start InsertMissingData</replyID><replyText>pass</replyText>.*

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=709010&r1=709009&r2=709010&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 Wed Oct 29 14:14:21 2008
@@ -1056,4 +1056,9 @@
 	public static Document getDocument(Node contextNode) {
 		return (contextNode == null) ? DOMUtils.newDocument() : contextNode.getOwnerDocument();
     }
-}
\ No newline at end of file
+
+    public static String getQualifiedName(QName qName) {
+    	String prefix = qName.getPrefix(), localPart = qName.getLocalPart();
+    	return (prefix == null || "".equals(prefix)) ? localPart : (prefix + ":" + localPart);
+    }
+}