[jboss-svn-commits] JBL Code SVN: r29795 - in labs/jbossesb/trunk/product: install/conf and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Oct 23 14:39:40 EDT 2009


Author: kevin.conner at jboss.com
Date: 2009-10-23 14:39:39 -0400 (Fri, 23 Oct 2009)
New Revision: 29795

Modified:
   labs/jbossesb/trunk/product/docs/ServicesGuide.odt
   labs/jbossesb/trunk/product/install/conf/jbossesb-properties.xml
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/Environment.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/ModulePropertyManager.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/StatefulRuleInfo.java
   labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java
   labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
Log:
Fix statefule rules continue functionality: JBESB-2899

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

Modified: labs/jbossesb/trunk/product/install/conf/jbossesb-properties.xml
===================================================================
--- labs/jbossesb/trunk/product/install/conf/jbossesb-properties.xml	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/install/conf/jbossesb-properties.xml	2009-10-23 18:39:39 UTC (rev 29795)
@@ -141,4 +141,9 @@
     	<property name="org.jboss.soa.esb.filter.1" value="org.jboss.internal.soa.esb.message.filter.MetaDataFilter"/>
     	<property name="org.jboss.soa.esb.filter.2" value="org.jboss.internal.soa.esb.message.filter.GatewayFilter"/>
     </properties>
+
+    <properties name="rules">
+    	<!-- change this to true if you wish to have the same behaviour as ESB4.6 and prior (including SOA 4.3) -->
+    	<property name="org.jboss.soa.esb.services.rules.continueState" value="false"/>
+    </properties>
 </esb>

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/Environment.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/Environment.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/Environment.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -291,4 +291,9 @@
          * org.jboss.soa.esb.jca.activation.mapper.&lt;adapterName&gt;
          */
         public static final String JCA_ACTIVATION_MAPPER = "org.jboss.soa.esb.jca.activation.mapper" ;
+        
+        /**
+         * The default rules continue state.
+         */
+        public static final String RULES_CONTINUE_STATE = "org.jboss.soa.esb.services.rules.continueState" ;
 }

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/ModulePropertyManager.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/ModulePropertyManager.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/common/ModulePropertyManager.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -106,6 +106,8 @@
 	
 	public static final String JCA_MODULE = "jca" ;
 
+	public static final String RULES_MODULE = "rules";
+
 	/**
 	 * Get the property manager responsible for the module component in the
 	 * file.

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -285,7 +285,7 @@
 		builder.reload(ruleReload);
 		builder.globals(globals);
 		builder.defaultFacts(objectList);
-		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false);
+		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false, false);
 
 		RuleBase ruleBase = getRuleBaseForFileBasedRules( ruleInfo.getRuleSource(), ruleInfo.getDslSource(), ruleInfo.getReload());
 		return executeStatefulRules(ruleBase, ruleInfo, message);
@@ -340,7 +340,7 @@
 		builder.reload(ruleReload);
 		builder.globals(globals);
 		builder.defaultFacts(objectList);
-		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false);
+		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false, false);
 
 		final RuleBase ruleBase = getRuleBaseForDecisionTable(ruleInfo.getRuleSource(), ruleInfo.getReload());
 
@@ -392,7 +392,7 @@
     		final RuleInfoBuilder builder = new RuleInfoBuilder(ruleAgentProperties);
     		builder.globals(globals);
     		builder.defaultFacts(objectList);
-    		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false);
+    		StatefulRuleInfoImpl ruleInfo = new StatefulRuleInfoImpl(builder.build(), false, false);
 
     		final RuleBase ruleBase = getRuleBaseForRuleAgent(ruleInfo.getRuleSource()) ;
 
@@ -468,7 +468,7 @@
     		final RuleInfoBuilder builder = new RuleInfoBuilder(rules);
     		builder.globals(globals);
     		builder.defaultFacts(objectList);
-    		StatefulRuleInfo ruleInfo = new StatefulRuleInfoImpl(builder.build(), dispose);
+    		StatefulRuleInfo ruleInfo = new StatefulRuleInfoImpl(builder.build(), dispose, true);
 
 			final RuleBase ruleBase = ruleBases.get( rules );
 
@@ -681,7 +681,7 @@
         {
             RulesContext.clearContext() ;
 
-            final StatefulSession statefulSession = getStatefulSession( ruleBase );
+            final StatefulSession statefulSession = getStatefulSession( ruleBase, ruleInfo.continueState() );
             try
             {
                 addGlobalsVariables(statefulSession, ruleInfo.getGlobals());
@@ -750,12 +750,24 @@
 	 * Checks whether the ruleBase has an existing session, and returns
 	 * that session, otherwise a new session is created.
 	 */
