You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ac...@apache.org on 2007/06/18 12:48:43 UTC

svn commit: r548300 - in /activemq/trunk/activemq-optional/src: main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java

Author: aco
Date: Mon Jun 18 03:48:41 2007
New Revision: 548300

URL: http://svn.apache.org/viewvc?view=rev&rev=548300
Log:
Patch applied for: https://issues.apache.org/activemq/browse/AMQ-1208
Test case added

Modified:
    activemq/trunk/activemq-optional/src/main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java
    activemq/trunk/activemq-optional/src/test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java

Modified: activemq/trunk/activemq-optional/src/main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-optional/src/main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java?view=diff&rev=548300&r1=548299&r2=548300
==============================================================================
--- activemq/trunk/activemq-optional/src/main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java (original)
+++ activemq/trunk/activemq-optional/src/main/java/org/apache/activemq/util/xstream/XStreamMessageTransformer.java Mon Jun 18 03:48:41 2007
@@ -36,40 +36,47 @@
 import java.io.StringWriter;
 
 /**
- * Transforms object messages to text messages using {@link XStream}
+ * Transforms object messages to text messages and vice versa using {@link XStream}
  *
  * @version $Revision$
  */
 public class XStreamMessageTransformer extends MessageTransformerSupport {
     private XStream xStream;
 
-
-    public Message producerTransform(Session session, MessageProducer producer, Message message) throws JMSException {
-        if (message instanceof ObjectMessage) {
-            TextMessage answer = session.createTextMessage(marshall(session, producer, (ObjectMessage) message));
-            copyProperties(message, answer);
-            return answer;
-        }
-        return message;
-    }
-
+    /**
+     * Defines the direction in which transformation goes.
+     * If 'false' (default),
+     *  - producer transformation transforms from Object to XML.
+     *  - consumer transformation transforms from XML to Object.
+     * If 'true' transformation directions changes,
+     *  - producer transformation transforms from XML to Object.
+     *  - consumer transformation transforms from Object to XML.
+	 */
+	private boolean reverse;
+
+	public XStreamMessageTransformer() {
+		new XStreamMessageTransformer(false);
+	}
+
+	public XStreamMessageTransformer(boolean direction) {
+		this.reverse = direction;
+	}
 
     public Message consumerTransform(Session session, MessageConsumer consumer, Message message) throws JMSException {
-        if (message instanceof TextMessage) {
-            TextMessage textMessage = (TextMessage) message;
-            Object object = unmarshall(session, consumer, textMessage);
-            if (object instanceof Serializable) {
-                ObjectMessage answer = session.createObjectMessage((Serializable) object);
-                copyProperties(message, answer);
-                return answer;
-            }
-            else {
-                throw new JMSException("Object is not serializable: " + object);
-            }
-        }
-        return message;
-    }
-
+		if (reverse) {
+			return objectToText(session, message);
+		} else {
+			return textToObject(session, message);
+		}
+	}
+
+	public Message producerTransform(Session session, MessageProducer producer, Message message) throws JMSException {
+		if (reverse) {
+			return textToObject(session, message);
+		} else {
+			return objectToText(session, message);
+		}
+	}
 
     // Properties
     // -------------------------------------------------------------------------
@@ -90,10 +97,58 @@
         return new XStream();
     }
 
+
+    public boolean isReverse() {
+        return reverse;
+    }
+
+    public void setReverse(boolean reverse) {
+        this.reverse = reverse;
+    }
+
+    /**
+     * Transforms an incoming XML encoded {@link TextMessage} to an {@link ObjectMessage}
+     * @param session - JMS session currently being used
+     * @param message - if this is a TextMessage, it will be transformed to an ObjectMessage
+     * @return ObjectMessage, if the incoming message is a TextMessage, the original message otherwise
+     * @throws JMSException
+     */
+    protected Message textToObject(Session session, Message message) throws JMSException {
+        if (message instanceof TextMessage) {
+            TextMessage textMessage = (TextMessage) message;
+            Object object = unmarshall(session, textMessage);
+            if (object instanceof Serializable) {
+                ObjectMessage answer = session.createObjectMessage((Serializable) object);
+                copyProperties(message, answer);
+                return answer;
+            }
+            else {
+                throw new JMSException("Object is not serializable: " + object);
+            }
+        }
+        return message;
+	}
+
+    /**
+     * Transforms an incoming {@link ObjectMessage} to an XML encoded {@link TextMessage}
+     * @param session - JMS session currently being used
+     * @param message - if this is an ObjectMessage, it will be transformed to a TextMessage
+     * @return XML encoded TextMessage, if the incoming messsage is an ObjectMessge, the original message otherwise
+     * @throws JMSException
+     */
+    protected Message objectToText(Session session, Message message) throws JMSException {
+        if (message instanceof ObjectMessage) {
+            TextMessage answer = session.createTextMessage(marshall(session, (ObjectMessage) message));
+            copyProperties(message, answer);
+            return answer;
+        }
+        return message;
+	}
+
     /**
      * Marshalls the Object in the {@link ObjectMessage} to a string using XML encoding
      */
