[jboss-svn-commits] JBL Code SVN: r37516 - in labs/jbossesb/branches/JBESB_4_10_CP/product: services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Oct 6 21:18:29 EDT 2011
Author: tcunning
Date: 2011-10-06 21:18:29 -0400 (Thu, 06 Oct 2011)
New Revision: 37516
Modified:
labs/jbossesb/branches/JBESB_4_10_CP/product/samples/quickstarts/business_ruleservice_cep/readme.txt
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoImpl.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleInfo.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleServicePropertiesNames.java
labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
Log:
JBESB-3698
Commit Kevin's patch to support CEP stateful actions.
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/samples/quickstarts/business_ruleservice_cep/readme.txt
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/samples/quickstarts/business_ruleservice_cep/readme.txt 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/samples/quickstarts/business_ruleservice_cep/readme.txt 2011-10-07 01:18:29 UTC (rev 37516)
@@ -145,7 +145,7 @@
* This ESB deployment's configuration file, defining all providers and
Services. The intersting part for this quickstart is the configuration
of the BusinessRulesProcessor, where a ruleFireMethod of
- "FIRE_UNTIL_HALT" is defined, as is a ruleProcessingType of "STREAM"
+ "FIRE_UNTIL_HALT" is defined, as is a ruleEventProcessingType of "STREAM"
and a ruleClockType of "REALTIME". You can also uncomment the
ruleAuditType, ruleAuditFile and ruleAuditInterval properties if so
desired. For an explanation of what these properties mean, please
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -52,6 +52,7 @@
Integer maxThreads;
Map<String,Channel> channels;
String ruleFireMethod;
+ Boolean defaultContinue;
Map<String, Object> globals;
Map<String, List<Object>> factsMap;
@@ -227,6 +228,12 @@
}
return this;
}
+
+ public RuleInfoBuilder defaultContinue(final Boolean defaultContinue)
+ {
+ this.defaultContinue = defaultContinue;
+ return this;
+ }
public RuleInfo build()
{
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoImpl.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoImpl.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoImpl.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -118,6 +118,12 @@
private final List<Object> defaultFacts;
/**
+ * defaultContinue, if false then a stateful session should be disposed prior to processing,
+ * if true then processing should continue, if null then default is taken from global properties.
+ */
+ private final Boolean defaultContinue;
+
+ /**
* Sole constructor intended to be called from the {@link RuleInfoBuilder}.
*
* @param builder This classes {@link RuleInfoBuilder}.
@@ -140,6 +146,7 @@
factsMap = builder.factsMap;
reload = builder.reload;
defaultFacts = builder.defaultFacts;
+ defaultContinue = builder.defaultContinue;
}
/* (non-Javadoc)
@@ -267,6 +274,14 @@
return defaultFacts;
}
+ /* (non-Javadoc)
+ * @see org.jboss.soa.esb.services.rules.RuleInfo#getDefaultContinue()
+ */
+ public Boolean getDefaultContinue()
+ {
+ return defaultContinue;
+ }
+
public String toString()
{
return String.format("%s [ruleSource=%s, dslSource=%s, reload=%b, globals=%s, facts=%s, defaultFacts=%s", getClass().getSimpleName(), ruleSource, dslSource, reload, globals, factsMap, defaultFacts);
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -24,6 +24,7 @@
import static org.jboss.soa.esb.listeners.ListenerTagNames.RULE_RELOAD_TAG;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.CONTINUE;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DECISION_TABLE;
+import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DEFAULT_CONTINUE;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DISPOSE;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.IMPL_CLASS;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.RULE_AGENT_PROPERTIES;
@@ -117,6 +118,11 @@
* Should this be a stateful rules execution.
*/
private boolean stateful;
+ /**
+ * defaultContinue, if false then a stateful session should be disposed prior to processing,
+ * if true then processing should continue, if null then default is taken from global properties.
+ */
+ private Boolean defaultContinue;
/**
* Controll the reloading of rules.
@@ -202,6 +208,9 @@
}
stateful = Boolean.valueOf(config.getAttribute(STATEFUL.getName())).booleanValue();
+
+ final String dc = config.getAttribute( DEFAULT_CONTINUE.getName() );
+ defaultContinue = (dc != null) ? Boolean.valueOf(dc) : null;
}
@SuppressWarnings("unchecked")
@@ -305,7 +314,7 @@
// validates (explicitContinueState && (diposeProperty != null))
final boolean explicitContinueState = isExplicitContinueState(message);
- final boolean continueState = explicitContinueState || isContinueStateOrDefault(message);
+ final boolean continueState = explicitContinueState || isContinueStateOrDefault(ruleInfo, message);
final StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose, continueState);
@@ -439,6 +448,11 @@
{
return ruleFireMethod;
}
+
+ public Boolean getDefaultContinue()
+ {
+ return defaultContinue;
+ }
public RuleInfoBuilder getRuleInfoBuilder()
{
@@ -454,6 +468,7 @@
builder.maxThreads(maxThreads);
builder.channels(channels);
builder.ruleFireMethod(ruleFireMethod);
+ builder.defaultContinue(defaultContinue);
return builder;
}
@@ -502,7 +517,7 @@
return isExplicitContinueState;
}
- private static boolean isContinueStateOrDefault(final Message message) throws RuleServiceException
+ private static boolean isContinueStateOrDefault(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
{
final Object continueProperty = message.getProperties().getProperty(CONTINUE.getName());
if (continueProperty != null)
@@ -511,7 +526,15 @@
}
else
{
- return DEFAULT_CONTINUE_STATE;
+ final Boolean defaultContinue = ruleInfo.getDefaultContinue() ;
+ if (defaultContinue != null)
+ {
+ return defaultContinue.booleanValue() ;
+ }
+ else
+ {
+ return DEFAULT_CONTINUE_STATE;
+ }
}
}
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/StatefulRuleInfoImpl.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -138,4 +138,8 @@
return ruleInfo.getRuleFireMethod();
}
+ public Boolean getDefaultContinue()
+ {
+ return ruleInfo.getDefaultContinue();
+ }
}
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -55,6 +55,7 @@
* <property name="ruleMultithreadEvaluation" value="false" />
* <property name="ruleMaxThreads" value="1" />
* <property name="stateful" value="true" />
+ * <property name="defaultContinue" value="trur" />
* <property name="object-paths">
* <object-path esb="body.TheOrderHeader" />
* <object-path esb="body.TheCustomer" />
@@ -81,7 +82,7 @@
* <li> <i>ruleAuditType</i> Optional property that defines the type of KnowledgeRuntimeLogger used (CONSOLE, FILE, THREADED_FILE). If not defined and neither is ruleAuditFile, no auditing is done. If not defined but ruleAuditFile is, the assumption is THREADED_FILE.
* <li> <i>ruleAuditFile</i> Optional property that defines the file path for a ruleAuditType of FILE or THREADED_FILE ("event" is the default, and ".log" is always appended).
* <li> <i>ruleAuditInterval</i> Optional property that defines the interval (in milliseconds) for a ruleAuditType of THREADED_FILE (1000 is the default).
- * <li> <i>ruleclockType</i> Optional property that defines the type of clock used (REALTIME, PSEUDO). Default is up to drools.
+ * <li> <i>ruleClockType</i> Optional property that defines the type of clock used (REALTIME, PSEUDO). Default is up to drools.
* <li> <i>ruleEventProcessingType</i> Optional property that defines the type of event processing used (STREAM, CLOUD). Default is up to drools.
* <li> <i>ruleMultithreadEvaluation</i> Optional property that defines whether or not to enable KnowledgeBase partitioning. The default is null, which delegates to Drools' default, which is false.
* <li> <i>ruleMaxThreads</i> Optional property that defines the number of threads to use for KnowledgeBase partitioning. This is only respected if ruleMultithreadEvaluation is true. The default is null, which delegates to Drools' default..
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleInfo.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleInfo.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleInfo.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -149,5 +149,12 @@
* separated by the name. Used to support concepts like Entry Points.
*/
Map<String, List<Object>> getFacts();
+ /**
+ * If defaultContinueState is false the default behaviour should be to dispose of the stateful working memory prior to processing,
+ * if true then the default behaviour is to reuse the same stateful session, if null then the default is taken from the global properties.
+ *
+ * @return {@code boolean} specifying the default continue behaviour for this action.
+ */
+ Boolean getDefaultContinue();
}
\ No newline at end of file
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleServicePropertiesNames.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleServicePropertiesNames.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/main/java/org/jboss/soa/esb/services/rules/RuleServicePropertiesNames.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -43,7 +43,8 @@
RULE_MULTITHREAD_EVALUATION ( "ruleMultithreadEvaluation", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE} ),
DISPOSE ( "dispose", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE} ),
CONTINUE ( "continue", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE} ),
- STATEFUL ( "stateful", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE}) ;
+ STATEFUL ( "stateful", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE} ),
+ DEFAULT_CONTINUE ( "defaultContinue", new BooleanValue[]{BooleanValue.TRUE, BooleanValue.FALSE}) ;
private final String name;
private final Value<?>[] values;
Modified: labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java 2011-10-06 21:43:26 UTC (rev 37515)
+++ labs/jbossesb/branches/JBESB_4_10_CP/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java 2011-10-07 01:18:29 UTC (rev 37516)
@@ -24,6 +24,7 @@
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.CONTINUE;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DISPOSE;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
import java.math.BigDecimal;
import java.net.URISyntaxException;
@@ -228,7 +229,69 @@
assertEquals( 20.0, order.getDiscount(), 0 );
assertEquals( "20%" ,message.getBody().get("DiscountObject"));
}
+
+ @Test
+ public void processCEP() throws ConfigurationException, RegistryException, MessageRouterException, ActionProcessingException
+ {
+ final CBRConfigTreeBuilder builder = new CBRConfigTreeBuilder(false) ;
+ builder.ruleFile("CEPtest.drl") ;
+
+ final ArrayList<String> entryPoints = new ArrayList<String>() ;
+ entryPoints.add("body.Event") ;
+ final Map<String, List<String>> entryPointFacts = new HashMap<String, List<String>>() ;
+ entryPointFacts.put("event",entryPoints) ;
+ builder.entryPoints(entryPointFacts) ;
+
+ builder.stateful(true) ;
+
+ final ConfigTree config = builder.build() ;
+ config.setAttribute("ruleEventProcessingType", "STREAM") ;
+ config.setAttribute("ruleClockType", "REALTIME") ;
+ config.setAttribute("ruleFireMethod", "FIRE_UNTIL_HALT") ;
+ config.setAttribute("defaultContinue", "true") ;
+
+ final BusinessRulesProcessor processor = new BusinessRulesProcessor(config) ;
+ final Message message = MessageFactory.getInstance().getMessage() ;
+
+ assertNull("Current name", Callback.getCurrentName()) ;
+ assertNull("Current name", Callback.getCurrentVote()) ;
+
+ runCEP(processor, message, "Joe", "vote1", "Joe", "vote1") ;
+ runCEP(processor, message, "Jane", "vote2", "Jane", "vote2") ;
+ runCEP(processor, message, "Joe", "vote3", "Jane", "vote2") ;
+ runCEP(processor, message, "Jane", "vote4", "Jane", "vote2") ;
+
+ sleep(5000) ;
+
+ runCEP(processor, message, "Joe", "vote5", "Joe", "vote5") ;
+ // dispose the session after this call
+ message.getProperties().setProperty( DISPOSE.getName(), Boolean.TRUE );
+ runCEP(processor, message, "Jane", "vote6", "Jane", "vote6") ;
+ }
+
+ private static void runCEP(final BusinessRulesProcessor processor, final Message message,
+ final String name, final String vote, final String expectedName, final String expectedVote)
+ throws ActionProcessingException
+ {
+ message.getBody().add("Event", new Event(name, vote)) ;
+ processor.process(message) ;
+ // allow background threads time to finish
+ sleep(10) ;
+
+ assertEquals("currentVote", expectedVote, Callback.getCurrentVote()) ;
+ assertEquals("currentName", expectedName, Callback.getCurrentName()) ;
+ }
+
+ private static void sleep(final long delay)
+ {
+ try
+ {
+ Thread.sleep(delay) ;
+ }
+ catch (final InterruptedException ie) {} //ignore
+ }
+
public static junit.framework.Test suite()
{
return new JUnit4TestAdapter(BusinessRulesProcessorUnitTest.class);
@@ -259,4 +322,62 @@
return message;
}
+ public static class Event
+ {
+ private String name ;
+ private String vote ;
+
+ public Event(final String name, final String vote)
+ {
+ this.name = name ;
+ this.vote = vote ;
+ }
+
+ public String getName()
+ {
+ return name ;
+ }
+
+ public String getVote()
+ {
+ return vote ;
+ }
+ }
+
+ public static class Vote
+ {
+ private String name ;
+
+ public Vote(final String name)
+ {
+ this.name = name ;
+ }
+
+ public String getName()
+ {
+ return name ;
+ }
+ }
+
+ public static class Callback
+ {
+ private static String currentName ;
+ private static String currentVote ;
+
+ public static String getCurrentName()
+ {
+ return currentName ;
+ }
+
+ public static String getCurrentVote()
+ {
+ return currentVote ;
+ }
+
+ public static void processVote(final String name, final String vote)
+ {
+ currentName = name ;
+ currentVote = vote ;
+ }
+ }
}
More information about the jboss-svn-commits
mailing list