[jboss-svn-commits] JBL Code SVN: r12162 - in labs/jbossesb/trunk/product: core/listeners/src/org/jboss/soa/esb/actions/converters and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat May 26 13:53:41 EDT 2007


Author: beve
Date: 2007-05-26 13:53:41 -0400 (Sat, 26 May 2007)
New Revision: 12162

Added:
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java
   labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/util/XPathUtilTest.java
Removed:
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java
Modified:
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/AbstractObjectXStream.java
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/XStreamToObject.java
   labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/converters/XStreamToObjectUnitTest.java
   labs/jbossesb/trunk/product/docs/MessageActionGuide.odt
Log:
Commiting work for JIRA : http://jira.jboss.com/jira/browse/JBESB-562


Modified: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/AbstractObjectXStream.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/AbstractObjectXStream.java	2007-05-26 16:26:26 UTC (rev 12161)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/AbstractObjectXStream.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -17,37 +17,38 @@
 public abstract class AbstractObjectXStream extends AbstractActionPipelineProcessor {
 	
 	
-	 protected String classAlias;
-	    protected boolean excludePackage = true;
-	    protected String classMethod;
-	    protected Class processorClass;
-		protected String classProcessor;
-		 private String name;
+	protected String classAlias;
+	protected String rootNodeName;
+	protected boolean excludePackage = true;
+	protected String classMethod;
+    protected Class processorClass;
+	protected String classProcessor;
+	private String name;
 		 
 	    
-	    /**
-	     * Public constructor.
-	     * @param properties Action Properties.
-	     * @throws ConfigurationException Action not properly configured.
-	     */
-	    public AbstractObjectXStream(ConfigTree properties) {
-	    	this( properties.getName(), properties.attributesAsList());
-	    }
+    /**
+     * Public constructor.
+     * @param properties Action Properties.
+     * @throws ConfigurationException Action not properly configured.
+     */
+    public AbstractObjectXStream(ConfigTree properties) {
+    	this( properties.getName(), properties.attributesAsList());
+    }
 	    
-	    /**
-	     * Public constructor.
-	     * @param actionName Action name.
-	     * @param properties Action Properties.
-	     * @throws ConfigurationException Action not properly configured.
-	     */
-	    public AbstractObjectXStream(String actionName, List<KeyValuePair> properties) {
-	    	name = actionName;
-	    	classAlias = KeyValuePair.getValue("class-alias", properties, null);
-	        excludePackage = KeyValuePair.getBooleanValue("exclude-package", properties, true);
-	    }
+    /**
+     * Public constructor.
+     * @param actionName Action name.
+     * @param properties Action Properties.
+     * @throws ConfigurationException Action not properly configured.
+     */
+    public AbstractObjectXStream(String actionName, List<KeyValuePair> properties) {
+    	name = actionName;
+    	classAlias = KeyValuePair.getValue("class-alias", properties, null);
+        excludePackage = KeyValuePair.getBooleanValue("exclude-package", properties, true);
+        rootNodeName = KeyValuePair.getValue("root-node", properties, null );
+    }
 	
 	
-	
 	public String getName() {
 		return name;
 	}
@@ -74,4 +75,9 @@
 		return classAlias;
 	}
 
+	public String getRootNodeName()
+	{
+		return rootNodeName;
+	}
+
 }

Modified: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/XStreamToObject.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/XStreamToObject.java	2007-05-26 16:26:26 UTC (rev 12161)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/converters/XStreamToObject.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -1,10 +1,14 @@
 package org.jboss.soa.esb.actions.converters;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+
 import org.apache.log4j.Logger;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.actions.ActionProcessingException;
@@ -13,9 +17,14 @@
 import org.jboss.soa.esb.helpers.KeyValuePair;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.util.ClassUtil;
+import org.jboss.soa.esb.util.XPathUtil;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
 import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
 import com.thoughtworks.xstream.io.xml.DomDriver;
