[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