[jboss-svn-commits] JBL Code SVN: r20505 - in labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src: main/java/org/jboss/internal/soa/esb/services/rules and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jun 15 13:05:19 EDT 2008
Author: beve
Date: 2008-06-15 13:05:18 -0400 (Sun, 15 Jun 2008)
New Revision: 20505
Modified:
labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java
labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelperUnitTest.java
Log:
Refactoring of code base.
Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java 2008-06-15 15:33:10 UTC (rev 20504)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java 2008-06-15 17:05:18 UTC (rev 20505)
@@ -143,7 +143,7 @@
final String ruleLanguage,
final boolean ruleReload,
final Message message,
- final List<Object> objectList) throws MessageRouterException
+ final List<Object> objectList ) throws MessageRouterException
{
try
{
@@ -157,7 +157,7 @@
globals.put( "destinations", destinations );
Message routeMessage;
- if ( ruleSet.endsWith( ".xls" ) || ruleSet.endsWith( ".csv" ) )
+ if ( DroolsRuleService.isDecisionTable( ruleSet ) )
{
if ( stateful )
routeMessage = ruleService.executeStatefulRulesFromDecisionTable( ruleSet, ruleReload, dispose, message, globals, objectList );
Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java 2008-06-15 15:33:10 UTC (rev 20504)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java 2008-06-15 17:05:18 UTC (rev 20505)
@@ -26,6 +26,7 @@
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
import org.apache.log4j.Logger;
import org.drools.RuleBase;
@@ -37,17 +38,34 @@
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.drools.rule.Package;
+import org.jboss.internal.soa.esb.util.StreamUtils;
import org.jboss.soa.esb.util.ClassUtil;
/**
* A helper class, it returns rulebases based on various methods of creating them
*
* @author jdelong at redhat.com
+ * @author <a href="mailto:dbevenius at redhat.com">Daniel Bevenius</a>
*
*/
public class DroolsRuleBaseHelper {
private static Logger logger = Logger.getLogger(DroolsRuleBaseHelper.class);
+
+ private DroolsRuleBaseHelper() {}
+
+ /**
+ * Factory method that returns an instance of this class.
+ * </p>
+ * The current implemenations returns a new instance of this
+ * class for every call.
+ *
+ * @return {@link DroolsRuleBaseHelper}
+ */
+ public static DroolsRuleBaseHelper getInstance()
+ {
+ return new DroolsRuleBaseHelper();
+ }
/**
* Creates a rulebase using rules and dsl from files
@@ -66,8 +84,11 @@
* if the ruleFile cannot be located or if it was not possible to
* add the package to the RuleBase.
*/
- public RuleBase createRuleBaseFromRuleFiles(String ruleFile, String dsl)
- throws DroolsParserException, IOException, RuleServiceException {
+ public RuleBase createRuleBaseFromRuleFiles(
+ final String ruleFile,
+ final String dsl)
+ throws DroolsParserException, IOException, RuleServiceException
+ {
assertNotNull( ruleFile, "ruleFile" );
logger.debug("Going to create a rulebase from the ruleFile: " + ruleFile);
@@ -77,35 +98,50 @@
Reader ruleReader = getRulesReader(rulesInputStream);
PackageBuilder builder = new PackageBuilder(new PackageBuilderConfiguration());
- try {
- if (dsl == null) {
+ try
+ {
+ if ( dsl == null )
+ {
builder.addPackageFromDrl(ruleReader);
- } else {
+ }
+ else
+ {
logger.debug("Going to read the dsl: " + dsl);
- InputStream dslInputStream = getRulesInputStream(dsl);
- Reader dslReader = getRulesReader(dslInputStream);
- if (dslReader == null) {
+ InputStream dslInputStream = getRulesInputStream( dsl );
+ Reader dslReader = getRulesReader( dslInputStream );
+ if ( dslReader == null )
+ {
logger.error("Could not find dsl: " + ruleFile);
- } else {
- try {
+ }
+ else
+ {
+ try
+ {
builder.addPackageFromDrl(ruleReader, dslReader);
- } finally {
+ }
+ finally
+ {
safeClose(dslInputStream);
}
}
}
- } finally {
+ }
+ finally
+ {
safeClose(rulesInputStream);
}
// get the compiled package (which is serializable)
Package pkg = builder.getPackage();
// add the package to a rulebase
- try {
+ try
+ {
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage(pkg);
return ruleBase;
- } catch (final Exception ex) {
+ }
+ catch (final Exception ex)
+ {
throw new RuleServiceException(ex.getMessage(), ex);
}
}
@@ -127,35 +163,17 @@
* add the package to the RuleBase.
* @throws RuleServiceException
*/
- public String getRulesAsString(String ruleFile, String dsl) throws IOException, RuleServiceException {
+ public String getRulesAsString(
+ final String ruleFile,
+ final String dsl) throws IOException, RuleServiceException
+ {
assertNotNull( ruleFile, "rulefile" );
- logger.debug("Going to hash the rule: " + ruleFile);
- InputStream rulesInputStream = getRulesInputStream(ruleFile);
-
- final String rules;
- try {
- rules = getString(rulesInputStream);
- } finally {
- safeClose(rulesInputStream);
- }
-
- String language = "";
- if (dsl != null) {
- logger.debug("Going to hash the language: " + dsl);
- InputStream dslInputStream = getRulesInputStream(dsl);
- if (dslInputStream == null) {
- logger.error("Could not find language: " + dsl);
- } else {
- try {
- language = getString(dslInputStream);
- } finally {
- safeClose(dslInputStream);
- }
- }
- }
- return rules + language;
+ final String rules = getFileContents( ruleFile );
+ return dsl == null ? rules : rules + getFileContents( dsl );
}
+
+
/**
@@ -170,20 +188,25 @@
*
* @throws RuleServiceException -
*/
- public RuleBase createRuleBaseFromDecisionTable(String decisionTable)
- throws DroolsParserException, IOException, RuleServiceException {
+ public RuleBase createRuleBaseFromDecisionTable(
+ final String decisionTable)
+ throws DroolsParserException, IOException, RuleServiceException
+ {
assertNotNull( decisionTable, "decisionTable" );
logger.debug("Going to read the decisionTable: " + decisionTable);
String drl = getSpreadsheetRules(decisionTable);
PackageBuilder builder = new PackageBuilder();
- builder.addPackageFromDrl(new StringReader(drl));
- try {
+ builder.addPackageFromDrl( new StringReader(drl) );
+ try
+ {
//add the package to a rulebase (deploy the rule package).
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage(builder.getPackage());
return ruleBase;
- } catch (Exception ex) {
+ }
+ catch (Exception ex)
+ {
throw new RuleServiceException(ex.getMessage(), ex);
}
}
@@ -193,16 +216,20 @@
* </p>
* @throws RuleServiceException
*/
- public String getSpreadsheetRules(String decisionTable) throws RuleServiceException {
+ public String getSpreadsheetRules(final String decisionTable) throws RuleServiceException
+ {
logger.debug("Going to read the decisionTable: " + decisionTable);
String drl;
InputStream inputStreamDT = getRulesInputStream(decisionTable);
SpreadsheetCompiler compiler = new SpreadsheetCompiler();
- try {
+ try
+ {
drl = compiler.compile(inputStreamDT, InputType.XLS);
logger.debug("Compiled the decsionTable to a drl: " + drl);
- } finally {
+ }
+ finally
+ {
safeClose(inputStreamDT);
}
return drl;
@@ -211,8 +238,8 @@
/**
* This shows how rules are loaded up from a deployed package.
*/
- public RuleBase loadRuleBaseFromRuleAgent(String ruleAgentProperties) throws IOException, Exception {
-
+ public RuleBase loadRuleBaseFromRuleAgent(final String ruleAgentProperties) throws IOException, Exception
+ {
logger.debug("Going to read the ruleAgentProperties: " + ruleAgentProperties);
RuleAgent agent = RuleAgent.newRuleAgent("/" + ruleAgentProperties);
RuleBase rb = agent.getRuleBase();
@@ -220,13 +247,34 @@
return rb;
}
+ private String getFileContents( final String fileName ) throws RuleServiceException
+ {
+ InputStream inputStream = getRulesInputStream( fileName );
+ final String fileContents;
+ try
+ {
+ fileContents = StreamUtils.readStreamString( inputStream, "UTF-8" );
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new RuleServiceException("Could not read from file [" + fileName + "].", e);
+ }
+ finally
+ {
+ safeClose( inputStream );
+ }
+ return fileContents;
+ }
+
// private instance methods
- private Reader getRulesReader(InputStream inputStream) {
+ private Reader getRulesReader(final InputStream inputStream)
+ {
return new InputStreamReader(inputStream);
}
- private InputStream getRulesInputStream(String rulesFile) throws RuleServiceException {
+ private InputStream getRulesInputStream(final String rulesFile) throws RuleServiceException
+ {
InputStream resourceAsStream = ClassUtil.getResourceAsStream( "/" + rulesFile, getClass() );
if ( resourceAsStream == null )
throw new RuleServiceException("Could not locate file [" + rulesFile + "], neither as a file on the local filesystem, on the classpath nor as a URL.");
@@ -236,25 +284,24 @@
// private static methods
- private static void safeClose(final InputStream is) {
- try {
+ private static void safeClose( final InputStream is )
+ {
+ try
+ {
is.close();
- } catch (final Throwable th) {
- } // ignore
+ }
+ catch (final IOException e)
+ {
+ logger.warn("Caught an IOException while trying to close as inputstream.", e );
+ }
}
- private static String getString(InputStream in) throws IOException {
- StringBuilder stringBuilder = new StringBuilder();
- byte[] b = new byte[4096];
- for (int i; (i = in.read(b)) != -1;) {
- stringBuilder.append(new String(b, 0, i));
- }
- return stringBuilder.toString();
- }
-
- private static void assertNotNull( final String argumentValue, final String argumentName ) {
+ private static void assertNotNull( final String argumentValue, final String argumentName )
+ {
if( argumentValue == null )
throw new NullPointerException("[" + argumentName + "] argument must not be null");
}
+
+
}
Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java 2008-06-15 15:33:10 UTC (rev 20504)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java 2008-06-15 17:05:18 UTC (rev 20505)
@@ -29,13 +29,12 @@
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
import org.drools.RuleBase;
import org.drools.StatefulSession;
import org.drools.StatelessSession;
import org.drools.WorkingMemory;
import org.drools.compiler.DroolsParserException;
+import org.jboss.internal.soa.esb.assertion.AssertArgument;
import org.jboss.internal.soa.esb.services.routing.cbr.JBRulesCounter;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.lifecycle.LifecyclePriorities;
@@ -46,28 +45,26 @@
import org.jboss.soa.esb.services.rules.RuleService;
/**
- * The Implementation of a rule engine interface for rules services. Here we use
- * JBossRules (aka Drools). We keep a HashMap of stateful session working
- * memories.
+ * JBossRules (aka Drools) Implementation of a rule engine interface for rules services. Here we use
+ * <p/>
*
* @author jdelong at redhat.com
+ * @author <a href="mailto:dbevenius at redhat.com">Daniel Bevenius</a>
*
*/
public class DroolsRuleService implements RuleService {
- private static final String MESSAGE = "message";
-
/**
- * The lifecycle resource factory.
+ * The lifecycle resource factory for RuleBases.
*/
private static final LifecycleResourceFactory<Map<String, RuleBase>> lifecycleRuleBaseFactory = new LifecycleRuleBaseFactory();
/**
- * Lifecycle couriers.
+ * The lifecycle resource bule bases.
*/
private static final LifecycleResource<Map<String, RuleBase>> lifecycleRuleBases = new LifecycleResource<Map<String, RuleBase>>(
lifecycleRuleBaseFactory, LifecyclePriorities.RULE_BASE_PRIORITY);
/**
- * The lifecycle resource factory.
+ * The lifecycle resource rule sets.
*/
private static final LifecycleResourceFactory<Map<String, String>> lifecycleRuleSetFactory = new LifecycleRuleSetFactory();
/**
@@ -76,8 +73,9 @@
private static final LifecycleResource<Map<String, String>> lifecycleRuleSets = new LifecycleResource<Map<String, String>>(
lifecycleRuleSetFactory, LifecyclePriorities.RULE_BASE_PRIORITY);
- private static Logger logger = Logger.getLogger(DroolsRuleService.class);
-
+ /**
+ * See {@link JBRulesCounter}
+ */
private JBRulesCounter rulesCounter = null;
/**
@@ -108,9 +106,11 @@
final boolean ruleReload,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( ruleSet, "ruleSet" );
- long startTime = System.nanoTime();
+ final long startTime = System.nanoTime();
try {
RuleBase ruleBase = getRuleBaseForFileBasedRules(ruleSet, dsl, ruleReload);
@@ -148,9 +148,11 @@
final boolean ruleReload,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( decisionTable, "decisionTable" );
- long startTime = System.nanoTime();
+ final long startTime = System.nanoTime();
try {
RuleBase ruleBase = getRuleBaseForDecisionTable(decisionTable, ruleReload);
@@ -185,14 +187,18 @@
final String ruleAgentProperties,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( ruleAgentProperties, "ruleAgentProperties" );
- long startTime = System.nanoTime();
- try {
- DroolsRuleBaseHelper rbHelper = new DroolsRuleBaseHelper();
+ final long startTime = System.nanoTime();
+ try
+ {
+ DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
RuleBase ruleBase = rbHelper.loadRuleBaseFromRuleAgent(ruleAgentProperties);
final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
- if (ruleBase != null) {
+ if (ruleBase != null)
+ {
ruleBases.put(ruleAgentProperties, ruleBase);
message = executeStatelessRules(ruleBase, message, globals, objectList);
@@ -202,17 +208,22 @@
return message;
- } catch (IOException ioe) {
+ }
+ catch (IOException ioe)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
throw new RuleServiceException( "Could not read the ruleAgentProperties. " + ioe.getMessage(), ioe);
- } catch (RuleServiceException ree) {
+ }
+ catch (RuleServiceException ree)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
- } catch (Exception e) {
+ }
+ catch (Exception e)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
throw new RuleServiceException( "RuleAgent could not get the RuleBase. " + e.getMessage(), e);
}
-
}
/**
@@ -244,11 +255,14 @@
final boolean dispose,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( ruleSet, "ruleSet" );
- long startTime = System.nanoTime();
+ final long startTime = System.nanoTime();
- try {
+ try
+ {
RuleBase ruleBase = getRuleBaseForFileBasedRules(ruleSet, dsl, ruleReload);
message = executeStatefulRules(ruleBase, dispose, message, globals, objectList);
@@ -256,9 +270,11 @@
return message;
- } catch (RuleServiceException ree) {
+ }
+ catch (RuleServiceException e)
+ {
updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
}
}
@@ -287,11 +303,14 @@
final boolean dispose,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( decisionTable, "decisionTable" );
- long startTime = System.nanoTime();
+ final long startTime = System.nanoTime();
- try {
+ try
+ {
RuleBase ruleBase = getRuleBaseForDecisionTable(decisionTable, ruleReload);
message = executeStatefulRules(ruleBase, dispose, message, globals, objectList);
@@ -299,9 +318,11 @@
return message;
- } catch (RuleServiceException ree) {
+ }
+ catch (RuleServiceException e)
+ {
updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
}
}
@@ -327,15 +348,19 @@
final boolean dispose,
Message message,
final Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ AssertArgument.isNotNullAndNotEmpty( ruleAgentProperties, "ruleAgentProperties" );
- long startTime = System.nanoTime();
- try {
- DroolsRuleBaseHelper rbHelper = new DroolsRuleBaseHelper();
+ final long startTime = System.nanoTime();
+ try
+ {
+ DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
RuleBase ruleBase = rbHelper.loadRuleBaseFromRuleAgent(ruleAgentProperties);
final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
- if (ruleBase != null) {
+ if (ruleBase != null)
+ {
ruleBases.put(ruleAgentProperties, ruleBase);
message = executeStatefulRules(ruleBase, dispose, message, globals, objectList);
@@ -345,17 +370,22 @@
return message;
- } catch (IOException ioe) {
+ }
+ catch (IOException e)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException( "Could not read the ruleAgentProperties. " + ioe.getMessage(), ioe);
- } catch (RuleServiceException ree) {
+ throw new RuleServiceException( "Could not read the ruleAgentProperties. " + e.getMessage(), e);
+ }
+ catch (RuleServiceException e)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
- } catch (Exception e) {
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+ }
+ catch (Exception e)
+ {
updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
throw new RuleServiceException( "RuleAgent could not get the RuleBase. " + e.getMessage(), e);
}
-
}
/**
@@ -382,10 +412,15 @@
final boolean dispose,
Message message,
Map<String,Object> globals,
- final List<Object> objectList) throws RuleServiceException {
+ final List<Object> objectList) throws RuleServiceException
+ {
+ /*
+ AssertArgument.isNotNullAndNotEmpty( rules, "rules" );
- long startTime = System.nanoTime();
- try {
+ final long startTime = System.nanoTime();
+
+ try
+ {
final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
RuleBase ruleBase = ruleBases.get(rules);
@@ -396,7 +431,9 @@
workingMemory.setGlobal(MESSAGE, message);
- if (objectList != null) {
+ addGlobalsVariables( statefulSession, globals );
+ if (objectList != null)
+ {
for (Object object : objectList) {
workingMemory.insert(object);
}
@@ -420,8 +457,16 @@
updateJBRulesCounter( startTime, rules, JBRulesCounter.RULES_FAILED );
throw new RuleServiceException( "Could not continue rule execution. " + e.getMessage(), e);
}
+ */
+ return message;
}
+ public void setConfigTree( final ConfigTree configTree )
+ {
+ rulesCounter = new JBRulesCounter( configTree );
+ rulesCounter.registerMBean();
+ }
+
/**
* Determine if file based rules need reloading and return the rulebase
*
@@ -436,65 +481,69 @@
*
* @return Message with updated objects.
*/
- protected RuleBase getRuleBaseForFileBasedRules(
+ RuleBase getRuleBaseForFileBasedRules(
final String ruleSet,
final String dsl,
- final boolean ruleReload) throws RuleServiceException {
+ final boolean ruleReload) throws RuleServiceException
+ {
- long startTime = System.nanoTime();
- try {
- DroolsRuleBaseHelper rbHelper = new DroolsRuleBaseHelper();
+ final long startTime = System.nanoTime();
+
+ try
+ {
+ final DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
String newRuleSet = null;
boolean isRulesChanged = false;
final Map<String, String> ruleSets = lifecycleRuleSets.getLifecycleResource();
- if (ruleReload) {
- String currentRuleSet = ruleSets.get(ruleSet);
- newRuleSet = rbHelper.getRulesAsString(ruleSet, dsl);
- if (currentRuleSet == null || !currentRuleSet.equals(newRuleSet)) {
+ if ( ruleReload )
+ {
+ String currentRuleSet = ruleSets.get( ruleSet );
+ newRuleSet = rbHelper.getRulesAsString( ruleSet, dsl );
+ if ( currentRuleSet == null || !currentRuleSet.equals(newRuleSet) )
+ {
isRulesChanged = true;
}
-
}
final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
RuleBase ruleBase = ruleBases.get(ruleSet);
- if (ruleBase == null || isRulesChanged) {
- logger.log(Level.DEBUG, "Reading ruleSet from file=" + ruleSet);
+ if ( ruleBase == null || isRulesChanged )
+ {
ruleBase = rbHelper.createRuleBaseFromRuleFiles(ruleSet, dsl);
if (ruleBase != null)
ruleBases.put(ruleSet, ruleBase);
- if (newRuleSet == null) {
+ if (newRuleSet == null)
newRuleSet = rbHelper.getRulesAsString(ruleSet, dsl);
- }
if (ruleSet != null)
ruleSets.put(ruleSet, newRuleSet);
}
- // this should really be a RULES_COMPILED status, and processing time should be compilationTime
- // long procTime = System.nanoTime() - startTime;
- // if (rulesCounter != null) {
- // rulesCounter.update(procTime, ruleSet, JBRulesCounter.RULES_SUCCEED);
- // }
-
return ruleBase;
- } catch (final LifecycleResourceException lre) {
+ }
+ catch (final LifecycleResourceException e)
+ {
updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not load lifecycle data. " + lre.getMessage(), lre);
- } catch (IOException ioe) {
+ throw new RuleServiceException("Could not load lifecycle data. " + e.getMessage(), e);
+ }
+ catch (final IOException e)
+ {
updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not read the rules. " + ioe.getMessage(), ioe);
- } catch (DroolsParserException dpe) {
+ throw new RuleServiceException("Could not read the rules. " + e.getMessage(), e);
+ }
+ catch (final DroolsParserException e)
+ {
updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + dpe.getMessage(), dpe);
- } catch (RuleServiceException ree) {
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+ }
+ catch (final RuleServiceException e)
+ {
updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
}
-
}
-
+
/**
* Determine if decision table need reloading and return the rulebase
*
@@ -509,39 +558,43 @@
*
* @return Message with updated objects.
*/
- protected RuleBase getRuleBaseForDecisionTable(
+ RuleBase getRuleBaseForDecisionTable(
final String decisionTable,
- final boolean ruleReload) throws RuleServiceException {
+ final boolean ruleReload ) throws RuleServiceException {
- long startTime = System.nanoTime();
- try {
- DroolsRuleBaseHelper rbHelper = new DroolsRuleBaseHelper();
+ final long startTime = System.nanoTime();
+ try
+ {
+ DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
RuleBase ruleBase;
- if (ruleReload) {
+ if ( ruleReload )
+ {
String drl = rbHelper.getSpreadsheetRules(decisionTable);
ruleBase = getRuleBaseForFileBasedRules(drl, null, ruleReload);
- } else {
+ }
+ else
+ {
ruleBase = rbHelper.createRuleBaseFromDecisionTable(decisionTable);
}
- // this should really be a RULES_COMPILED status, and processing time should be compilationTime
- // long procTime = System.nanoTime() - startTime;
- // if (rulesCounter != null) {
- // rulesCounter.update(procTime, ruleSet, JBRulesCounter.RULES_SUCCEED);
- // }
return ruleBase;
-
- } catch (IOException ioe) {
+ }
+ catch (IOException e)
+ {
updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not read the rules. " + ioe.getMessage(), ioe);
- } catch (DroolsParserException dpe) {
+ throw new RuleServiceException("Could not read the rules. " + e.getMessage(), e);
+ }
+ catch (DroolsParserException e)
+ {
updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + dpe.getMessage(), dpe);
- } catch (RuleServiceException ree) {
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+ }
+ catch (RuleServiceException e)
+ {
updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
- throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
+ throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
}
}
-
+
/**
* Execute rules using using the Stateless API
*
@@ -558,88 +611,110 @@
* @return Message -
* with updated objects.
*/
- protected Message executeStatelessRules(
+ Message executeStatelessRules(
final RuleBase ruleBase,
final Message message,
final Map<String,Object> globals,
- final List<Object> objectList) {
+ final List<Object> objectList)
+ {
- StatelessSession workingMemory = ruleBase.newStatelessSession();
-
- List<Object> facts = objectList != null ? new ArrayList<Object>(objectList) : new ArrayList<Object>();
-
- // always add the message to the facts
- facts.add(message);
-
- if ( globals != null )
- {
- Set<Entry<String, Object>> entrySet = globals.entrySet();
- for ( Entry<String, Object> entry : entrySet )
- workingMemory.setGlobal( entry.getKey(), entry.getValue() );
- }
-
- workingMemory.execute(facts);
-
+ final StatelessSession statelessSession = ruleBase.newStatelessSession();
+ final List<Object> facts = getFacts( message, objectList );
+ addGlobalsVariables( statelessSession, globals );
+ statelessSession.execute(facts);
return message;
}
-
-
/**
* Execute rules using using the Stateful API
*
* @param rulebase -
- * the rulebase to use
+ * the rulebase to use
+ * @param dispose -
+ * if true the working memory will be dereferenced.
* @param message -
- * Message that is updated with the results.
+ * Message that is updated with the results.
* @param globals -
- * Map of globals variables that should be set in the working memory
+ * Map of globals variables that should be set in the working memory
* @param objectList -
- * a list with additional objects (typically pulled from the message)
- * to be inserted into working memory
+ * a list with additional objects to be inserted into working memory
*
- * @return Message with updated objects.
+ * @return Message -
+ * a possibly updated Message object. The message object is available
+ * to Rules and my be updated by them.
*/
- protected Message executeStatefulRules(
+ Message executeStatefulRules(
final RuleBase ruleBase,
final boolean dispose,
final Message message,
final Map<String,Object> globals,
final List<Object> objectList)
{
-
- StatefulSession[] statefulSessions = ruleBase.getStatefulSessions();
- StatefulSession statefulSession;
- // do we have a pre-existing session then use it
- if ( statefulSessions != null && statefulSessions.length > 0 )
- statefulSession = statefulSessions[0];
- else
- statefulSession = ruleBase.newStatefulSession();
-
+ final StatefulSession statefulSession = getStatefulSession( ruleBase );
+ try
+ {
+ addGlobalsVariables( statefulSession, globals );
+ final List<Object> facts = getFacts( message, objectList );
+ insertObjectsIntoWorkingMemory( facts, statefulSession );
+ statefulSession.fireAllRules();
+ }
+ finally
+ {
+ if ( dispose )
+ statefulSession.dispose();
+ }
+
+ return message;
+ }
+
+ private List<Object> getFacts(final Message message, final List<Object> objectList )
+ {
+ final List<Object> facts = new ArrayList<Object>();
+ facts.add( message );
+ if ( objectList != null )
+ facts.addAll( objectList );
+ return facts;
+ }
+
+ /*
+ * Checks whether the ruleBase has an existing session, and returns
+ * that session, otherwise a new session is created.
+ */
+ private StatefulSession getStatefulSession( final RuleBase ruleBase )
+ {
+ final StatefulSession[] statefulSessions = ruleBase.getStatefulSessions();
+ boolean existingSession = statefulSessions != null && statefulSessions.length > 0;
+ return existingSession ? statefulSessions[0] : ruleBase.newStatefulSession();
+ }
+
+ /*
+ * Will set the passed-in elements in the globals Map as global
+ * variables.
+ */
+ private void addGlobalsVariables( final StatelessSession statelessSession, final Map<String,Object> globals )
+ {
if ( globals != null )
{
Set<Entry<String, Object>> entrySet = globals.entrySet();
for ( Entry<String, Object> entry : entrySet )
+ statelessSession.setGlobal( entry.getKey(), entry.getValue() );
+ }
+ }
+
+ /*
+ * Will set the passed-in elements in the globals Map as global
+ * variables.
+ */
+ private void addGlobalsVariables( final StatefulSession statefulSession, final Map<String,Object> globals )
+ {
+ if ( globals != null )
+ {
+ Set<Entry<String, Object>> entrySet = globals.entrySet();
+ for ( Entry<String, Object> entry : entrySet )
statefulSession.setGlobal( entry.getKey(), entry.getValue() );
}
-
- statefulSession.insert( message );
-
- insertObjectsIntoWorkingMemory( objectList, statefulSession );
-
- statefulSession.fireAllRules();
-
- if ( dispose )
- statefulSession.dispose();
-
- return message;
}
- public void setConfigTree(ConfigTree configTree) {
- rulesCounter = new JBRulesCounter(configTree);
- rulesCounter.registerMBean();
- }
-
/**
* The lifecycle resource factory for rule sets.
*
@@ -659,7 +734,8 @@
*/
public Map<String, RuleBase> createLifecycleResource(
final String lifecycleIdentity)
- throws LifecycleResourceException {
+ throws LifecycleResourceException
+ {
return new ConcurrentHashMap<String, RuleBase>();
}
@@ -678,7 +754,9 @@
public void destroyLifecycleResource(
final Map<String, RuleBase> resource,
final String lifecycleIdentity)
- throws LifecycleResourceException {
+ throws LifecycleResourceException
+ {
+ // NoOp
}
}
@@ -688,7 +766,8 @@
* @author kevin
*/
public static class LifecycleRuleSetFactory implements
- LifecycleResourceFactory<Map<String, String>> {
+ LifecycleResourceFactory<Map<String, String>>
+ {
/**
* Create a resource object which will be associated with the
* specified lifecycle identity.
@@ -701,7 +780,8 @@
*/
public Map<String, String> createLifecycleResource(
final String lifecycleIdentity)
- throws LifecycleResourceException {
+ throws LifecycleResourceException
+ {
return new ConcurrentHashMap<String, String>();
}
@@ -720,24 +800,34 @@
public void destroyLifecycleResource(
final Map<String, String> resource,
final String lifecycleIdentity)
- throws LifecycleResourceException {
+ throws LifecycleResourceException
+ {
+ // NoOp
}
}
private void insertObjectsIntoWorkingMemory(final List<Object> objectList, final WorkingMemory workingMemory)
{
- if (objectList != null) {
- for (Object object : objectList) {
+ if (objectList != null)
+ for (Object object : objectList)
workingMemory.insert(object);
- }
- }
}
private void updateJBRulesCounter( final long startTime , final String rules, final String result )
{
- if (rulesCounter != null) {
+ if (rulesCounter != null)
+ {
long procTime = System.nanoTime() - startTime;
rulesCounter.update(procTime, rules, result );
}
}
+
+ public static boolean isDecisionTable( final String ruleSet )
+ {
+ if ( ruleSet == null )
+ throw new NullPointerException("[ruleSet] argument was null");
+
+ return ruleSet.endsWith( ".xls" ) || ruleSet.endsWith( ".csv" );
+
+ }
}
Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2008-06-15 15:33:10 UTC (rev 20504)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java 2008-06-15 17:05:18 UTC (rev 20505)
@@ -102,7 +102,7 @@
Map<String,Object> globals = new HashMap<String,Object>();
globals.put( "message", message );
- if ( _ruleSet.endsWith( ".xls" ) || _ruleSet.endsWith( ".csv" ) )
+ if ( DroolsRuleService.isDecisionTable( _ruleSet ) )
{
if ( stateful )
ruleService.executeStatefulRulesFromDecisionTable( _ruleSet, _ruleReload, dispose, message, globals, objectList );
Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelperUnitTest.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelperUnitTest.java 2008-06-15 15:33:10 UTC (rev 20504)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelperUnitTest.java 2008-06-15 17:05:18 UTC (rev 20505)
@@ -43,7 +43,7 @@
public class DroolsRuleBaseHelperUnitTest
{
// instance under test
- private DroolsRuleBaseHelper helper = new DroolsRuleBaseHelper();
+ private DroolsRuleBaseHelper helper = DroolsRuleBaseHelper.getInstance();
// rule file shared by multiple tests methods
private final static String RULE_FILE = "RuleBaseHelper.drl";
More information about the jboss-svn-commits
mailing list