+import com.thoughtworks.xstream.io.xml.DomReader;
 
 
 /**
@@ -29,11 +38,14 @@
  *     &lt;property name="class-alias" value="Customer" /&gt; &lt;!-- Optional. Class alias used in call to <a href="http://xstream.codehaus.org/javadoc/com/thoughtworks/xstream/XStream.html">XStream.alias(String, Class)</a> prior to deserialisation. --&gt;
  *     &lt;property name="incoming-type" value="CustomerProcessor" /&gt; &lt;!-- Required. Class for incoming type used to process the message after  deserialisation. --&gt;
  *     &lt;property name="exclude-package" value="false" /&gt; &lt;!-- Optional. Default "true".  Not applicable if a "class-alias" is specified. --&gt;
- *     &lt;aliases&gt; &lt;!-- Optional list of extra aliases to add to XStream  --&gt;
+ *     &lt;property name="root-node" value="/root/Customer" /&gt; 
+ *     &lt;!-- Optional. Specify an XPath expression be used to determine the root node used with XStream. 
+ *     Useful when the object to convert is not the root node of the document --&gt;
+ *     &lt;property name="aliases"&gt; &lt;!-- Optional list of extra aliases to add to XStream  --&gt;
  * 		&lt;alias name="aliasName" class="className" /&gt; 
  * 		&lt;alias name="aliasName" class="className" /&gt; 
  * 		...
- *     &lt;/aliases&gt;
+ *     &lt;/property&gt;
  * &lt;/Action&gt;
  * </pre>
  * <p/>
@@ -89,23 +101,15 @@
 	public Message process(Message message) throws ActionProcessingException {
 		Object object = ActionUtils.getTaskObject(message);
 		
-		String xml = object.toString();
-
-		XStream xstream = new XStream(new DomDriver());
-		
-        xstream.alias(getAlias(incomingType), incomingType);
-        addAliases( aliases, xstream );
-        
-        Object arg;
 		try {
-			arg = incomingType.newInstance();
-			arg = xstream.fromXML(xml, arg);
-   		 	ActionUtils.setTaskObject(message,arg);
+			Object toObject = incomingType.newInstance();
+			fromXmlToObject( object.toString(), toObject );
+   		 	ActionUtils.setTaskObject(message,toObject);
 		} catch (InstantiationException e) {
-			e.printStackTrace();
+			logger.error( e );
 			throw new ActionProcessingException("Could not invoke for Arg: " + getName(),e );
 		} catch (IllegalAccessException e) {
-			e.printStackTrace();
+			logger.error( e );
 			throw new ActionProcessingException("Could not access for Arg: " + getName(),e );
 		} 
 		
@@ -159,4 +163,68 @@
 		}
 	}
 	
+	/**
+	 * 
+	 * @param xml		the xml String
+	 * @param root		an instance of the type of the root element
+	 * @throws ActionProcessingException
+	 * @throws ParserConfigurationException 
+	 * @throws IOException 
+	 * @throws SAXException 
+	 */
+	protected void fromXmlToObject(String xml, Object root ) throws ActionProcessingException
+	{
+		HierarchicalStreamReader reader = null;
+		try
+		{
+			XStream xstream = new XStream( new DomDriver() );
+			
+			reader = new DomReader( getRootElement( xml, rootNodeName ) );
+				
+	        xstream.alias(getAlias(incomingType), incomingType);
+	        addAliases( aliases, xstream );
+		        
+			xstream.unmarshal( reader, root );
+			
+		}
+		finally 
+		{
+			if ( reader != null)  reader.close();
+		}
+	}
+
+	/*
+	 * Simply delegates to XPathUtil and catches exceptions specific
+	 * to that class and rethrows an ActionProcessingException
+	 */
+	private Element getRootElement( String xml, String xPathExpression ) throws ActionProcessingException
+	{
+		logger.debug( "rootNodeName : " + xPathExpression );
+		
+		try
+		{
+			return XPathUtil.getNodeFromXPathExpression( xml, xPathExpression );
+		} 
+		catch (ParserConfigurationException e)
+		{
+			logger.error( e );
+			throw new ActionProcessingException( e );
+		} 
+		catch (SAXException e)
+		{
+			logger.error( e );
+			throw new ActionProcessingException( e );
+		} 
+		catch (IOException e)
+		{
+			logger.error( e );
+			throw new ActionProcessingException( e );
+		}
+		catch (XPathExpressionException e)
+		{
+			logger.error( e );
+			throw new ActionProcessingException( e );
+		}
+	}
+	
 }

Copied: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util (from rev 12161, labs/jbossesb/workspace/dbevenius/product/core/listeners/src/org/jboss/soa/esb/util)