-    protected String marshall(Session session, MessageProducer producer, ObjectMessage objectMessage) throws JMSException {
+    protected String marshall(Session session, ObjectMessage objectMessage) throws JMSException {
         Serializable object = objectMessage.getObject();
         StringWriter buffer = new StringWriter();
         HierarchicalStreamWriter out = new PrettyPrintWriter(buffer);
@@ -101,10 +156,11 @@
         return buffer.toString();
     }
 
-    /**
-     * Unmarshalls the Object using XML encoding of the String
+
+	/**
+     * Unmarshalls the XML encoded message in the {@link TextMessage} to an Object
      */
-    protected Object unmarshall(Session session, MessageConsumer consumer, TextMessage textMessage) throws JMSException {
+    protected Object unmarshall(Session session, TextMessage textMessage) throws JMSException {
         HierarchicalStreamReader in = new XppReader(new StringReader(textMessage.getText()));
         return getXStream().unmarshal(in);
     }

Modified: activemq/trunk/activemq-optional/src/test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-optional/src/test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java?view=diff&rev=548300&r1=548299&r2=548300
==============================================================================
--- activemq/trunk/activemq-optional/src/test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java (original)
+++ activemq/trunk/activemq-optional/src/test/java/org/apache/activemq/util/xstream/XStreamTransformTest.java Mon Jun 18 03:48:41 2007
@@ -40,6 +40,10 @@
     protected long timeout = 5000;
 
     public void testSendObjectMessageReceiveAsTextMessageAndObjectMessage() throws Exception {
+        connectionFactory.setTransformer(new XStreamMessageTransformer());
+        connection = connectionFactory.createConnection();
+        connection.start();
+
         // lets create the consumers
         Session objectSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         Destination destination = objectSession.createTopic(getClass().getName());
@@ -82,13 +86,57 @@
         System.out.println(text);
     }
 
-
-    protected void setUp() throws Exception {
-        connectionFactory.setTransformer(new XStreamMessageTransformer());
+    public void testSendTextMessageReceiveAsObjectMessageAndTextMessage() throws Exception {
+        // Set reverse to true
+        connectionFactory.setTransformer(new XStreamMessageTransformer(true));
         connection = connectionFactory.createConnection();
         connection.start();
-    }
 
+        // lets create the consumers
+        Session textSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        Destination destination = textSession.createTopic(getClass().getName());
+        MessageConsumer textConsumer = textSession.createConsumer(destination);
+
+        Session objectSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        MessageConsumer objectConsumer = objectSession.createConsumer(destination);
+        // lets clear the transformer on this consumer so we see the message as it really is
+        ((ActiveMQMessageConsumer) objectConsumer).setTransformer(null);
+
+
+        // send a message
+        Session producerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        MessageProducer producer = producerSession.createProducer(destination);
+
+        String xmlText =
+                "<org.apache.activemq.util.xstream.SamplePojo>" +
+                "<name>James</name>" +
+                "<city>London</city>" +
+                "</org.apache.activemq.util.xstream.SamplePojo>";
+
+        TextMessage request = producerSession.createTextMessage(xmlText);
+        producer.send(request);
+
+        Message message;
+        // lets consume it as a text message
+        message = textConsumer.receive(timeout);
+        assertNotNull("Should have received a message!", message);
+        assertTrue("Should be a TextMessage but was: " + message, message instanceof TextMessage);
+        TextMessage textMessage = (TextMessage) message;
+        String text = textMessage.getText();
+        assertTrue("Text should be non-empty!", text != null && text.length() > 0);
+
+        // lets consume it as an object message
+        message = objectConsumer.receive(timeout);
+        assertNotNull("Should have received a message!", message);
+        assertTrue("Should be an ObjectMessage but was: " + message, message instanceof ObjectMessage);
+        ObjectMessage objectMessage = (ObjectMessage) message;
+        Object object = objectMessage.getObject();
+        assertTrue("object payload of wrong type: " + object, object instanceof SamplePojo);
+        SamplePojo body = (SamplePojo) object;
+        assertEquals("name", "James", body.getName());
+        assertEquals("city", "London", body.getCity());
+
+    }
 
     protected void tearDown() throws Exception {
         if (connection != null) {