[jboss-svn-commits] JBL Code SVN: r20867 - in labs/jbossesb/trunk/product: rosetta/src/org/jboss/internal/soa/esb/couriers and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 2 03:36:52 EDT 2008


Author: mark.little at jboss.com
Date: 2008-07-02 03:36:52 -0400 (Wed, 02 Jul 2008)
New Revision: 20867

Modified:
   labs/jbossesb/trunk/product/docs/ProgrammersGuide.odt
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/couriers/InVMCourier.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/addressing/eprs/InVMEpr.java
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/couriers/tests/InVMCourierUnitTest.java
   labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/addressing/helpers/tests/InVMUnitTest.java
Log:
http://jira.jboss.com/jira/browse/JBESB-1807

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

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/couriers/InVMCourier.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/couriers/InVMCourier.java	2008-07-02 05:37:24 UTC (rev 20866)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/couriers/InVMCourier.java	2008-07-02 07:36:52 UTC (rev 20867)
@@ -27,6 +27,7 @@
 import org.jboss.soa.esb.couriers.CourierException;
 import org.jboss.soa.esb.message.Message;
 
+import java.io.IOException;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
@@ -55,7 +56,8 @@
     private long deliveryTimeout = 0;
 
     private boolean isActive = true;
-
+    private boolean passByReference = true;
+    
     /**
      * Objects of this class should only be instantiated by internal
      * implementations
@@ -82,6 +84,8 @@
         } else {
             deliveryTimeout = 0;
         }
+        
+        passByReference = epr.getPassByReference();
     }
 
     /**
@@ -102,7 +106,26 @@
         }
 
         synchronized (messageQueue) {
-            messageQueue.add(message);
+            /*
+             * If not pass-by-reference then use a copy of
+             * the input message.
+             */
+            
+            if (!passByReference)
+            {
+                try
+                {
+                    messageQueue.add(message.copy());
+                }
+                catch (IOException ex)
+                {
+                    logger.warn("Could not create a copy of message to pass by value: "+ex);
+                    
+                    return false;
+                }
+            }
+            else
+                messageQueue.add(message);
 
             // Notify 1 waiting pickup thread of the delivery...
             messageQueue.notify();

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/addressing/eprs/InVMEpr.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/addressing/eprs/InVMEpr.java	2008-07-02 05:37:24 UTC (rev 20866)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/addressing/eprs/InVMEpr.java	2008-07-02 07:36:52 UTC (rev 20867)
@@ -38,7 +38,7 @@
 /**
  * A helper class for using in-VM communication.
  * 
- * EPR: invm://servicename[?lockstep[#waittime]]
+ * EPR: invm://servicename[/pass-by-reference][?lockstep[#waittime]]
  * 
  * where lockstep can be either true or false and waittime is the lockstep wait
  * time in milliseconds. If lockstep is false then any value specified for
@@ -47,7 +47,8 @@
  * e.g.,
  * 
  * invm://myservice?true#20000 invm://myservice invm://myservice?false (same as
- * invm://myservice)
+ * invm://myservice) or invm://myservice/false?false (first false is pass-by-reference
+ * value, which in this case means pass the message by value, i.e., copy it).
  * 
  * You can have a lockstep service, where the sender thread is tied to the one
  * that does the execution (equivalent to the sender thread doing the work
@@ -74,10 +75,14 @@
 
 	public static final String LOCKSTEP_WAIT_TIME_TAG = "lockstepWait";
 
+        public static final String PASS_BY_VALUE = "passByValue";
+        
     private boolean _lockstep = false;
 
 	private boolean _lockstepTime = false;
 
+        private boolean _passByReference = false;
+        
 	public InVMEpr(EPR epr)
 	{
         setAddr(epr.getAddr());
@@ -111,6 +116,11 @@
 							getAddr().addExtension(LOCKSTEP_WAIT_TIME_TAG, nl.item(i).getTextContent());
 							_lockstepTime = true;
 						}
+                                                if (tag.equals(PASS_BY_VALUE))
+                                                {
+                                                        getAddr().addExtension(PASS_BY_VALUE, nl.item(i).getTextContent());
+                                                        _lockstepTime = true;
+                                                }
 					}
 				}
 			}
@@ -128,6 +138,7 @@
 		String serviceId = uri.getHost();
 		String lockstep = uri.getQuery();
 		String lockstepTime = uri.getFragment();
+		String passByReference = uri.getPath();
 
 		if (serviceId == null)
 			throw new URISyntaxException(uri.toString(),
@@ -136,7 +147,7 @@
 		if ("true".equalsIgnoreCase(lockstep))
 		{
 			setLockstep(true);
-
+                        
 			if (lockstepTime != null)
 			{
 				try
@@ -149,6 +160,9 @@
 				}
 			}
 		}
+
+                if ("/false".equalsIgnoreCase(passByReference))
+                    setPassByReference(false);
 	}
 
 	public String getServiceId()
@@ -224,7 +238,30 @@
 
 		_lockstepTime = true;
 	}
+        
+        public boolean getPassByReference ()
+        {
+            String passByReference = getAddr().getExtensionValue(PASS_BY_VALUE);
 
+            if (passByReference == null)  // default
+                return true;
+            
+            if ("false".equalsIgnoreCase(passByReference))
+                return false;
+            else
+                return true;
+        }
+        
+        public void setPassByReference (boolean val)
+        {
+            if (_passByReference)
+                throw new IllegalStateException("Pass by reference already set!");
+            
+            getAddr().addExtension(PASS_BY_VALUE, "" + val);
+            
+            _passByReference = true;
+        }
+
 	public String toString()
 	{
 		return "InVMEpr [ " + super.getAddr().extendedToString() + " ]";

Modified: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/couriers/tests/InVMCourierUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/couriers/tests/InVMCourierUnitTest.java	2008-07-02 05:37:24 UTC (rev 20866)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/internal/soa/esb/couriers/tests/InVMCourierUnitTest.java	2008-07-02 07:36:52 UTC (rev 20867)
@@ -130,7 +130,24 @@
 
         Assert.assertEquals(consumer.valid(), true);
     }
+    
+    @Test
+    public void testPassByValueDeliver() throws Exception {
+        InVMEpr epr = new InVMEpr(new URI("invm://serviceid5/false?true#2000"));
+        InVMCourier courier = new InVMCourier(epr);
+        Producer producer = new Producer(courier);
+        Consumer consumer = new Consumer(courier);
 
+        consumer.start();
+        producer.start();
+
+        consumer.join(TIMEOUT) ;
+        Assert.assertTrue("Consumer valid", consumer.valid()) ;
+
+        Assert.assertEquals(consumer.valid(), true);
+    }
+
+
     @Test
     public void test_single_Courier_Creation() throws URISyntaxException,
             MalformedEPRException, CourierException {

Modified: labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/addressing/helpers/tests/InVMUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/addressing/helpers/tests/InVMUnitTest.java	2008-07-02 05:37:24 UTC (rev 20866)
+++ labs/jbossesb/trunk/product/rosetta/tests/src/org/jboss/soa/esb/addressing/helpers/tests/InVMUnitTest.java	2008-07-02 07:36:52 UTC (rev 20867)
@@ -49,6 +49,20 @@
 			fail(ex.toString());
 		}
 	}
+        
+        public void testPassByReference ()
+        {
+                try
+                {
+                        InVMEpr epr = new InVMEpr(new URI("invm://myservice/false?true#1234"));
+                        
+                        assertEquals(epr.getPassByReference(), false);
+                }
+                catch (Exception ex)
+                {
+                        fail(ex.toString());
+                }
+        }
 	
 	public void testSetGet ()
 	{




More information about the jboss-svn-commits mailing list