Deleted: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java	2007-05-26 16:26:26 UTC (rev 12161)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -1,156 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source Copyright 2006, JBoss Inc., and
- * individual contributors as indicated by the @authors tag. See the
- * copyright.txt in the distribution for a full listing of individual
- * contributors.
- * 
- * This is free software; you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- * 
- * This software is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this software; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
- * site: http://www.fsf.org.
- */
-package org.jboss.soa.esb.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.Closeable;
-import java.io.IOException;
-
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-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 org.apache.log4j.Logger;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-/**
- * Util methods for XPath related operations.
- * 
- * @author <a href="daniel.bevenius at redpill.se">Daniel Bevenius</a>				
- * @since 4.2
- *
- */
-public class XPathUtil
-{
-	private static Logger log = Logger.getLogger( XPathUtil.class );
-	
-	/**
-	 * Parses the passed in xml and creates a Dom Document
-	 * 
-	 * @param xml
-	 * @return Document
-	 * @throws SAXException
-	 * @throws IOException
-	 * @throws ParserConfigurationException
-	 */
-	public static org.w3c.dom.Document getDocument( String xml ) throws SAXException, IOException, ParserConfigurationException
-	{
-		if (xml == null) 
-			throw new IllegalArgumentException( "xml must not be null" );
-		
-		ByteArrayInputStream inputStream = null;
-		try
-		{
-			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
-			inputStream = new ByteArrayInputStream( xml.getBytes() );
-			return documentBuilder.parse( inputStream );
-		} 
-		finally
-		{
-			close( inputStream );
-		}
-	}
-	
-	/**
-	 * Will compile the passed in XPath expression and evalutate it
-	 * against the passed in doument.
-	 * 
-	 * @param document			Document that the XPath expression should evaluate upon.
-	 * @param xPathExpression	XPath expression
-	 * @return Element			The Element found
-	 * @throws XPathExpressionException
-	 */
-	public static Element getNodeFromXPathExpression( Document document, String xPathExpression ) throws XPathExpressionException
-	{
-		if (document == null)
-			throw new IllegalArgumentException( "document must not be null" );
-		
-		if ( xPathExpression == null )
-			return document.getDocumentElement();
-		
-		Node rootNode = (Node) getQNameFromXPathExpression( document, xPathExpression, XPathConstants.NODE );
-		
-		return (Element) rootNode;
-	}
-	
-	/**
-	 * @param xml				XML string that will be the target of the XPath evaluation
-	 * @param document			Document that the XPath expression should evaluate upon.
-	 * @param xPathExpression	XPath expression
-	 * @return Element			The Element found
-	 * 
-	 * @throws XPathExpressionException
-	 * @throws SAXException
-	 * @throws IOException
-	 * @throws ParserConfigurationException
-	 */
-	public static Element getNodeFromXPathExpression( String xml, String xPathExpression ) throws XPathExpressionException, SAXException, IOException, ParserConfigurationException
-	{
-		return getNodeFromXPathExpression( getDocument( xml ), xPathExpression );
-	}
-	
-	/**
-	 * All public methods should be able to delegate the actual XPath evaluation
-	 * to this method.
-	 * 
-	 * @param document			Document that the XPath expression should evaluate upon.
-	 * 							Must not be null. This caller is responsible for checking for null.
-	 * @param xPathExpression	XPath expression
-	 * 							Must not be null. This caller is responsible for checking for null.
-	 * @param type				The XPathConstant type to use. The affects the type returned from the evaluate method.
-	 * 
-	 * @return Object			of type specified in the passed in <code>type</code> argument
-	 * 
-	 * @throws XPathExpressionException
-	 */
-	private static Object getQNameFromXPathExpression( Document document, String xPathExpression, QName type ) throws XPathExpressionException
-	{
-		XPath xpath = XPathFactory.newInstance().newXPath();
-		XPathExpression expression = xpath.compile( xPathExpression );
-		
-		return expression.evaluate( document.getDocumentElement(), type );
-	}
-
-	private static void close (Closeable c )
-	{
-		try
-		{
-			if ( c != null )
-				c.close();
-		} 
-		catch (IOException e)
-		{
-			log.error(  "Error when closing IOStream", e );
-		}
-	}
-
-}