-	private StatefulSession getStatefulSession( final RuleBase ruleBase )
+	private StatefulSession getStatefulSession( final RuleBase ruleBase, final boolean continueState )
 	{
         synchronized (ruleBase) {
             final StatefulSession[] statefulSessions = ruleBase.getStatefulSessions();
             boolean existingSession = statefulSessions != null && statefulSessions.length > 0;
-            return existingSession ? statefulSessions[0] : ruleBase.newStatefulSession();
+            if (existingSession)
+            {
+                final StatefulSession session = statefulSessions[0];
+                if (continueState)
+                {
+                    return session ;
+                }
+                else
+                {
+                    session.dispose();
+                }
+            }
+            return ruleBase.newStatefulSession();
         }
     }
 

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -31,6 +31,8 @@
 
 import org.apache.log4j.Logger;
 import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.common.Environment;
+import org.jboss.soa.esb.common.ModulePropertyManager;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.listeners.ListenerTagNames;
 import org.jboss.soa.esb.message.Message;
@@ -38,6 +40,8 @@
 import org.jboss.soa.esb.services.rules.RuleService;
 import org.jboss.soa.esb.services.rules.StatefulRuleInfo;
 
+import com.arjuna.common.util.propertyservice.PropertyManager;
+
 /**
  * RuleServiceCallHelper is a class for calling
  * methods on a {@link RuleService} implementation.
@@ -51,6 +55,11 @@
     private static Logger logger = Logger.getLogger(RuleServiceCallHelper.class);
     
     /**
+     * The default continue state expected.
+     */
+    private static final boolean DEFAULT_CONTINUE_STATE;
+    
+    /**
      * The {@link RuleService} implementation to use.
      */
     private RuleService ruleService;
@@ -176,10 +185,11 @@
     public Message executeStateful(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
     {
         final boolean dispose = getDisposeProperty(message);
-        StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose);
+        final boolean explicitContinueState = getContinueProperty(message);
+        final boolean continueState = explicitContinueState || getContinuePropertyOrDefault(message) ;
+        StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose, continueState);
             
-        final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
-        if (continueStateful)
+        if (explicitContinueState)
         {
             checkDisposePropertyIsSpecified(message);
             return ruleService.continueStatefulRulesExecution(statefulRuleInfo, message);
@@ -280,6 +290,25 @@
         return Boolean.TRUE.equals(dispose);
     }
 
+    private static boolean getContinueProperty(final Message message) throws RuleServiceException
+    {
+        Object continueState = message.getProperties().getProperty(CONTINUE.getTagName());
+        return Boolean.TRUE.equals(continueState);
+    }
+
+    private static boolean getContinuePropertyOrDefault(final Message message) throws RuleServiceException
+    {
+        Object continueState = message.getProperties().getProperty(CONTINUE.getTagName());
+        if (continueState != null)
+        {
+            return Boolean.TRUE.equals(continueState);
+        }
+        else
+        {
+            return DEFAULT_CONTINUE_STATE;
+        }
+    }
+
     private static void checkDisposePropertyIsSpecified( final Message message ) throws RuleServiceException
     {
         Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
@@ -290,5 +319,12 @@
                     " be disposed or memory leaks can occur.");
         }
     }
+    
+    static
+    {
+        final PropertyManager prop = ModulePropertyManager.getPropertyManager(ModulePropertyManager.RULES_MODULE);
+        final String value = prop.getProperty(Environment.RULES_CONTINUE_STATE) ;
+        DEFAULT_CONTINUE_STATE = Boolean.parseBoolean(value);
+    }
 }
     
