[jboss-cvs] JBoss Messaging SVN: r5636 - in trunk: tests/jms-tests/src/org/jboss/test/messaging/jms/message and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jan 14 07:11:07 EST 2009
Author: jmesnil
Date: 2009-01-14 07:11:07 -0500 (Wed, 14 Jan 2009)
New Revision: 5636
Modified:
trunk/src/main/org/jboss/messaging/jms/client/JBossObjectMessage.java
trunk/tests/jms-tests/src/org/jboss/test/messaging/jms/message/ObjectMessageTest.java
Log:
JBMESSAGING-1393: ObjectMessage isolation
keep a snapshot of the serializable object as a byte[] so that subsequent modifications on the object has no effect on the ObjectMessage body (see ObjectMessage.setObject method)
Modified: trunk/src/main/org/jboss/messaging/jms/client/JBossObjectMessage.java
===================================================================
--- trunk/src/main/org/jboss/messaging/jms/client/JBossObjectMessage.java 2009-01-14 09:54:04 UTC (rev 5635)
+++ trunk/src/main/org/jboss/messaging/jms/client/JBossObjectMessage.java 2009-01-14 12:11:07 UTC (rev 5636)
@@ -33,7 +33,6 @@
import org.jboss.messaging.core.client.ClientMessage;
import org.jboss.messaging.core.client.ClientSession;
-import org.jboss.messaging.core.remoting.spi.MessagingBuffer;
import org.jboss.messaging.util.ObjectInputStreamWithClassLoader;
/**
@@ -59,7 +58,8 @@
// Attributes ----------------------------------------------------
- private Serializable object;
+ // keep a snapshot of the Serializable Object as a byte[] to provide Object isolation
+ private byte[] data;
// Static --------------------------------------------------------
@@ -102,18 +102,8 @@
public void doBeforeSend() throws Exception
{
- if (object != null)
+ if (data != null)
{
- ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
-
- ObjectOutputStream oos = new ObjectOutputStream(baos);
-
- oos.writeObject(object);
-
- oos.flush();
-
- byte[] data = baos.toByteArray();
-
getBody().putInt(data.length);
getBody().putBytes(data);
}
@@ -127,39 +117,72 @@
public void setObject(Serializable object) throws JMSException
{
checkWrite();
-
- this.object = object;
+
+ if (object != null)
+ {
+ try
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
+
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+
+ oos.writeObject(object);
+
+ oos.flush();
+
+ data = baos.toByteArray();
+ }
+ catch (Exception e)
+ {
+ JMSException je = new JMSException("Failed to serialize object");
+ je.setLinkedException(e);
+ throw je;
+ }
+ }
}
// lazy deserialize the Object the first time the client requests it
public Serializable getObject() throws JMSException
{
- if (object == null)
+ if (data == null)
{
try
{
int len = getBody().getInt();
- byte[] data = new byte[len];
+ data = new byte[len];
getBody().getBytes(data);
- ByteArrayInputStream bais = new ByteArrayInputStream(data);
- ObjectInputStream ois = new ObjectInputStreamWithClassLoader(bais);
- object = (Serializable)ois.readObject();
- }
+ }
catch (Exception e)
{
- JMSException je = new JMSException("Failed to deserialize object");
- je.setLinkedException(e);
+ return null;
}
}
- return object;
+ if (data.length == 0)
+ {
+ return null;
+ }
+
+ try
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(data);
+ ObjectInputStream ois = new ObjectInputStreamWithClassLoader(bais);
+ Serializable object = (Serializable)ois.readObject();
+ return object;
+ }
+ catch (Exception e)
+ {
+ JMSException je = new JMSException("Failed to deserialize object");
+ je.setLinkedException(e);
+ throw je;
+ }
}
public void clearBody() throws JMSException
{
super.clearBody();
- object = null;
+ data = null;
}
Modified: trunk/tests/jms-tests/src/org/jboss/test/messaging/jms/message/ObjectMessageTest.java
===================================================================
--- trunk/tests/jms-tests/src/org/jboss/test/messaging/jms/message/ObjectMessageTest.java 2009-01-14 09:54:04 UTC (rev 5635)
+++ trunk/tests/jms-tests/src/org/jboss/test/messaging/jms/message/ObjectMessageTest.java 2009-01-14 12:11:07 UTC (rev 5636)
@@ -32,6 +32,8 @@
import javax.jms.Message;
import javax.jms.ObjectMessage;
+import org.jboss.messaging.jms.client.JBossObjectMessage;
+
/**
* A test that sends/receives object messages to the JMS provider and verifies their integrity.
*
@@ -127,7 +129,72 @@
assertEquals(vectorOnMessage.get(0), v2.get(0));
}
-
+
+ public void testObjectIsolation() throws Exception
+ {
+ ObjectMessage msgTest = session.createObjectMessage();
+ ArrayList list = new ArrayList();
+ list.add("hello");
+ msgTest.setObject(list);
+
+ list.clear();
+
+ list = (ArrayList) msgTest.getObject();
+
+ assertEquals(1, list.size());
+ assertEquals("hello", list.get(0));
+
+ list.add("hello2");
+
+ msgTest.setObject(list);
+
+ list.clear();
+
+ list = (ArrayList) msgTest.getObject();
+
+ assertEquals(2, list.size());
+ assertEquals("hello", list.get(0));
+ assertEquals("hello2", list.get(1));
+
+ msgTest.setObject(list);
+ list.add("hello3");
+ msgTest.setObject(list);
+
+ list = (ArrayList) msgTest.getObject();
+ assertEquals(3, list.size());
+ assertEquals("hello", list.get(0));
+ assertEquals("hello2", list.get(1));
+ assertEquals("hello3", list.get(2));
+
+ list = (ArrayList) msgTest.getObject();
+
+ list.clear();
+
+ queueProd.send(msgTest);
+
+ msgTest = (ObjectMessage) queueCons.receive(5000);
+
+ list = (ArrayList) msgTest.getObject();
+
+ assertEquals(3, list.size());
+ assertEquals("hello", list.get(0));
+ assertEquals("hello2", list.get(1));
+ assertEquals("hello3", list.get(2));
+
+ }
+
+ public void testReadOnEmptyObjectMessage() throws Exception
+ {
+ ObjectMessage obm = (ObjectMessage) message;
+ assertNull(obm.getObject());
+
+ queueProd.send(message);
+ ObjectMessage r = (ObjectMessage) queueCons.receive();
+
+ assertNull(r.getObject());
+
+ }
+
// Protected ------------------------------------------------------------------------------------
protected void prepareMessage(Message m) throws JMSException
More information about the jboss-cvs-commits
mailing list