Copied: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java (from rev 12161, labs/jbossesb/workspace/dbevenius/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java)
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/util/XPathUtil.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -0,0 +1,156 @@
+/*
+ * JBoss, Home of Professional Open Source Copyright 2006, JBoss Inc., and
+ * individual contributors as indicated by the @authors tag. See the
+ * copyright.txt in the distribution for a full listing of individual
+ * contributors.
+ * 
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ * 
+ * This software is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.Closeable;
+import java.io.IOException;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+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 org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+/**
+ * Util methods for XPath related operations.
+ * 
+ * @author <a href="daniel.bevenius at redpill.se">Daniel Bevenius</a>				
+ * @since 4.2
+ *
+ */
+public class XPathUtil
+{
+	private static Logger log = Logger.getLogger( XPathUtil.class );
+	
+	/**
+	 * Parses the passed in xml and creates a Dom Document
+	 * 
+	 * @param xml
+	 * @return Document
+	 * @throws SAXException
+	 * @throws IOException
+	 * @throws ParserConfigurationException
+	 */
+	public static org.w3c.dom.Document getDocument( String xml ) throws SAXException, IOException, ParserConfigurationException
+	{
+		if (xml == null) 
+			throw new IllegalArgumentException( "xml must not be null" );
+		
+		ByteArrayInputStream inputStream = null;
+		try
+		{
+			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+			inputStream = new ByteArrayInputStream( xml.getBytes() );
+			return documentBuilder.parse( inputStream );
+		} 
+		finally
+		{
+			close( inputStream );
+		}
+	}
+	
+	/**
+	 * Will compile the passed in XPath expression and evalutate it
+	 * against the passed in doument.
+	 * 
+	 * @param document			Document that the XPath expression should evaluate upon.
+	 * @param xPathExpression	XPath expression
+	 * @return Element			The Element found
+	 * @throws XPathExpressionException
+	 */
+	public static Element getNodeFromXPathExpression( Document document, String xPathExpression ) throws XPathExpressionException
+	{
+		if (document == null)
+			throw new IllegalArgumentException( "document must not be null" );
+		
+		if ( xPathExpression == null )
+			return document.getDocumentElement();
+		
+		Node rootNode = (Node) getQNameFromXPathExpression( document, xPathExpression, XPathConstants.NODE );
+		
+		return (Element) rootNode;
+	}
+	
+	/**
+	 * @param xml				XML string that will be the target of the XPath evaluation
+	 * @param document			Document that the XPath expression should evaluate upon.
+	 * @param xPathExpression	XPath expression
+	 * @return Element			The Element found
+	 * 
+	 * @throws XPathExpressionException
+	 * @throws SAXException
+	 * @throws IOException
+	 * @throws ParserConfigurationException
+	 */
+	public static Element getNodeFromXPathExpression( String xml, String xPathExpression ) throws XPathExpressionException, SAXException, IOException, ParserConfigurationException
+	{
+		return getNodeFromXPathExpression( getDocument( xml ), xPathExpression );
+	}
+	
+	/**
+	 * All public methods should be able to delegate the actual XPath evaluation
+	 * to this method.
+	 * 
+	 * @param document			Document that the XPath expression should evaluate upon.
+	 * 							Must not be null. This caller is responsible for checking for null.
+	 * @param xPathExpression	XPath expression
+	 * 							Must not be null. This caller is responsible for checking for null.
+	 * @param type				The XPathConstant type to use. The affects the type returned from the evaluate method.
+	 * 
+	 * @return Object			of type specified in the passed in <code>type</code> argument
+	 * 
+	 * @throws XPathExpressionException
+	 */
+	private static Object getQNameFromXPathExpression( Document document, String xPathExpression, QName type ) throws XPathExpressionException
+	{
+		XPath xpath = XPathFactory.newInstance().newXPath();
+		XPathExpression expression = xpath.compile( xPathExpression );
+		
+		return expression.evaluate( document.getDocumentElement(), type );
+	}
+
+	private static void close (Closeable c )
+	{
+		try
+		{
+			if ( c != null )
+				c.close();
+		} 
+		catch (IOException e)
+		{
+			log.error(  "Error when closing IOStream", e );
+		}
+	}
+
+}

