You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ch...@apache.org on 2006/06/22 01:28:40 UTC

svn commit: r416172 [2/2] - in /incubator/ode/scratch/ode/bpel-content: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/ode/ src/main/java/org/apache/ode/capi/ src/main/java/org/apache/ode/capi/imp...

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/interaction/document/operations/SetTextValueOperation.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/interaction/document/operations/SetTextValueOperation.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/interaction/document/operations/SetTextValueOperation.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/interaction/document/operations/SetTextValueOperation.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.interaction.document.operations;
+
+import java.io.Serializable;
+
+import org.apache.ode.capi.ContentException;
+import org.w3c.dom.Node;
+
+public class SetTextValueOperation extends DocumentOperation
+implements Serializable
+{
+    static final long serialVersionUID = 7046905920497670266L;
+    
+	public SetTextValueOperation( )
+	{
+		super( true );
+	}
+
+	protected Object execute(Object iQueryResult, Object iParameters, 
+			String xpath) throws ContentException
+	{
+		String stringValue = null;
+
+		if (iParameters instanceof String)
+		{
+			stringValue = (String) iParameters;
+		} else
+		{
+			stringValue = iParameters.toString();
+		}
+
+		Node node = (Node) (iQueryResult);
+
+		DOMUtil.setTextValue(node, stringValue);
+
+		return null;
+	}
+
+	public boolean isMutator()
+	{
+		return true;
+	}
+	
+	
+	
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/MasterQueryFactory.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/MasterQueryFactory.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/MasterQueryFactory.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/MasterQueryFactory.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,79 @@
+package org.apache.ode.capi.impl.query;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.ode.capi.ContentException;
+import org.apache.ode.capi.Query;
+import org.apache.ode.capi.QueryFactory;
+import org.apache.ode.capi.impl.query.jaxen.JaxenQueryFactory;
+
+public class MasterQueryFactory implements QueryFactory {
+	
+    static final long serialVersionUID = 3229334691771274257L;
+    
+	private List<QueryFactory> factoryList;
+	private static MasterQueryFactory MasterInstance = null;
+	
+	private MasterQueryFactory() 
+	{
+		// default factories
+		factoryList = new ArrayList<QueryFactory>();
+		factoryList.add(new JaxenQueryFactory());
+	}
+
+	
+	public void addQueryFactories( List<QueryFactory> factories )
+	{
+		factoryList.addAll(0, factories );
+	}
+	
+	public Query createQuery(String expression, HashMap namespaceMap) throws ContentException {
+		return createQuery(Query.DEFAULT_QUERY_LANGUAGE,expression,namespaceMap);
+	}
+	
+	private static synchronized MasterQueryFactory CreateMasterInstance()
+	{
+		if ( MasterInstance == null )
+		{
+			MasterInstance = new MasterQueryFactory();
+		}
+		return MasterInstance;
+	}
+	
+
+	public boolean supportsQuery(String queryLanguage) {
+		for ( QueryFactory f : factoryList )
+		{
+			if ( f.supportsQuery(queryLanguage) )
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public Query createQuery(String queryLanguage, String expression, HashMap namespaceMap) 
+		throws ContentException {
+		for ( QueryFactory f : factoryList )
+		{
+			if ( f.supportsQuery(queryLanguage) )
+			{
+				return f.createQuery(queryLanguage,expression,namespaceMap);
+			}
+		}
+		throw new UnsupportedOperationException();
+	}
+
+	public static MasterQueryFactory newInstance()
+	{
+		if ( MasterInstance == null )
+		{
+			return CreateMasterInstance();
+		}
+		return MasterInstance;
+	
+	}
+
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/DocumentQuery.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/DocumentQuery.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/DocumentQuery.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/DocumentQuery.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import org.apache.ode.capi.ContentException;
+import org.apache.ode.capi.Query;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+
+public interface DocumentQuery extends Query 
+{
+	Object runQuery( Document iDocument ) 
+	  throws ContentException;
+	  
+	Node buildQueriedNode( Document iDocument )
+	  throws ContentException;
+
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenNodeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenNodeBuilder.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenNodeBuilder.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenNodeBuilder.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import org.apache.ode.capi.ContentException;
+import org.apache.ode.capi.impl.interaction.document.operations.DOMUtil;
+import org.jaxen.JaxenException;
+import org.jaxen.SimpleNamespaceContext;
+import org.jaxen.XPathFunctionContext;
+import org.jaxen.dom.DOMXPath;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class JaxenNodeBuilder implements NodeBuilder, Serializable
+{
+    static final long serialVersionUID = 9183764444392953826L;
+    
+	
+	private XPathParser XPathParser;
+	private LinkedList<Object[]> subQueries = new LinkedList<Object[]>();
+	private SimpleNamespaceContext namespaceContext = null;
+	
+	public JaxenNodeBuilder()
+	{
+	}
+
+	public JaxenNodeBuilder(HashMap iURIMap, String iExpression ) throws JaxenException
+	{
+		namespaceContext = new SimpleNamespaceContext( iURIMap );
+		XPathParser = new XPathParser( iURIMap, iExpression );
+		buildSubQueries();
+	}
+	
+	private void buildSubQueries() throws JaxenException
+	{
+		subQueries.clear();
+		Iterator iter = XPathParser.getNodeDescriptors().iterator();
+		DOMXPath currentQuery = null;
+		String currentQueryString = "";
+		while( iter.hasNext() )
+		{
+			NodeDescriptor nodeDescriptor = 
+			  ( NodeDescriptor )( iter.next() );
+			
+			currentQueryString = currentQueryString + "/" +
+			  nodeDescriptor.getName();
+			   
+			currentQuery = new DOMXPath( currentQueryString );
+			currentQuery.setNamespaceContext(namespaceContext);
+			currentQuery.setFunctionContext(new XPathFunctionContext());
+			  
+			if ( currentQuery != null )
+			{
+				subQueries.addFirst( new Object[]{ currentQuery, nodeDescriptor });
+			}
+			  
+		}
+	}
+	
+
+	
+	public Node buildNode(Document iDocument) throws ContentException
+	{
+		LinkedList<NodeDescriptor> nodesToBuild = new LinkedList<NodeDescriptor>();
+		Node returnNode = null;
+		for ( Object[] nextPair : subQueries )
+		{
+			DOMXPath query = ( DOMXPath )( nextPair[0] );
+			NodeDescriptor descriptor = ( NodeDescriptor )( nextPair[1] );
+			
+			Object resultObject = 
+			  JaxenXPathSingleNodeQuery.runSingleNodeQuery( 
+			    query, iDocument, query.getRootExpr().getText() );
+			    
+			if (( resultObject == null )||
+				((resultObject instanceof java.util.List) && (((java.util.List)resultObject).isEmpty())))
+			{
+				if ( !descriptor.canBuild() )
+				{
+				    if ( !descriptor.getName().equals("*") )
+				    {
+				        throw new ContentException("CAN_NOT_BUILD");
+				    }
+				}
+				nodesToBuild.addFirst( descriptor );
+			}
+			else
+			{
+				returnNode = DOMUtil.buildNodes( ( Node ) resultObject, nodesToBuild );
+				break;
+			}
+			
+		}
+		if ( returnNode == null )
+		{
+			returnNode = DOMUtil.buildNodes( iDocument, nodesToBuild );
+		}
+		return returnNode;
+	}
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenQueryFactory.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenQueryFactory.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenQueryFactory.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenQueryFactory.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,26 @@
+package org.apache.ode.capi.impl.query.jaxen;
+
+import java.util.HashMap;
+
+import org.apache.ode.capi.ContentException;
+import org.apache.ode.capi.Query;
+import org.apache.ode.capi.QueryFactory;
+
+public class JaxenQueryFactory implements QueryFactory {
+
+	public Query createQuery(String queryLanguage, String expression,
+			HashMap namespaceMap) throws ContentException {
+		
+		if ( supportsQuery(queryLanguage)) {
+			return new JaxenXPathSingleNodeQuery(expression,namespaceMap);
+		} else {
+			throw new UnsupportedOperationException();
+		}
+
+	}
+
+	public boolean supportsQuery(String queryLanguage) {
+		return queryLanguage.equals(Query.DEFAULT_QUERY_LANGUAGE);
+	}
+
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenXPathSingleNodeQuery.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenXPathSingleNodeQuery.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenXPathSingleNodeQuery.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/JaxenXPathSingleNodeQuery.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.ode.capi.ContentException;
+import org.apache.ode.capi.Query;
+import org.jaxen.JaxenException;
+import org.jaxen.NamespaceContext;
+import org.jaxen.SimpleNamespaceContext;
+import org.jaxen.XPathFunctionContext;
+import org.jaxen.dom.DOMXPath;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class JaxenXPathSingleNodeQuery implements DocumentQuery, 
+Serializable
+{
+
+    static final long serialVersionUID = 8007784523598625657L;
+	private HashMap namespaceMap = null;
+	private SimpleNamespaceContext namespaceContext = null;
+	private transient Map<Thread,DOMXPath> DOMXPathHM;	
+	private String expression;
+	private boolean shouldCreateNode = false;
+	private NodeBuilder nodeBuilder = null;
+
+	public JaxenXPathSingleNodeQuery()
+	{
+		super();
+	}
+
+	public JaxenXPathSingleNodeQuery(
+		String iXPathExpression,
+		HashMap iNamespaceMap)
+		throws ContentException
+	{
+		setNamespaceMap(iNamespaceMap);
+		setXPathExpression(iXPathExpression);
+
+	}
+	
+	public JaxenXPathSingleNodeQuery(
+			String XPathExpression,
+			HashMap namespaceMap,
+			DOMXPath locator ) throws Exception
+	{
+		setNamespaceMap( namespaceMap );
+		setXPathExpression( XPathExpression );
+		setLocator( locator );
+	}
+	
+	public void setLocator( DOMXPath locator )
+	{
+		locator.setFunctionContext(new XPathFunctionContext());
+		if ( DOMXPathHM == null ) {
+			DOMXPathHM = Collections.synchronizedMap(new HashMap<Thread,DOMXPath>());
+		}
+		DOMXPathHM.put(Thread.currentThread(),locator);
+	}
+
+	public DOMXPath createLocator() throws ContentException
+	{
+		if ( DOMXPathHM == null ) {
+			DOMXPathHM = Collections.synchronizedMap(new HashMap<Thread,DOMXPath>());
+		}
+		DOMXPath locator = (DOMXPath)DOMXPathHM.get(Thread.currentThread());
+		if (locator == null)
+		{
+			if ((expression != null) && (namespaceMap != null))
+			{
+				try {
+					locator = new DOMXPath(this.getXPathExpression());
+				} catch (Exception e) {
+					throw new ContentException("NATIVE_EXCEPTION",e);
+				}
+				locator.setNamespaceContext(createNamespaceContext());
+				locator.setFunctionContext(new XPathFunctionContext());
+				DOMXPathHM.put(Thread.currentThread(),locator);
+			}
+		}
+		return locator;
+	}
+
+	public String getXPathExpression() throws Exception
+	{
+		return expression;
+	}
+
+	public void setXPathExpression(String iExpression) throws ContentException
+	{
+		expression = iExpression;
+		createLocator();
+	}
+
+	public void setShouldCreateNode(boolean iShouldCreateNode)
+	{
+		shouldCreateNode = iShouldCreateNode;
+	}
+
+	public boolean getShouldCreateNode()
+	{
+		return shouldCreateNode;
+	}
+
+	public NamespaceContext createNamespaceContext()
+	{
+		if (namespaceContext == null)
+		{
+			namespaceContext = new SimpleNamespaceContext(namespaceMap);
+		}
+
+		return namespaceContext;
+	}
+
+	public void setNamespaceMap(HashMap iNamespaceMap) throws ContentException
+	{
+		namespaceMap = iNamespaceMap;
+		createNamespaceContext();
+		createLocator();
+	}
+
+	public HashMap getNamespaceMap()
+	{
+		return namespaceMap;
+	}
+
+	public static Object runSingleNodeQuery(
+		DOMXPath iQuery,
+		Document iDocument,
+		String xpath)
+		throws ContentException
+	{
+		
+		Object result;
+		try {
+			result = iQuery.evaluate(iDocument);
+		} catch (JaxenException e) {
+			throw new ContentException("NATIVE_EXCEPTION",e);
+		}
+		Object resultObject = null;
+
+		if (result instanceof ArrayList)
+		{
+
+			ArrayList arrayList = (ArrayList) (result);
+			if (arrayList.size() > 1)
+			{
+				throw new ContentException("AMBIGUOUS_NODE");
+			}
+
+			Iterator iterator = arrayList.iterator();
+			if (iterator.hasNext())
+			{
+				resultObject = (iterator.next());
+			}
+		} else if (result.equals(Collections.EMPTY_LIST))
+		{
+			resultObject = null;
+		}else
+		{
+			resultObject = result;
+		}
+		return resultObject;
+	}
+
+	public Object runQuery(Document iDocument) throws ContentException
+	{
+		DOMXPath xpath = createLocator();
+		return runSingleNodeQuery(xpath, iDocument, expression);
+
+	}
+
+	synchronized private void createNodeBuilder() throws JaxenException
+	{
+		if ( nodeBuilder == null )
+		{
+			nodeBuilder = new JaxenNodeBuilder( namespaceMap,
+			  this.expression );
+		}
+	}
+	
+	public Node buildQueriedNode(Document iDocument) throws ContentException
+	{
+		if ( nodeBuilder == null )
+		{
+			try {
+				createNodeBuilder();
+			} catch (JaxenException e) {
+				throw new ContentException("NATIVE_EXCEPTION",e);
+			}
+		}
+		return nodeBuilder.buildNode(iDocument);
+	}
+
+	public String getExpression() {
+		return expression;
+	}
+
+	public String getQueryLanguage() {
+
+		return Query.DEFAULT_QUERY_LANGUAGE;
+	}
+
+
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeBuilder.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeBuilder.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeBuilder.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import org.apache.ode.capi.ContentException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public interface NodeBuilder
+{
+	public Node buildNode( Document iDocument) throws ContentException;
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeDescriptor.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeDescriptor.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/NodeDescriptor.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.Serializable;
+import java.util.HashMap;
+
+import org.apache.xml.utils.XMLChar;
+
+public class NodeDescriptor implements Serializable
+{
+	
+    static final long serialVersionUID = -7444717200424355396L;
+    
+	private String nodeDescriptorString;
+	private String namespacePrefix;
+	private String localName;
+	private String URI;
+	private boolean canBuild;
+	
+	public NodeDescriptor( HashMap iURIMap,  String iNodeDescriptorString )
+	{
+		nodeDescriptorString = iNodeDescriptorString;
+		analyze( iURIMap );
+	}
+	
+	public String getName()
+	{
+		return nodeDescriptorString;
+	}
+	
+	public String getLocalname()
+	{
+		return localName;
+	}
+	
+	public String getPrefix()
+	{
+		return namespacePrefix;
+	}
+	
+	public String getNamespaceURI()
+	{
+		return URI;
+	}
+	
+	private void analyze( HashMap iURIMap )
+	{
+		int length = nodeDescriptorString.length();
+		int currentIndex = 0;
+		int currentChar = 0;
+		localName = nodeDescriptorString;
+		namespacePrefix = "";
+		canBuild = true;
+		while( currentIndex < length )
+		{
+			currentChar = nodeDescriptorString.charAt( currentIndex );
+			if ( currentChar == XPathParser.COLON )
+			{
+				namespacePrefix = 
+				  nodeDescriptorString.substring( 0, currentIndex );
+				URI = (String)iURIMap.get(namespacePrefix);
+				localName = 
+				  nodeDescriptorString.substring( currentIndex + 1, length );
+			}
+			else if ( !(  XMLChar.isName( currentChar ) ) )
+			{
+				//If the node is not simply an element name
+				//then we can't build it.
+				canBuild = false;
+				localName = null;
+				URI = null;
+				namespacePrefix=null;
+				
+				break;
+			}	
+			currentIndex++;		
+		}
+		
+	}
+	
+	public String toString()
+	{
+		return nodeDescriptorString;
+	}
+	
+	public void dump( OutputStream iOutputStream )
+	{
+		PrintStream printStream = new PrintStream( iOutputStream );
+		printStream.println( "Name = " + wrap(nodeDescriptorString) );
+		printStream.println( "prefix = " + wrap(namespacePrefix) );
+		printStream.println( "localName = " + wrap(localName) );
+		printStream.println( "namespaceURI = " + wrap(URI));
+		printStream.println( "canBuild = " + canBuild );
+	}
+	
+	private String wrap( String iString )
+	{
+		return "<"+iString+">";
+	}
+	
+	public boolean canBuild()
+	{
+		return canBuild;
+	}
+
+}

Added: incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/XPathParser.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/XPathParser.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/XPathParser.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/main/java/org/apache/ode/capi/impl/query/jaxen/XPathParser.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.capi.impl.query.jaxen;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+
+public class XPathParser implements Serializable
+{
+    static final long serialVersionUID = -8922198154683798177L;
+    
+	private LinkedList<NodeDescriptor> nodeDescriptors = null;
+	private String expression = null;
+	private HashMap uriMap = null;
+	
+	private int expressionLength;
+	private int currentIndex;
+	private boolean parseActive;
+	
+	static final int QUOTE = '"';
+	static final int TICK = '\'';
+	static final int LEFT_BRACKET = '[';
+	static final int RIGHT_BRACKET = ']';
+	static final int COLON = ':';
+	static final int FORWARD_SLASH = '/';
+			
+	public XPathParser()
+	{
+	}
+
+	public XPathParser(HashMap iURIMap, String iXPathExpression)
+	{
+		setURIMap( iURIMap );
+		setXPathExpression(iXPathExpression);
+	}
+
+	private synchronized void parseExpression()
+	{	
+		if ( nodeDescriptors != null )
+		{
+			return;
+		}
+		expressionLength = expression.length();
+		currentIndex = 0;
+		parseActive = true;
+		nodeDescriptors = new LinkedList<NodeDescriptor>();
+		
+		while ( parseActive && ( currentIndex < expressionLength ) )
+		{
+			parseNodeDescriptor();
+		}		
+		parseActive = false;
+	}
+	
+	private void parseNodeDescriptor()
+	{	
+		int startIndex = currentIndex;
+		int stopIndex = 0;
+		
+		while (true)
+		{
+			if ( currentIndex >= expressionLength )
+			{
+				stopIndex = expressionLength;
+				break;
+			}
+			
+			int currentChar = expression.charAt(currentIndex);
+			//	Skip past any literals contained in the expression.
+			if (currentChar == QUOTE || currentChar == TICK)
+			{
+				int closeIndex =
+					expression.indexOf(currentChar, currentIndex + 1);
+				if (closeIndex >= 0)
+				{
+					currentIndex = closeIndex + 1;
+				} 
+				else
+				{
+					parseActive = false;
+					break;
+				}
+			}
+			else if ( currentChar == LEFT_BRACKET )
+			{
+				int closeIndex =
+					expression.indexOf(RIGHT_BRACKET, currentIndex + 1);
+					
+				if (closeIndex >= 0)
+				{
+					currentIndex = closeIndex + 1;
+				} 
+				else
+				{
+					parseActive = false;
+					break;
+				}
+			}
+			else if ( currentChar == FORWARD_SLASH )
+			{
+				stopIndex = currentIndex;
+				currentIndex++;
+				break;
+				
+			}
+			else
+			{
+				currentIndex++;
+			}
+			
+		}
+
+		String nodeDescriptorString = expression.substring( startIndex, stopIndex );
+		if ( nodeDescriptorString.length() > 0)
+		{
+		    addNodeDescriptor( nodeDescriptorString );
+		}
+	}
+	
+	private void addNodeDescriptor( String iDescriptorString )
+	{
+		NodeDescriptor nodeDescriptor = new NodeDescriptor( getURIMap(), iDescriptorString );
+		nodeDescriptors.addLast( nodeDescriptor );
+	}
+	
+	public void setXPathExpression(String iExpression)
+	{
+		expression = iExpression;
+	}
+
+	public String getXPathExpression()
+	{
+		return expression;
+	}
+	
+	public void setURIMap( HashMap iHashMap )
+	{
+		uriMap = iHashMap;
+	}
+	
+	public HashMap getURIMap()
+	{
+		return uriMap;
+	}
+
+	public void dump( OutputStream iOutputStream )
+	{
+		PrintStream printStream = new PrintStream( iOutputStream );
+		printStream.println( "XPathExpression = " + expression);
+		printStream.println( "Node Descriptors:" );
+		LinkedList<NodeDescriptor> nodeDescriptors = getNodeDescriptors();
+		int count = 0;
+		for ( NodeDescriptor nodeDescriptor : nodeDescriptors )
+		{
+			count++;
+			printStream.println( count + ")" );
+			nodeDescriptor.dump(iOutputStream ); 
+		}
+		
+		
+	}
+	
+	public LinkedList<NodeDescriptor> getNodeDescriptors()
+	{
+		if ( nodeDescriptors == null )
+		{
+			parseExpression();
+		}
+		return nodeDescriptors;
+	}
+}

Added: incubator/ode/scratch/ode/bpel-content/src/test/java/org/apache/ode/capi/ContentTest.java
URL: http://svn.apache.org/viewvc/incubator/ode/scratch/ode/bpel-content/src/test/java/org/apache/ode/capi/ContentTest.java?rev=416172&view=auto
==============================================================================
--- incubator/ode/scratch/ode/bpel-content/src/test/java/org/apache/ode/capi/ContentTest.java (added)
+++ incubator/ode/scratch/ode/bpel-content/src/test/java/org/apache/ode/capi/ContentTest.java Wed Jun 21 16:28:38 2006
@@ -0,0 +1,320 @@
+package org.apache.ode.capi;
+
+import java.util.HashMap;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.ode.capi.DescribedContent;
+import org.apache.ode.capi.FormattableContent;
+import org.apache.ode.capi.Interaction;
+import org.apache.ode.capi.InteractionFactory;
+import org.apache.ode.capi.Query;
+import org.apache.ode.capi.QueryFactory;
+import org.apache.ode.capi.impl.interaction.MasterInteractionFactory;
+import org.apache.ode.capi.impl.query.MasterQueryFactory;
+
+/**
+ * Unit test for simple App.
+ */
+public class ContentTest 
+    extends TestCase
+{
+	InteractionFactory masterInteractionFactory;
+	QueryFactory masterQueryFactory;
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public ContentTest( String testName )
+    {
+        super( testName );
+        masterInteractionFactory = MasterInteractionFactory.newInstance();
+        masterQueryFactory = MasterQueryFactory.newInstance();
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( ContentTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testCopyFragToNode() throws Exception
+    {
+    	
+    	/*
+    	 * Something like this BPEL
+    	 * 
+    	 * <assign>
+    	 *   <copy>
+    	 *      <from xmlns:ns2="http://ns2">$var.part2/ns2:x</from>
+    	 *      <to xmlns:ns1="http://ns1">var.part1/ns1:a/ns1:b/ns1:c</to>
+    	 *    </copy>
+    	 * </assign>
+    	 * 
+    	 */
+    	
+    	// deployer will parse the bpel and create the needed query objects
+    	Query queryTo = null;
+    	Query queryFrom = null;
+    	if ( masterQueryFactory.supportsQuery("urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0")) {
+    		HashMap<String,String> namespaceMap = new HashMap<String,String>();
+    		namespaceMap.put("ns1","http://ns1");
+    		namespaceMap.put("ns2","http://ns2");
+    		queryTo = masterQueryFactory.createQuery(
+    			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/ns1:a/ns1:b/ns1:c",namespaceMap);
+    		queryFrom = masterQueryFactory.createQuery(
+        			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/ns2:x",namespaceMap);
+    	}
+    	
+    	// integration layer builds described content for the message parts and sends it in
+    	DescribedContent dc1 = 
+    		new DescribedContent(
+    				"<ns1:a xmlns:ns1=\"http://ns1\">" +
+    					"<ns1:b>" +
+    						"<ns1:c/>" +
+    					"</ns1:b>" +
+    				"</ns1:a>",
+    				"http://www.w3.org/TR/REC-xml");
+    	DescribedContent dc2 = 
+    		new DescribedContent("" +
+    				"<ns2:x xmlns:ns2=\"http://ns2\">" +
+    					"<ns2:y>" +
+    						"<ns2:z/>" +
+    					"</ns2:y>" +
+    				"</ns2:x>",
+    				"http://www.w3.org/TR/REC-xml");
+    	
+    	// engine creates interactions for the assign
+    	Interaction interaction1 = null;
+    	Interaction interaction2 = null;
+    	if ( masterInteractionFactory.supportsInteraction(dc1)) {
+    		interaction1 = masterInteractionFactory.createInteraction(dc1);
+    	}
+    	if ( masterInteractionFactory.supportsInteraction(dc2)) {
+    		interaction2 = masterInteractionFactory.createInteraction(dc2);
+    	}
+
+    	
+    	// engine executes bpel assign action
+    	if ( interaction1.supportsCopySubElements(queryTo,interaction2.getValue())  &&
+    			interaction2.supportsGetComplexValue(queryFrom) ) {
+    		interaction1.copySubElements(queryTo,interaction2.getComplexValue(queryFrom));
+    	}
+    	
+    	// engine sends formattable content back to integration layer through 
+    	// invoke or reply
+    	FormattableContent fv = interaction1.getValue();
+    	
+    	// integration layer can get the value as a supported type
+    	byte[] ba = null;
+    	if ( fv.supportsGetValueAs(byte[].class)) {
+    		ba = (byte[])fv.getValueAs(byte[].class);
+    	}
+    	
+        assertEquals(new String(ba), 
+        		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+        		"<ns1:a xmlns:ns1=\"http://ns1\">" +
+        			"<ns1:b>" +
+        				"<ns1:c>" +
+        					"<ns2:y xmlns:ns2=\"http://ns2\">" +
+        						"<ns2:z/>" +
+        					"</ns2:y>" +
+        				"</ns1:c>" +
+        			"</ns1:b>" +
+        		"</ns1:a>");
+    }
+    
+    public void testCopyAttributeToNode() throws Exception {
+    	
+       	/*
+    	 * Something like this BPEL
+    	 * 
+    	 * <assign>
+    	 *   <copy>
+    	 *      <from>$var.part2/x/@attr</from>
+    	 *      <to>var.part1/a/b/c</to>
+    	 *    </copy>
+    	 * </assign>
+    	 * 
+    	 */
+    	
+    	// deployer will parse the bpel and create the needed query objects
+    	Query queryTo = null;
+    	Query queryFrom = null;
+    	if ( masterQueryFactory.supportsQuery("urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0")) {
+    		HashMap<String,String> namespaceMap = new HashMap<String,String>();
+    		queryTo = masterQueryFactory.createQuery(
+    			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/a/b/c",namespaceMap);
+    		queryFrom = masterQueryFactory.createQuery(
+        			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/x/@attr",namespaceMap);
+    	}
+    	
+    	// integration layer builds described content for the message parts and sends it in
+    	DescribedContent dc1 = 
+    		new DescribedContent("<a><b><c/></b></a>",
+    				"http://www.w3.org/TR/REC-xml");
+    	DescribedContent dc2 = 
+    		new DescribedContent("<x attr=\"stuff\"><y><z/></y></x>",
+    				"http://www.w3.org/TR/REC-xml");
+    	
+    	// engine creates interactions for the assign
+    	Interaction interaction1 = null;
+    	Interaction interaction2 = null;
+    	if ( masterInteractionFactory.supportsInteraction(dc1)) {
+    		interaction1 = masterInteractionFactory.createInteraction(dc1);
+    	}
+    	if ( masterInteractionFactory.supportsInteraction(dc2)) {
+    		interaction2 = masterInteractionFactory.createInteraction(dc2);
+    	}
+
+    	
+    	// engine executes bpel assign action
+    	if ( interaction1.supportsSetSimpleValue(queryTo,interaction2.getValue())  &&
+    			interaction2.supportsGetSimpleValue(queryFrom) ) {
+    		interaction1.setSimpleValue(queryTo,interaction2.getSimpleValue(queryFrom));
+    	}
+    	
+    	// engine sends formattable content back to integration layer through 
+    	// invoke or reply
+    	FormattableContent fv = interaction1.getValue();
+    	
+    	// integration layer can get the value as a supported type
+    	byte[] ba = null;
+    	if ( fv.supportsGetValueAs(byte[].class)) {
+    		ba = (byte[])fv.getValueAs(byte[].class);
+    	}
+    	
+        assertEquals(new String(ba), 
+        		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+        		"<a><b><c>stuff</c></b></a>");
+    	
+    }
+    
+    public void testCopyAtomicToNode() throws Exception {
+       	/*
+    	 * Something like this BPEL where var.part2 is not XML
+    	 * 
+    	 * <assign>
+    	 *   <copy>
+    	 *      <from>$var.part2</from>
+    	 *      <to>var.part1/a/b/c</to>
+    	 *    </copy>
+    	 * </assign>
+    	 * 
+    	 */
+    	
+    	// deployer will parse the bpel and create the needed query objects
+    	Query queryTo = null;
+    	if ( masterQueryFactory.supportsQuery("urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0")) {
+    		HashMap<String,String> namespaceMap = new HashMap<String,String>();
+    		queryTo = masterQueryFactory.createQuery(
+    			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/a/b/c",namespaceMap);
+    	}
+    	
+    	// integration layer builds described content for the message parts and sends it in
+    	DescribedContent dc1 = 
+    		new DescribedContent("<a><b><c/></b></a>",
+    				"http://www.w3.org/TR/REC-xml");
+    	DescribedContent dc2 = 
+    		new DescribedContent("stuff","ATOMIC");
+    	
+    	// engine creates interactions for the assign
+    	Interaction interaction1 = null;
+    	Interaction interaction2 = null;
+    	if ( masterInteractionFactory.supportsInteraction(dc1)) {
+    		interaction1 = masterInteractionFactory.createInteraction(dc1);
+    	}
+    	if ( masterInteractionFactory.supportsInteraction(dc2)) {
+    		interaction2 = masterInteractionFactory.createInteraction(dc2);
+    	}
+
+    	
+    	// engine executes bpel assign action
+    	if ( interaction1.supportsSetSimpleValue(queryTo,interaction2.getValue())) {
+    		interaction1.setSimpleValue(queryTo,interaction2.getValue());
+    	}
+    	
+    	// engine sends formattable content back to integration layer through 
+    	// invoke or reply
+    	FormattableContent fv = interaction1.getValue();
+    	
+    	// integration layer can get the value as a supported type
+    	byte[] ba = null;
+    	if ( fv.supportsGetValueAs(byte[].class)) {
+    		ba = (byte[])fv.getValueAs(byte[].class);
+    	}
+    	
+        assertEquals(new String(ba), 
+        		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+        		"<a><b><c>stuff</c></b></a>");
+    }
+    
+    
+    public void testCopyAtomicToAttribute() throws Exception {
+       	/*
+    	 * Something like this BPEL where var.part2 is not XML
+    	 * 
+    	 * <assign>
+    	 *   <copy>
+    	 *      <from>$var.part2</from>
+    	 *      <to>var.part1/a/b/c/@attr</to>
+    	 *    </copy>
+    	 * </assign>
+    	 * 
+    	 */
+    	
+    	// deployer will parse the bpel and create the needed query objects
+    	Query queryTo = null;
+    	if ( masterQueryFactory.supportsQuery("urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0")) {
+    		HashMap<String,String> namespaceMap = new HashMap<String,String>();
+    		queryTo = masterQueryFactory.createQuery(
+    			"urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0","/a/b/c/@attr",namespaceMap);
+    	}
+    	
+    	// integration layer builds described content for the message parts and sends it in
+    	DescribedContent dc1 = 
+    		new DescribedContent("<a><b><c attr=\"junk\"/></b></a>",
+    				"http://www.w3.org/TR/REC-xml");
+    	DescribedContent dc2 = 
+    		new DescribedContent("stuff","ATOMIC");
+    	
+    	// engine creates interactions for the assign
+    	Interaction interaction1 = null;
+    	Interaction interaction2 = null;
+    	if ( masterInteractionFactory.supportsInteraction(dc1)) {
+    		interaction1 = masterInteractionFactory.createInteraction(dc1);
+    	}
+    	if ( masterInteractionFactory.supportsInteraction(dc2)) {
+    		interaction2 = masterInteractionFactory.createInteraction(dc2);
+    	}
+
+    	
+    	// engine executes bpel assign action
+    	if ( interaction1.supportsSetSimpleValue(queryTo,interaction2.getValue())) {
+    		interaction1.setSimpleValue(queryTo,interaction2.getValue());
+    	}
+    	
+    	// engine sends formattable content back to integration layer through 
+    	// invoke or reply
+    	FormattableContent fv = interaction1.getValue();
+    	
+    	// integration layer can get the value as a supported type
+    	byte[] ba = null;
+    	if ( fv.supportsGetValueAs(byte[].class)) {
+    		ba = (byte[])fv.getValueAs(byte[].class);
+    	}
+    	
+        assertEquals(new String(ba), 
+        		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+        		"<a><b><c attr=\"stuff\"/></b></a>");
+    }
+    
+}