[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