Modified: labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/converters/XStreamToObjectUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/converters/XStreamToObjectUnitTest.java	2007-05-26 16:26:26 UTC (rev 12161)
+++ labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/converters/XStreamToObjectUnitTest.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -22,36 +22,44 @@
 
 package org.jboss.soa.esb.actions.converters;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
-import junit.framework.TestCase;
+import junit.framework.JUnit4TestAdapter;
 
 import org.jboss.soa.esb.actions.ActionProcessingException;
 import org.jboss.soa.esb.actions.ActionUtils;
 import org.jboss.soa.esb.actions.TestBean;
+import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.helpers.KeyValuePair;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.message.format.MessageFactory;
+import org.junit.Test;
 
+import com.thoughtworks.xstream.XStream;
+
 /**
  * XStreamToObject unit tests.
  * @author daniel Marchant
+ * @author Daniel Bevenius
  * @since Version 4.0
  */
-public class XStreamToObjectUnitTest extends TestCase {
-
+public class XStreamToObjectUnitTest {
+	
+	@Test
     public void test_default() throws ActionProcessingException {
         List<KeyValuePair> properties = new ArrayList<KeyValuePair>();
         properties.add(new KeyValuePair("incoming-type",TestBean.class.getName() ));
         
-        
         XStreamToObject xstreamToObject = new XStreamToObject("TestBean-Serialiser", properties);
 
-        
         Message oMsg = MessageFactory.getInstance().getMessage();
 
-        
         String msg = "<" + TestBean.class.getSimpleName() + "> <name>Tom</name><phone>1234</phone></" + TestBean.class.getSimpleName() + ">";
         
         ActionUtils.setTaskObject(oMsg,msg);
@@ -64,6 +72,7 @@
          
     }
 
+	@Test
     public void test_with_package() throws ActionProcessingException {
         List<KeyValuePair> properties = new ArrayList<KeyValuePair>();
         properties.add(new KeyValuePair("exclude-package", "false"));
@@ -71,7 +80,6 @@
         
         XStreamToObject xstreamToObject = new XStreamToObject("TestBean-Serialiser", properties);
 
-        
         Message oMsg = MessageFactory.getInstance().getMessage();
         
         String msg = "<" + TestBean.class.getName() + "> <name>Tom</name><phone>1234</phone></"+ TestBean.class.getName() +">";
@@ -86,6 +94,7 @@
         
     }
 
+	@Test
     public void test_with_alias() throws ActionProcessingException {
         List<KeyValuePair> properties = new ArrayList<KeyValuePair>();
         
@@ -95,7 +104,60 @@
         
         XStreamToObject xstreamToObject = new XStreamToObject("TestBean-Serialiser", properties);
 
+        Message oMsg = MessageFactory.getInstance().getMessage();
         
+        String msg = "<TomsClass><name>Tom</name><phone>1234</phone></TomsClass>";
+        
+        ActionUtils.setTaskObject(oMsg,msg);
+        oMsg = xstreamToObject.process(oMsg);
+       
+        TestBean bean = (TestBean)ActionUtils.getTaskObject(oMsg);
+  
+        assertEquals("Tom", bean.getName());
+        assertEquals("1234", bean.getPhone());
+    }
+    
+	@Test
+    public void getAliases()
+    {
+    	ConfigTree configTree = getConfigTreeWithAliases("TomsClass", false, TestBean.class, null );
+        XStreamToObject xstreamToObject = new XStreamToObject( configTree );
+        
+        Map<String, String> aliases = xstreamToObject.getAliases( configTree );
+        
+        assertAliases( aliases );
+    }
+    
+	@Test
+    public void addAliases() throws ActionProcessingException
+    {
+    	ConfigTree configTree = getConfigTreeWithAliases("TomsClass", false, TestBean.class, null );
+        XStreamToObject xstreamToObject = new XStreamToObject( configTree );
+        
+        Map<String, String> aliases = xstreamToObject.getAliases( configTree );
+        xstreamToObject.addAliases( aliases, new XStream() );
+        
+        assertAliases( aliases );
+    }
+    
+	@Test
+    public void addAliasesNegative() throws ActionProcessingException
+    {
+    	ConfigTree configTree = getConfigTree( "TomsClass", false, TestBean.class, null );
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass", false, TestBean.class, null );
+        
+        Map<String, String> aliases = xstreamToObject.getAliases( configTree );
+        xstreamToObject.addAliases( aliases, new XStream() );
+        
+    	assertEquals( "Aliases map should have been empty!", 0,  aliases.size() );
+    	
+    }
+    
+	@Test
+    public void test_with_multiple_aliases() throws ActionProcessingException {
+    	
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass", false, TestBean.class, null );
+
         Message oMsg = MessageFactory.getInstance().getMessage();
         
         String msg = "<TomsClass><name>Tom</name><phone>1234</phone></TomsClass>";
@@ -108,4 +170,122 @@
         assertEquals("Tom", bean.getName());
         assertEquals("1234", bean.getPhone());
     }
-}
+    
+	@Test
+    public void test_setRootNodeNegative() throws ActionProcessingException
+    {
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass", false, TestBean.class, null );
+        assertEquals ( null , xstreamToObject.getRootNodeName() );
+    }
+    
+	@Test
+    public void fromXmlToObject_with_rootNode() throws ActionProcessingException
+    {
+    	String rootNodeName = "/someNode/TomsClass";
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass", false, TestBean.class, rootNodeName );
+        
+        String xml = "<someNode><TomsClass><name>Tom</name><phone>1234</phone></TomsClass></someNode>";
+        Object obj = new TestBean();
+        
+        xstreamToObject.fromXmlToObject( xml, obj );
+        
+        assertTrue( obj instanceof TestBean );
+        assertEquals("1234", ((TestBean)obj).getPhone());
+    }
+    
+	@Test
+    public void fromXmlToObject_with_rootNode_as_second_child_node() throws ActionProcessingException
+    {
+    	String rootNodeName = "/someNode/TomsClass2";
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass2", false,TestBean2.class, rootNodeName );
+        
+        String xml = "<someNode><TomsClass><name>Tom</name><phone>1234</phone></TomsClass><TomsClass2><name>Daniel</name></TomsClass2></someNode>";
+        Object obj = new TestBean2();
+        
+        xstreamToObject.fromXmlToObject( xml, obj );
+        
+        assertTrue( obj instanceof TestBean2 );
+        assertEquals("Daniel", ((TestBean2)obj).getName());
+    }
+	
+	@Test
+    public void fromXmlToObject_with_rootNode_as_second_child_node_and_sibling() throws ActionProcessingException
+    {
+    	String rootNodeName = "/someNode/TomsClass2[2]";
+        XStreamToObject xstreamToObject = createXStreamObject( "TomsClass2", false,TestBean2.class, rootNodeName );
+        
+        String xml = "<someNode><TomsClass><name>Tom</name><phone>1234</phone></TomsClass><TomsClass2><name>Daniel</name></TomsClass2><TomsClass2><name>Bevenius</name></TomsClass2></someNode>";
+        Object obj = new TestBean2();
+        
+        xstreamToObject.fromXmlToObject( xml, obj );
+        
+        assertTrue( obj instanceof TestBean2 );
+        assertEquals("Bevenius", ((TestBean2)obj).getName());
+    }
+    
+    private XStreamToObject createXStreamObject( String classAlias, boolean exludePackage, Class incomingType, String rootNodeName)
+    {
+    	ConfigTree configTree = getConfigTree( classAlias, exludePackage, incomingType, rootNodeName);
+        return new XStreamToObject( configTree );
+    }
+    
+    private void assertAliases( Map<String, String> aliases )
+    {
+    	assertNotNull( "Aliases map should not have been null!",  aliases );
+        assertEquals( TestBean.class.getName(), aliases.get( "aliasName1" ) );
+        assertEquals( TestBean.class.getName(), aliases.get( "aliasName2" ) );
+    }
+    
+    private ConfigTree getConfigTree(String classAlias, boolean excludePackage, Class incomingType, String rootNodeName)
+	{
+		ConfigTree configTree = new ConfigTree ("test");
+    	configTree.setAttribute( "class-alias", classAlias);
+    	configTree.setAttribute( "exclude-package", String.valueOf( excludePackage ));
+    	configTree.setAttribute( "incoming-type", incomingType.getName());
+    	configTree.setAttribute( "root-node", rootNodeName );
+		return configTree;
+	}
+
+    private ConfigTree getConfigTreeWithAliases(String classAlias, boolean excludePackage, Class incomingType, String rootNodeName)
+	{
+		ConfigTree configTree = getConfigTree( classAlias,false, incomingType, rootNodeName );
+		
+    	ConfigTree alias1 = new ConfigTree( "alias", configTree);
+    	alias1.setAttribute( "name", "aliasName1");
+    	alias1.setAttribute( "class", TestBean.class.getName());
+    	
+    	ConfigTree alias2 = new ConfigTree( "alias", configTree);
+    	alias2.setAttribute( "name", "aliasName2");
+    	alias2.setAttribute( "class", TestBean.class.getName());
+    	
+		return configTree;
+	}
+
+    /**
+     * Just a bean for testing
+     */
+	private static class TestBean2 {
+		private String name;
+
+		public String getName()
+		{
+			return name;
+		}
+
+		public void setName( String name )
+		{
+			this.name = name;
+		}
+		
+	}
+	
+	/**
+	 * Just here to get Ant to find annotated test.
+	 */
+	public static junit.framework.Test suite()
+	{
+		return new JUnit4TestAdapter( XStreamToObjectUnitTest.class);
+	}
+	
+}	
+	
\ No newline at end of file

