[jboss-svn-commits] JBL Code SVN: r29653 - in labs/jbossesb/trunk/product: services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Oct 19 06:47:14 EDT 2009
Author: beve
Date: 2009-10-19 06:47:13 -0400 (Mon, 19 Oct 2009)
New Revision: 29653
Modified:
labs/jbossesb/trunk/product/.classpath
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.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/soa/esb/actions/BusinessRulesProcessor.java
labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java
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/CBRConfigTreeBuilder.java
Log:
Work for https://jira.jboss.org/jira/browse/JBESB-2889 "RuleServiceCallHelper performance"
Modified: labs/jbossesb/trunk/product/.classpath
===================================================================
--- labs/jbossesb/trunk/product/.classpath 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/.classpath 2009-10-19 10:47:13 UTC (rev 29653)
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/antlr-runtime-3.1.1.jar"/>
<classpathentry kind="lib" path="lib/ext/jbossws-core.jar"/>
<classpathentry kind="lib" path="lib/ext/jboss-jaxws.jar"/>
<classpathentry kind="lib" path="lib/ext/jboss-saaj.jar"/>
<classpathentry excluding="**/.svn/" kind="src" path="rosetta/src"/>
+ <classpathentry kind="src" path="services/jbrules/src/main/resources"/>
+ <classpathentry kind="src" path="services/jbrules/src/test/resources"/>
<classpathentry excluding="**/.svn/" kind="src" path="rosetta/tests/src"/>
<classpathentry excluding="**/.svn/" kind="src" path="rosetta/tests/resources"/>
<classpathentry excluding="**/.svn/" kind="src" path="services/slsb/src/main/java"/>
@@ -159,5 +162,14 @@
<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.0.1.jar"/>
<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.1.0.jar"/>
<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.2.0.jar"/>
+ <classpathentry kind="lib" path="build/jbossesb-server-4.6/server/default/lib/hsqldb.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/core-3.4.2.v_883_R34x.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/drools-jsr94-5.0.1.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/drools-mc-5.0.1.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/drools-templates-5.0.1.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/janino-2.5.15.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/jsr94-1.1.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/jxl-2.4.2.jar"/>
+ <classpathentry kind="lib" path="services/jbrules/lib/ext/xpp3_min-1.1.3.4.O.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -27,13 +27,15 @@
import java.util.Map;
import org.apache.log4j.Logger;
-import org.drools.lang.DRLParser.entry_point_key_return;
+import org.jboss.internal.soa.esb.services.rules.RuleInfoBuilder;
import org.jboss.internal.soa.esb.services.rules.RuleServiceCallHelper;
import org.jboss.internal.soa.esb.services.rules.RuleServiceException;
+import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.services.routing.MessageRouterException;
import org.jboss.soa.esb.services.routing.cbr.ContentBasedRouter;
+import org.jboss.soa.esb.services.rules.RuleInfo;
/**
* The Implementation of a rule based Content Router. Here we use JBossRules.
@@ -47,8 +49,8 @@
{
private static Logger logger = Logger.getLogger(JBossRulesRouter.class);
- private ConfigTree configTree;
-
+ private RuleServiceCallHelper ruleServiceCallHelper;
+
/**
* Route the message with a reference to the ruleSets supplied in the message.
* Not implemented.
@@ -85,7 +87,7 @@
final Message message,
final List<Object> objectList) throws MessageRouterException
{
- return route(ruleSet, null, ruleReload, message, objectList);
+ return route(message, objectList);
}
/**
@@ -115,23 +117,41 @@
Message message,
final List<Object> objectList ) throws MessageRouterException
{
- try
- {
- Map<String,Object> globals = new HashMap<String,Object>();
- List<String> destinations = new ArrayList<String>();
- globals.put( "destinations", destinations );
- message = RuleServiceCallHelper.executeRulesService( ruleSet, ruleLanguage, ruleReload, message, objectList, globals, configTree );
- return destinations;
- }
- catch (final RuleServiceException e)
- {
- throw new MessageRouterException(e.getMessage(), e);
- }
+ return route(message, objectList);
}
-
+
+ private List<String> route(Message message, final List<Object> objectList) throws MessageRouterException
+ {
+ try
+ {
+ final Map<String,Object> globals = new HashMap<String,Object>();
+ List<String> destinations = new ArrayList<String>();
+ globals.put("destinations", destinations);
+
+ RuleInfoBuilder builder = ruleServiceCallHelper.getRuleInfoBuilder();
+ builder.globals(globals);
+ builder.defaultFacts(objectList);
+ final RuleInfo ruleInfo = builder.build();
+ ruleServiceCallHelper.executeRulesService(message, ruleInfo);
+
+ return destinations;
+ }
+ catch (final RuleServiceException e)
+ {
+ throw new MessageRouterException(e.getMessage(), e);
+ }
+ }
+
public void setConfigTree(final ConfigTree configTree)
{
- this.configTree = configTree;
+ try
+ {
+ this.ruleServiceCallHelper = new RuleServiceCallHelper(configTree);
+ }
+ catch (ConfigurationException e)
+ {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
}
}
Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -52,6 +52,12 @@
AssertArgument.isNotNullAndNotEmpty(ruleSource, "ruleSource");
this.ruleSource = ruleSource;
}
+
+ public RuleInfoBuilder ruleSource(final String ruleSource)
+ {
+ this.ruleSource = ruleSource;
+ return this;
+ }
public RuleInfoBuilder ruleType(final String type)
{
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-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -21,22 +21,25 @@
*/
package org.jboss.internal.soa.esb.services.rules;
+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.RULE_AGENT_PROPERTIES;
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;
import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.STATEFUL;
-import java.util.List;
-import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.listeners.ListenerTagNames;
import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.services.rules.RuleInfo;
import org.jboss.soa.esb.services.rules.RuleService;
-import org.apache.log4j.Logger;
+import org.jboss.soa.esb.services.rules.StatefulRuleInfo;
/**
- * RuleServiceCallHelper is a util class for calling
+ * RuleServiceCallHelper is a class for calling
* methods on a {@link RuleService} implementation.
* </p>
*
@@ -45,137 +48,247 @@
*/
public class RuleServiceCallHelper
{
-
private static Logger logger = Logger.getLogger(RuleServiceCallHelper.class);
+
+ /**
+ * The {@link RuleService} implementation to use.
+ */
+ private RuleService ruleService;
+
+ /**
+ * The rule set.
+ */
+ private String ruleSet;
+
+ /**
+ * The optional rule language. (DSL)
+ */
+ private String ruleLanguage;
+
+ /**
+ * True if a ruleSet is being used.
+ */
+ private boolean useRuleSet;
- private RuleServiceCallHelper()
+ /**
+ * The decision table to be use, if configured.
+ */
+ private String decisionTable;
+ private boolean useDecisionTable;
+
+ /**
+ * The rule agent to be use, if configured.
+ */
+ private String ruleAgent;
+ private boolean useRuleAgent;
+
+ /**
+ * Should this be a stateful rules execution.
+ */
+ private boolean stateful;
+
+ /**
+ * Controll the reloading of rules.
+ */
+ private boolean ruleReload;
+
+ public RuleServiceCallHelper(final ConfigTree config) throws ConfigurationException
{
- throw new AssertionError();
+ final String ruleServiceImpl = config.getAttribute(IMPL_CLASS.getTagName(), DroolsRuleService.class.getName());
+ try
+ {
+ ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
+ ruleService.setConfigTree( config );
+ }
+ catch (RuleServiceException e)
+ {
+ throw new ConfigurationException("Could not create RuleService", e);
+ }
+
+ ruleSet = config.getAttribute(ListenerTagNames.RULE_SET_TAG);
+ ruleLanguage = config.getAttribute(ListenerTagNames.RULE_LANGUAGE_TAG);
+
+ String ruleReloadStr = config.getAttribute(ListenerTagNames.RULE_RELOAD_TAG);
+ if (ruleReloadStr != null && "true".equals(ruleReloadStr))
+ {
+ ruleReload = true;
+ }
+
+ useRuleSet = ruleSet != null;
+ if (ruleSet == null)
+ {
+ // Extract the decicion table from the configuration(if configured).
+ decisionTable = config.getAttribute( DECISION_TABLE.getTagName() );
+ useDecisionTable = decisionTable != null;
+
+ if (useDecisionTable == false)
+ {
+ // Extract the ruleAgent from the configuration(if configured).
+ ruleAgent = config.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
+ useRuleAgent = true;
+
+ if(logger.isDebugEnabled())
+ {
+ if (ruleAgent != null && ruleReload)
+ {
+ logger.debug("'" + RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified. Ignoring the '" + RULE_RELOAD_TAG + "' configuration.");
+ }
+ }
+ }
+ }
+
+ stateful = Boolean.valueOf(config.getAttribute(STATEFUL.getTagName()));
}
- public static Message executeRulesService(
- String ruleSet,
- final String ruleLanguage,
- final boolean ruleReload,
- Message message,
- final List<Object> objectList,
- final Map<String, Object> globals,
- final ConfigTree configTree ) throws RuleServiceException
- {
- return executeRulesService(ruleSet, ruleLanguage, ruleReload, message, objectList, globals, null, configTree);
- }
-
- /**
- * This helper method delegates to the configured RuleService implementation.
- * <p/>
- * If the message object instance has a property 'continue' set to true, this method
- * will invoke {@link RuleService#continueStatefulRulesExecution(String, boolean, Message, Map, List)}.
- * This will continue an existing stateful session.
- * <br>
- * <br>
- * Otherwise this method will delete one of the stateless or stateful methods in RuleService
- * depending on the configuration property 'stateful' is true or false. Default is stateless.
- *
- * @param ruleSet -
- * String reference to a file which contains a ruleSet.
- * @param ruleLanguage -
- * String reference to a file which contains a custom rule
- * language definition
- * @param ruleReload -
- * if set to true, a ruleSet update should result in reloading the ruleSet.
- * @param message -
- * Message that is updated with the results.
- * @param objectList -
- * a list with additional objects (typically pulled from the message) to be inserted into
- * working memory
- * @param globals -
- * Map of globals variables that should be set in the working memory
- * @param configTree -
- * configuration instance to access properties from jboss-esb.xml
- * @return Message -
- * the ESB Message object which might have been updated.
- * @throws RuleServiceException
- */
- public static Message executeRulesService(
- String ruleSet,
- final String ruleLanguage,
- final boolean ruleReload,
- Message message,
- final List<Object> objectList,
- final Map<String, Object> globals,
- final Map<String, List<Object>> entryPointMap,
- final ConfigTree configTree ) throws RuleServiceException
- {
- final String ruleServiceImpl = configTree.getAttribute( IMPL_CLASS.getTagName(), "org.jboss.internal.soa.esb.services.rules.DroolsRuleService" );
- final RuleService ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
- ruleService.setConfigTree( configTree );
-
- final String decisionTable = configTree.getAttribute( DECISION_TABLE.getTagName() );
- final String ruleAgent = configTree.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
-
- if(logger.isDebugEnabled()) {
- final boolean isRuleReloadSpecified = (configTree.getAttribute(ListenerTagNames.RULE_RELOAD_TAG) != null);
- if (ruleAgent != null && isRuleReloadSpecified) {
- logger.debug("'" + ListenerTagNames.RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified. Ignoring the '" + ListenerTagNames.RULE_RELOAD_TAG + "' configuration.");
+ public Message executeRulesService(Message message, final RuleInfo ruleInfo) throws RuleServiceException
+ {
+ if (isStateful())
+ {
+ return executeStateful(ruleInfo, message);
+ }
+ else
+ {
+ return executeStateless(ruleInfo, message);
+ }
+ }
+
+ public Message executeStateless(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
+ {
+ if (useRuleSet)
+ {
+ return ruleService.executeStatelessRules(ruleInfo, message);
+ }
+ else if (useDecisionTable)
+ {
+ return ruleService.executeStatelessRulesFromDecisionTable(ruleInfo, message);
+ }
+ else if (useRuleAgent)
+ {
+ return ruleService.executeStatelessRulesFromRuleAgent(ruleInfo, message);
+ }
+ else
+ {
+ throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
+ }
+
+ }
+
+ public Message executeStateful(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
+ {
+ final boolean dispose = getDisposeProperty(message);
+ StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose);
+
+ final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
+ if (continueStateful)
+ {
+ checkDisposePropertyIsSpecified(message);
+ return ruleService.continueStatefulRulesExecution(statefulRuleInfo, message);
+ }
+ else
+ {
+ if (useRuleSet)
+ {
+ return ruleService.executeStatefulRules(statefulRuleInfo, message);
}
+ else if (useDecisionTable)
+ {
+ return ruleService.executeStatefulRulesFromDecisionTable(statefulRuleInfo, message);
+ }
+ else if (useRuleAgent)
+ {
+ return ruleService.executeStatefulRulesFromRuleAgent(statefulRuleInfo, message);
+ }
+ else
+ {
+ throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
+ }
}
+ }
+
+ public String determineRuleSource()
+ {
+ if (useRuleSet)
+ {
+ return ruleSet;
+ }
+ else if (useDecisionTable)
+ {
+ return decisionTable;
+ }
+ else
+ {
+ return ruleAgent;
+ }
+ }
+
+ public boolean isUseRuleSet()
+ {
+ return useRuleSet;
+ }
+
+ public boolean isUseDecisionTable()
+ {
+ return useDecisionTable;
+ }
+
+ public boolean isUseRuleAgent()
+ {
+ return useRuleAgent;
+ }
+
+ public boolean isStateful()
+ {
+ return stateful;
+ }
+
+ public String getRuleSet()
+ {
+ return ruleSet;
+ }
- final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
- if ( continueStateful )
- {
- // ruleSet can be a rule file, decisiontable or a ruleAgent properties file for continueStatefulRules
- if ( ruleSet == null )
- ruleSet = decisionTable != null ? decisionTable : ruleAgent;
-
- message = ruleService.continueStatefulRulesExecution( ruleSet, getDisposeProperty( message ), message, globals, objectList );
- }
- else
- {
- final boolean stateful = Boolean.valueOf( configTree.getAttribute( STATEFUL.getTagName()) );
-
- if ( stateful )
- {
- if ( ruleSet != null )
- message = ruleService.executeStatefulRules( ruleSet, ruleLanguage, ruleReload, message, globals, objectList );
- else if ( decisionTable != null )
- message = ruleService.executeStatefulRulesFromDecisionTable( decisionTable, ruleReload, message, globals, objectList );
- else if ( ruleAgent != null )
- message = ruleService.executeStatefulRulesFromRuleAgent( ruleAgent, message, globals, objectList );
- else
- throwRuleServiceException();
- }
- else
- {
- if ( ruleSet != null )
- message = ruleService.executeStatelessRules( ruleSet, ruleLanguage, ruleReload, message, globals, objectList );
- else if ( decisionTable != null )
- message = ruleService.executeStatelessRulesFromDecisionTable( decisionTable, ruleReload, message, globals, objectList );
- else if ( ruleAgent != null )
- message = ruleService.executeStatelessRulesFromRuleAgent( ruleAgent, message, globals, objectList );
- else
- throwRuleServiceException();
- }
- }
- return message;
- }
-
- // private static methods
-
- private static void throwRuleServiceException() throws RuleServiceException
- {
- throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
- }
-
- private static boolean getDisposeProperty( final Message message ) throws RuleServiceException
- {
- Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
- if ( dispose == null )
- {
- throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
- CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
- " be disposed or memory leaks can occur.");
- }
- return (Boolean)dispose;
- }
+ public String getRuleLanguage()
+ {
+ return ruleLanguage;
+ }
+ public String getDecisionTable()
+ {
+ return decisionTable;
+ }
+
+ public String getRuleAgent()
+ {
+ return ruleAgent;
+ }
+
+ public boolean isRuleReload()
+ {
+ return ruleReload;
+ }
+
+ public RuleInfoBuilder getRuleInfoBuilder()
+ {
+ final RuleInfoBuilder builder = new RuleInfoBuilder(determineRuleSource());
+ builder.dslSource(ruleLanguage);
+ builder.reload(ruleReload);
+ return builder;
+ }
+
+ private static boolean getDisposeProperty(final Message message) throws RuleServiceException
+ {
+ Object dispose = message.getProperties().getProperty(DISPOSE.getTagName());
+ return (dispose != null);
+ }
+
+ private static void checkDisposePropertyIsSpecified( final Message message ) throws RuleServiceException
+ {
+ Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
+ if ( dispose == null )
+ {
+ throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
+ CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
+ " be disposed or memory leaks can occur.");
+ }
+ }
}
+
\ No newline at end of file
Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -21,33 +21,19 @@
*/
package org.jboss.soa.esb.actions;
-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.DISPOSE;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.IMPL_CLASS;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.RULE_AGENT_PROPERTIES;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.STATEFUL;
-
import java.util.List;
-import org.apache.log4j.Logger;
-import org.jboss.internal.soa.esb.services.rules.DroolsRuleService;
import org.jboss.internal.soa.esb.services.rules.RuleInfoBuilder;
+import org.jboss.internal.soa.esb.services.rules.RuleServiceCallHelper;
import org.jboss.internal.soa.esb.services.rules.RuleServiceException;
-import org.jboss.internal.soa.esb.services.rules.RuleServiceFactory;
-import org.jboss.internal.soa.esb.services.rules.StatefulRuleInfoImpl;
import org.jboss.internal.soa.esb.services.rules.util.RuleConfigUtil;
import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
-import org.jboss.soa.esb.listeners.ListenerTagNames;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.mapping.ObjectMappingException;
import org.jboss.soa.esb.services.registry.RegistryException;
import org.jboss.soa.esb.services.routing.MessageRouterException;
import org.jboss.soa.esb.services.rules.RuleInfo;
-import org.jboss.soa.esb.services.rules.RuleService;
-import org.jboss.soa.esb.services.rules.StatefulRuleInfo;
/**
* BusinessRulesProcessor extends {@link ContentBasedRouter} but does not perform any routing, it only
@@ -83,85 +69,14 @@
*/
public class BusinessRulesProcessor extends ContentBasedRouter
{
- /**
- * Logger.
- */
- private Logger log = Logger.getLogger(BusinessRulesProcessor.class);
-
- /**
- * The {@link RuleService} implementation to use.
- */
- private RuleService ruleService;
-
- /**
- * True if a ruleSet is being used.
- */
- private boolean useRuleSet;
+ private RuleServiceCallHelper ruleServiceCallHelper;
- /**
- * The decision table to be use, if configured.
- */
- private String decisionTable;
- private boolean useDecisionTable;
-
- /**
- * The rule agent to be use, if configured.
- */
- private String ruleAgent;
- private boolean useRuleAgent;
-
- /**
- * ConfigTree representing the xml configuration.
- */
- private ConfigTree configTree;
-
- /**
- * Should this be a stateful rules execution.
- */
- private Boolean stateful;
-
public BusinessRulesProcessor(final ConfigTree config) throws ConfigurationException, RegistryException, MessageRouterException
{
super(config);
- this.configTree = config;
-
- // Create the RuleService implementation.
- final String ruleServiceImpl = configTree.getAttribute(IMPL_CLASS.getTagName(), DroolsRuleService.class.getName());
- try
- {
- ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
- ruleService.setConfigTree( configTree );
- }
- catch (RuleServiceException e)
- {
- throw new ConfigurationException("Could not create RuleService", e);
- }
-
- useRuleSet = _ruleSet != null;
- if (useRuleSet == false)
- {
- // Extract the decicion table from the configuration(if configured).
- decisionTable = configTree.getAttribute( DECISION_TABLE.getTagName() );
- useDecisionTable = decisionTable != null;
-
- if (useDecisionTable == false)
- {
- // Extract the ruleAgent from the configuration(if configured).
- ruleAgent = configTree.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
- useRuleAgent = true;
-
- if(log.isDebugEnabled())
- {
- if (ruleAgent != null && _ruleReload)
- {
- log.debug("'" + RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified. Ignoring the '" + RULE_RELOAD_TAG + "' configuration.");
- }
- }
- }
- }
-
- stateful = Boolean.valueOf( configTree.getAttribute( STATEFUL.getTagName()) );
+ ruleServiceCallHelper = new RuleServiceCallHelper(config);
}
+
/**
* Inspect the content of the message using a rule set
*
@@ -186,139 +101,14 @@
}
}
- /**
- *
- * @param message
- * @param objectList
- * @throws RuleServiceException
- * @throws MessageRouterException
- */
Message executeRulesService(Message message, final List<Object> objectList) throws RuleServiceException
{
- final String ruleSource = determineRuleSource();
- RuleInfoBuilder builder = new RuleInfoBuilder(ruleSource);
- builder.dslSource(_ruleLanguage);
+ final RuleInfoBuilder builder = ruleServiceCallHelper.getRuleInfoBuilder();
builder.global("message", message);
- builder.reload(_ruleReload);
builder.facts(RuleConfigUtil.extractObjectsFromMessage(entryPointMap, message));
builder.defaultFacts(objectList);
-
final RuleInfo ruleInfo = builder.build();
-
- if (stateful)
- {
- return executeStateful(ruleInfo, message);
- }
- else
- {
- return executeStateless(ruleInfo, message);
- }
+ return ruleServiceCallHelper.executeRulesService(message, ruleInfo);
}
- private Message executeStateless(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
- {
- if (useRuleSet)
- {
- return ruleService.executeStatelessRules(ruleInfo, message);
- }
- else if (useDecisionTable)
- {
- return ruleService.executeStatelessRulesFromDecisionTable(ruleInfo, message);
- }
- else if (useRuleAgent)
- {
- return ruleService.executeStatelessRulesFromRuleAgent(ruleInfo, message);
- }
- else
- {
- throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
- }
-
- }
-
- private Message executeStateful(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
- {
- final boolean dispose = getDisposeProperty(message);
- StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose);
-
- final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
- if (continueStateful)
- {
- checkDisposePropertyIsSpecified(message);
- return ruleService.continueStatefulRulesExecution(statefulRuleInfo, message);
- }
- else
- {
- if (useRuleSet)
- {
- return ruleService.executeStatefulRules(statefulRuleInfo, message);
- }
- else if (useDecisionTable)
- {
- return ruleService.executeStatefulRulesFromDecisionTable(statefulRuleInfo, message);
- }
- else if (useRuleAgent)
- {
- return ruleService.executeStatefulRulesFromRuleAgent(statefulRuleInfo, message);
- }
- else
- {
- throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
- }
- }
- }
-
- private static Message throwRuleServiceException() throws RuleServiceException
- {
- throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
- }
-
- private String determineRuleSource()
- {
- if (useRuleSet)
- {
- return _ruleSet;
- }
- else if (useDecisionTable)
- {
- return decisionTable;
- }
- else
- {
- return ruleAgent;
- }
- }
-
- private static boolean getDisposeProperty( final Message message ) throws RuleServiceException
- {
- Object dispose = message.getProperties().getProperty(DISPOSE.getTagName());
- return (dispose != null);
- }
-
- private static void checkDisposePropertyIsSpecified( final Message message ) throws RuleServiceException
- {
- Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
- if ( dispose == null )
- {
- throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
- CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
- " be disposed or memory leaks can occur.");
- }
- }
-
- boolean isUseRuleSet()
- {
- return useRuleSet;
- }
-
- boolean isUseDecisionTable()
- {
- return useDecisionTable;
- }
-
- boolean isUseRuleAgent()
- {
- return useRuleAgent;
- }
-
}
Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -65,7 +65,7 @@
ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules.drl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null, false, message, null);
assertNotNull(destinationServices);
assertTrue(destinationServices.size()>0);
assertEquals(destinationServices.iterator().next(),"serialized-destination");
@@ -107,7 +107,7 @@
Message message = createMessage( MessageType.JBOSS_XML);
ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules.drl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null, null, false, message, null);
assertEquals(destinationServices.iterator().next(),"xml-destination");
}
@@ -116,10 +116,10 @@
{
Message message = createMessage( MessageType.JBOSS_XML);
message.getBody().add(("<jbossesb>TEST BODY</jbossesb>").getBytes());
- ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+ ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null,null, false, message, null);
assertEquals(destinationServices.iterator().next(),"XML_XPath_Destination");
}
@@ -129,10 +129,10 @@
Message message = createMessage( MessageType.JBOSS_XML );
message.getBody().add(("<Dave>rocks</Dave>").getBytes());
- ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+ ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null,null, false, message, null);
assertEquals(destinationServices.iterator().next(),"XML_XPath_Dave_Destination");
}
@@ -142,10 +142,10 @@
Message message = createMessage( MessageType.JBOSS_XML );
message.getBody().add(("<price>1.55</price>").getBytes());
- ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+ ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null, null,false, message, null);
assertEquals(destinationServices.iterator().next(),"XML_XPath_GreaterThan_Destination");
}
@@ -157,17 +157,17 @@
Message message = MessageFactory.getInstance().getMessage( MessageType.JBOSS_XML );
//set the body inside the Message
message.getBody().add(("<price>0.55</price>").getBytes());
- ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+ ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
jbrRouter.setConfigTree( configTree );
- List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+ List<String> destinationServices = jbrRouter.route(null, null,false,message,null);
assertEquals(destinationServices.iterator().next(),"XML_XPath_LessThan_Destination");
} catch (MessageRouterException e) {
e.printStackTrace();
}
}
- @Test ( expected = MessageRouterException.class )
+ @Test ( expected = IllegalArgumentException.class )
public void shouldThrowIfNoRuleSetIsSupplied() throws MessageRouterException
{
//add new messages
@@ -178,7 +178,7 @@
jbrRouter.route( null ,"XPathLanguage.dsl",false,message,null);
}
- @Test ( expected = MessageRouterException.class )
+ @Test ( expected = IllegalStateException.class )
public void shouldThrowIfRuleServiceImplIsInvalid() throws MessageRouterException
{
//add new messages
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-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -140,36 +140,6 @@
assertEquals( "20%" ,message.getBody().get("DiscountObject"));
}
- @Test
- public void isUseRuleSet() throws ConfigurationException, RegistryException, MessageRouterException
- {
- ConfigTree config = new CBRConfigTreeBuilder(true).ruleFile("test.dsl").build();
- BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
- assertTrue(processor.isUseRuleSet());
- assertFalse(processor.isUseRuleAgent());
- assertFalse(processor.isUseDecisionTable());
- }
-
- @Test
- public void isUseDecisionTable() throws ConfigurationException, RegistryException, MessageRouterException
- {
- ConfigTree config = new CBRConfigTreeBuilder(true).decisionTable("test.exl").build();
- BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
- assertTrue(processor.isUseDecisionTable());
- assertFalse(processor.isUseRuleSet());
- assertFalse(processor.isUseRuleAgent());
- }
-
- @Test
- public void isUseRuleAgent() throws ConfigurationException, RegistryException, MessageRouterException
- {
- ConfigTree config = new CBRConfigTreeBuilder(true).ruleAgent("testRuleAgentFile.properties").build();
- BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
- assertTrue(processor.isUseRuleAgent());
- assertFalse(processor.isUseRuleSet());
- assertFalse(processor.isUseDecisionTable());
- }
-
public static junit.framework.Test suite()
{
return new JUnit4TestAdapter(BusinessRulesProcessorUnitTest.class);
Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java 2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java 2009-10-19 10:47:13 UTC (rev 29653)
@@ -45,6 +45,7 @@
// optional
private String ruleFile;
+ private String ruleLanguage;
private List<String> messagePathList;
private Map<String, List<String>> entryPointFacts;
private boolean stateful;
@@ -64,6 +65,12 @@
return this;
}
+ public CBRConfigTreeBuilder ruleLanguage( final String dsl )
+ {
+ this.ruleLanguage = dsl;
+ return this;
+ }
+
public CBRConfigTreeBuilder decisionTable( final String decisionTable )
{
this.decisionTable = decisionTable;
@@ -115,6 +122,9 @@
else
throw new IllegalStateException("One of ruleFile, decisionTable or ruleAgent must be set");
+ if (ruleLanguage != null)
+ configTree.setAttribute( ListenerTagNames.RULE_LANGUAGE_TAG, ruleLanguage);
+
if ( messagePathList != null )
{
More information about the jboss-svn-commits
mailing list