\ No newline at end of file

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -37,14 +37,21 @@
 public class StatefulRuleInfoImpl implements StatefulRuleInfo
 {
     private final RuleInfo ruleInfo;
-    private boolean dispose;
+    private final boolean dispose;
+    private final boolean continueState;
     
-    public StatefulRuleInfoImpl(final RuleInfo ruleInfo, final boolean dispose)
+    public StatefulRuleInfoImpl(final RuleInfo ruleInfo, final boolean dispose, final boolean continueState)
     {
         this.ruleInfo = ruleInfo;
         this.dispose = dispose;
+        this.continueState = continueState;
     }
     
+    public boolean continueState()
+    {
+        return continueState;
+    }
+    
     public boolean dispose()
     {
         return dispose;

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/StatefulRuleInfo.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/StatefulRuleInfo.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/StatefulRuleInfo.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -31,10 +31,17 @@
 public interface StatefulRuleInfo extends RuleInfo
 {
     /**
-     * If dispose is true the stateful working memory should be disposed of.
+     * If continueState is false the stateful working memory should be disposed of prior to processing.
      * Not disposing a working memory you lead to memory leaks.
      *
-     * @return {@code boolean} If the working memory should be disposed of (cleaned up).
+     * @return {@code boolean} If the working memory should be disposed of (cleaned up) prior to processing.
      */
+    boolean continueState();
+    /**
+     * If dispose is true the stateful working memory should be disposed of after processing.
+     * Not disposing a working memory you lead to memory leaks.
+     *
+     * @return {@code boolean} If the working memory should be disposed of (cleaned up) after processing.
+     */
     boolean dispose();
 }

Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -264,7 +264,7 @@
 		// OrderEntryPoint that matches the entry-point name in PricingRulesStatfulEntryPoint.drl.
 		builder.fact("OrderEntryPoint", objectMapper.getObjectFromMessage(message, "body.Order"));
         // process message
-		StatefulRuleInfo statefulInfo = new StatefulRuleInfoImpl(builder.build(), true);
+		StatefulRuleInfo statefulInfo = new StatefulRuleInfoImpl(builder.build(), true, true);
         message = ruleService.executeStatefulRules(statefulInfo, message);
 
         assertEquals( 20.0, order.getDiscount(), 0 );
@@ -291,7 +291,7 @@
         // Non Existing entry-point name.
         builder.fact("Bajja", objectMapper.getObjectFromMessage(message, "body.Order"));
         // process message
-		StatefulRuleInfo statefulInfo = new StatefulRuleInfoImpl(builder.build(), true);
+		StatefulRuleInfo statefulInfo = new StatefulRuleInfoImpl(builder.build(), true, false);
         ruleService.executeStatefulRules(statefulInfo, message);
     }
 

Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java	2009-10-23 14:51:31 UTC (rev 29794)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java	2009-10-23 18:39:39 UTC (rev 29795)
@@ -144,6 +144,44 @@
         assertEquals( 1 , counter.getCounter() );
     }
 
+    @Test
+    public void processStatefulContinuation() throws Exception
+    {
+        Message message = createMessageWithOrder( order );
+        ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBStatefulDispose.drl" ).stateful( true ).messagePaths(messagePathList).build();
+        BusinessRulesProcessor processor = new BusinessRulesProcessor( configTree );
+
+        // process message
+        processor.process( message );
+        assertEquals( 20.0, order.getDiscount(), 0);
+        assertEquals( "20%" ,message.getBody().get("DiscountObject"));
+        Counter counter = (Counter) message.getBody().get("Counter");
+        assertEquals( 1 , counter.getCounter() );
+
+        //  do not dispose after this call
+        message.getBody().remove("Order");
+        message.getProperties().setProperty( RuleServicePropertiesNames.DISPOSE.getTagName(), Boolean.FALSE );
+        message.getProperties().setProperty( RuleServicePropertiesNames.CONTINUE.getTagName(), Boolean.TRUE );
+        message.getBody().add("Counter", new Counter(counter.getCounter()));
+        processor.process( message );
+
+        counter = (Counter) message.getBody().get("Counter");
+        assertEquals( 2 , counter.getCounter() );
+        
+        //  Do not specify continue, it should dispose current session before this call
+        final Order order = new Order();
+        order.setQuantity(20);
+        order.setUnitPrice( new BigDecimal("20.0") );
+        message = createMessageWithOrder( order );
+        
+        processor.process( message );
+
+        assertEquals( 20.0, order.getDiscount(), 0);
+        assertEquals( "20%" ,message.getBody().get("DiscountObject"));
+        counter = (Counter) message.getBody().get("Counter");
+        assertEquals( 1 , counter.getCounter() );
+    }
+
 	@Test ( expected = ActionProcessingException.class )
 	public void shouldThrowIfDisposePropertyIsNotSet() throws ObjectMappingException, ConfigurationException, RegistryException, MessageRouterException, ActionProcessingException
 	{



More information about the jboss-svn-commits mailing list