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/19 04:33:24 UTC
svn commit: r548562 - 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 19:33:23 2007
New Revision: 548562
URL: http://svn.apache.org/viewvc?view=rev&rev=548562
Log:
Added an adaptive message transformation. More details here: https://issues.apache.org/activemq/browse/AMQ-1208
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=548562&r1=548561&r2=548562
==============================================================================
--- 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 19:33:23 2007
@@ -44,38 +44,69 @@
private XStream xStream;
/**
- * Defines the direction in which transformation goes.
- * If 'false' (default),
+ * Defines the type of transformation.
+ * If XML (default),
* - producer transformation transforms from Object to XML.
* - consumer transformation transforms from XML to Object.
- * If 'true' transformation directions changes,
+ * If OBJECT,
* - producer transformation transforms from XML to Object.
* - consumer transformation transforms from Object to XML.
+ * If ADAPTIVE,
+ * - producer transformation transforms from Object to XML, or XML to Object
+ * depending on the type of the original message
+ * - consumer transformation transforms from XML to Object, or Object to XML
+ * depending on the type of the original message
*/
- private boolean reverse;
+ public enum MessageTransform {XML, OBJECT, ADAPTIVE};
- public XStreamMessageTransformer() {
- new XStreamMessageTransformer(false);
+ protected MessageTransform transformType;
+
+ public XStreamMessageTransformer() {
+ this(MessageTransform.XML);
}
- public XStreamMessageTransformer(boolean direction) {
- this.reverse = direction;
+ public XStreamMessageTransformer(MessageTransform transformType) {
+ this.transformType = transformType;
}
public Message consumerTransform(Session session, MessageConsumer consumer, Message message) throws JMSException {
- if (reverse) {
- return objectToText(session, message);
- } else {
- return textToObject(session, message);
- }
- }
+ switch (transformType) {
+ case XML:
+ return (message instanceof TextMessage) ?
+ textToObject(session, (TextMessage)message) :
+ message;
+ case OBJECT:
+ return (message instanceof ObjectMessage) ?
+ objectToText(session, (ObjectMessage)message) :
+ message;
+ case ADAPTIVE:
+ return (message instanceof TextMessage) ?
+ textToObject(session, (TextMessage)message) :
+ (message instanceof ObjectMessage) ?
+ objectToText(session, (ObjectMessage)message) :
+ message;
+ }
+ return message;
+ }
public Message producerTransform(Session session, MessageProducer producer, Message message) throws JMSException {
- if (reverse) {
- return textToObject(session, message);
- } else {
- return objectToText(session, message);
- }
+ switch (transformType) {
+ case XML:
+ return (message instanceof ObjectMessage) ?
+ objectToText(session, (ObjectMessage)message) :
+ message;
+ case OBJECT:
+ return (message instanceof TextMessage) ?
+ textToObject(session, (TextMessage)message) :
+ message;
+ case ADAPTIVE:
+ return (message instanceof TextMessage) ?
+ textToObject(session, (TextMessage)message) :
+ (message instanceof ObjectMessage) ?
+ objectToText(session, (ObjectMessage)message) :
+ message;
+ }
+ return message;
}
// Properties
@@ -97,52 +128,44 @@
return new XStream();
}
-
- public boolean isReverse() {
- return reverse;
+ public MessageTransform getTransformType() {
+ return transformType;
}
- public void setReverse(boolean reverse) {
- this.reverse = reverse;
+ public void setTransformType(MessageTransform transformType) {
+ this.transformType = transformType;
}
/**
* 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
+ * @param textMessage - text message to transform to object message
+ * @return ObjectMessage
* @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);
- }
+ protected ObjectMessage textToObject(Session session, TextMessage textMessage) throws JMSException {
+ Object object = unmarshall(session, textMessage);
+ if (object instanceof Serializable) {
+ ObjectMessage answer = session.createObjectMessage((Serializable) object);
+ copyProperties(textMessage, 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
+ * @param objectMessage - object message to transform to text message
+ * @return XML encoded TextMessage
* @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;
+ protected TextMessage objectToText(Session session, ObjectMessage objectMessage) throws JMSException {
+ TextMessage answer = session.createTextMessage(marshall(session, objectMessage));
+ copyProperties(objectMessage, answer);
+ return answer;
}
/**
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=548562&r1=548561&r2=548562
==============================================================================
--- 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 19:33:23 2007
@@ -31,6 +31,8 @@
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageConsumer;
+import static org.apache.activemq.util.xstream.XStreamMessageTransformer.MessageTransform.*;
+
/**
* @version $Revision$
*/
@@ -40,7 +42,7 @@
protected long timeout = 5000;
public void testSendObjectMessageReceiveAsTextMessageAndObjectMessage() throws Exception {
- connectionFactory.setTransformer(new XStreamMessageTransformer());
+ connectionFactory.setTransformer(new XStreamMessageTransformer(XML));
connection = connectionFactory.createConnection();
connection.start();
@@ -87,8 +89,7 @@
}
public void testSendTextMessageReceiveAsObjectMessageAndTextMessage() throws Exception {
- // Set reverse to true
- connectionFactory.setTransformer(new XStreamMessageTransformer(true));
+ connectionFactory.setTransformer(new XStreamMessageTransformer(OBJECT));
connection = connectionFactory.createConnection();
connection.start();
@@ -135,6 +136,89 @@
SamplePojo body = (SamplePojo) object;
assertEquals("name", "James", body.getName());
assertEquals("city", "London", body.getCity());
+
+ }
+
+ public void testAdaptiveTransform() throws Exception {
+ connectionFactory.setTransformer(new XStreamMessageTransformer(ADAPTIVE));
+ connection = connectionFactory.createConnection();
+ connection.start();
+
+ // lets create the consumers
+ Session adaptiveSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Destination destination = adaptiveSession.createTopic(getClass().getName());
+ MessageConsumer adaptiveConsumer = adaptiveSession.createConsumer(destination);
+
+ Session origSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer origConsumer = origSession.createConsumer(destination);
+ // lets clear the transformer on this consumer so we see the message as it really is
+ ((ActiveMQMessageConsumer) origConsumer).setTransformer(null);
+
+ // Create producer
+ Session producerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageProducer producer = producerSession.createProducer(destination);
+
+ Message message;
+ ObjectMessage objectMessage;
+ TextMessage textMessage;
+ SamplePojo body;
+ Object object;
+ String text;
+
+ // Send a text message
+ String xmlText =
+ "<org.apache.activemq.util.xstream.SamplePojo>" +
+ "<name>James</name>" +
+ "<city>London</city>" +
+ "</org.apache.activemq.util.xstream.SamplePojo>";
+
+ TextMessage txtRequest = producerSession.createTextMessage(xmlText);
+ producer.send(txtRequest);
+
+ // lets consume it as a text message
+ message = adaptiveConsumer.receive(timeout);
+ assertNotNull("Should have received a message!", message);
+ assertTrue("Should be a TextMessage but was: " + message, message instanceof TextMessage);
+ textMessage = (TextMessage) message;
+ text = textMessage.getText();
+ assertTrue("Text should be non-empty!", text != null && text.length() > 0);
+
+ // lets consume it as an object message
+ message = origConsumer.receive(timeout);
+ assertNotNull("Should have received a message!", message);
+ assertTrue("Should be an ObjectMessage but was: " + message, message instanceof ObjectMessage);
+ objectMessage = (ObjectMessage) message;
+ object = objectMessage.getObject();
+ assertTrue("object payload of wrong type: " + object, object instanceof SamplePojo);
+ body = (SamplePojo) object;
+ assertEquals("name", "James", body.getName());
+ assertEquals("city", "London", body.getCity());
+
+ // Send object message
+ ObjectMessage objRequest = producerSession.createObjectMessage(new SamplePojo("James", "London"));
+ producer.send(objRequest);
+
+ // lets consume it as an object message
+ message = adaptiveConsumer.receive(timeout);
+ assertNotNull("Should have received a message!", message);
+ assertTrue("Should be an ObjectMessage but was: " + message, message instanceof ObjectMessage);
+ objectMessage = (ObjectMessage) message;
+ object = objectMessage.getObject();
+ assertTrue("object payload of wrong type: " + object, object instanceof SamplePojo);
+ body = (SamplePojo) object;
+ assertEquals("name", "James", body.getName());
+ assertEquals("city", "London", body.getCity());
+
+
+ // lets consume it as a text message
+ message = origConsumer.receive(timeout);
+ assertNotNull("Should have received a message!", message);
+ assertTrue("Should be a TextMessage but was: " + message, message instanceof TextMessage);
+ textMessage = (TextMessage) message;
+ text = textMessage.getText();
+ assertTrue("Text should be non-empty!", text != null && text.length() > 0);
+ System.out.println("Received XML...");
+ System.out.println(text);
}