Copied: labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/util/XPathUtilTest.java (from rev 12161, labs/jbossesb/workspace/dbevenius/product/core/listeners/tests/src/org/jboss/soa/esb/util/XPathUtilTest.java)
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/util/XPathUtilTest.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/util/XPathUtilTest.java	2007-05-26 17:53:41 UTC (rev 12162)
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source Copyright 2006, JBoss Inc., and
+ * individual contributors as indicated by the @authors tag. See the
+ * copyright.txt in the distribution for a full listing of individual
+ * contributors.
+ * 
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ * 
+ * This software is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.util;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+/**
+ * Tests the XPathUtil class
+ * 
+ * @author <a href="daniel.bevenius at redpill.se">Daniel Bevenius</a>				
+ * @since 4.2
+ *
+ */
+public class XPathUtilTest
+{
+	private String xml = "<someNode><childnode><name>Daniel</name></childnode></someNode>";
+	
+	@Test( expected= IllegalArgumentException.class )
+	public void getDocumentNegative() throws SAXException, IOException, ParserConfigurationException
+	{
+		XPathUtil.getDocument( null );
+	}
+	
+	@Test
+	public void getDocument() throws SAXException, IOException, ParserConfigurationException
+	{
+		Document document = XPathUtil.getDocument( xml );
+		assertNotNull( document );
+	}
+	
+	@Test( expected= IllegalArgumentException.class )
+	public void getNodeFromXPathExpressionNegative_null_document( ) throws XPathExpressionException
+	{
+		Document document = null;
+		XPathUtil.getNodeFromXPathExpression( document, "/some/path[0]" );
+	}
+	
+	@Test
+	public void getNodeFromXPathExpression( ) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException
+	{
+		Element node = XPathUtil.getNodeFromXPathExpression( XPathUtil.getDocument( xml ), "/someNode/childnode" );
+		assertEquals( "childnode", node.getNodeName() );
+	}
+	
+	@Test
+	public void getNodeFromXPathExpression_sibling( ) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException
+	{
+		String xml = "<someNode><childnode><name>Daniel</name></childnode><childnode><name>Bevenius</name></childnode></someNode>";
+		Element node = XPathUtil.getNodeFromXPathExpression( XPathUtil.getDocument( xml ), "/someNode/childnode[2]" );
+		assertEquals( "childnode", node.getNodeName() );
+		Node nameNode = node.getElementsByTagName( "name" ).item( 0 );
+		assertNotNull( nameNode );
+		assertEquals( "Bevenius", nameNode.getTextContent() );
+	}
+	
+	@Test
+	public void getNodeFromXPathExpression_StringXml_and_XPathExpression() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException
+	{
+		Element node = XPathUtil.getNodeFromXPathExpression( xml, "/someNode/childnode" );
+		assertEquals( "childnode", node.getNodeName() );
+	}
+
+}

Modified: labs/jbossesb/trunk/product/docs/MessageActionGuide.odt
===================================================================
(Binary files differ)




More information about the jboss-svn-commits mailing list