[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.<adapterName>
*/
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