[jboss-svn-commits] JBL Code SVN: r20688 - in labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src: test/java/org/jboss/internal/soa/esb/services/rules and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jun 23 04:23:29 EDT 2008


Author: beve
Date: 2008-06-23 04:23:28 -0400 (Mon, 23 Jun 2008)
New Revision: 20688

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/DroolsRuleService.java
   labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java
Log:
Added a few more tests.


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-23 00:28:21 UTC (rev 20687)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java	2008-06-23 08:23:28 UTC (rev 20688)
@@ -28,6 +28,7 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
+import java.util.Properties;
 
 import org.apache.log4j.Logger;
 import org.drools.RuleBase;
@@ -38,12 +39,12 @@
 import org.drools.compiler.PackageBuilderConfiguration;
 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.
+ * <p/> 
  * 
  * @author jdelong at redhat.com
  * @author <a href="mailto:dbevenius at redhat.com">Daniel Bevenius</a>
@@ -58,7 +59,7 @@
 	/**
 	 * Factory method that returns an instance of this class.
 	 * </p>
-	 * The current implemenations returns a new instance of this
+	 * The current implementation returns a new instance of this
 	 * class for every call.
 	 * 
 	 * @return {@link DroolsRuleBaseHelper}
@@ -88,17 +89,16 @@
 	public RuleBase createRuleBaseFromRuleFiles(
 			final String ruleFile, 
 			final String dsl)
-			throws DroolsParserException, IOException, RuleServiceException 
+			throws DroolsParserException, IOException, RuleServiceException, RuleServiceBuilderException
 	{
 		assertNotNull( ruleFile, "ruleFile" );
 		
-		logger.debug("Going to create a rulebase from the ruleFile: " + ruleFile);
 		// read in the rules
-		InputStream rulesInputStream = getRulesInputStream(ruleFile);
+		InputStream rulesInputStream = getRulesInputStream( ruleFile );
 
-		Reader ruleReader = getRulesReader(rulesInputStream);
+		Reader ruleReader = getRulesReader( rulesInputStream );
 
-		PackageBuilder builder = new PackageBuilder(new PackageBuilderConfiguration());
+		PackageBuilder builder = new PackageBuilder( new PackageBuilderConfiguration() );
 		try 
 		{
 			if ( dsl == null ) 
@@ -107,12 +107,11 @@
 			} 
 			else 
 			{
-				logger.debug("Going to read the dsl: " + dsl);
 				InputStream dslInputStream = getRulesInputStream( dsl );
 				Reader dslReader = getRulesReader( dslInputStream );
 				if ( dslReader == null ) 
 				{
-					logger.error("Could not find dsl: " + ruleFile);
+					logger.error("Could not find dsl file [" + dsl + "]");
 				} 
 				else 
 				{
@@ -132,20 +131,10 @@
 			safeClose(rulesInputStream);
 		}
 
-		// get the compiled package (which is serializable)
-		Package pkg = builder.getPackage();
-		// add the package to a rulebase
-		try 
-		{
-			RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-			ruleBase.addPackage(pkg);
-			return ruleBase;
-		} 
-		catch (final Exception ex) 
-		{
-			throw new RuleServiceException(ex.getMessage(), ex);
-		}
+		return getNewRuleBaseWithPackage( builder );
 	}
+	
+	
 
 	/**
 	 * Reads the rules and dsl from files and returning as a string
@@ -174,9 +163,6 @@
 		return dsl == null ? rules : rules + getFileContents( dsl );
 	}
 	
-	
-
-	
 	/**
 	 * Reading the rules from a decision table.
 	 * <p/>
@@ -191,25 +177,14 @@
 	 */
 	public RuleBase createRuleBaseFromDecisionTable(
 			final String decisionTable)
-			throws DroolsParserException, IOException, RuleServiceException 
+			throws DroolsParserException, IOException, RuleServiceException, RuleServiceBuilderException
 	{
 		assertNotNull( decisionTable, "decisionTable" );
 		
-		logger.debug("Going to read the decisionTable: " + decisionTable);
-		String drl = getSpreadsheetRules(decisionTable);
+		final String drl = getSpreadsheetRules(decisionTable);
 		PackageBuilder builder = new PackageBuilder();
 		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) 
-		{
-			throw new RuleServiceException(ex.getMessage(), ex);
-		}
+		return getNewRuleBaseWithPackage( builder );
 	}
 
 	/**
@@ -219,21 +194,15 @@
 	 */
 	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 
 		{
-			drl = compiler.compile(inputStreamDT, InputType.XLS);
-			logger.debug("Compiled the decsionTable to a drl: " + drl);
+			return new SpreadsheetCompiler().compile(inputStreamDT, InputType.XLS);
 		} 
 		finally 
 		{
 			safeClose(inputStreamDT);
 		}
-		return drl;
 	}
 
 	/**
@@ -241,22 +210,30 @@
 	 */
 	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();
-
-		return rb;
+		return RuleAgent.newRuleAgent( "/" + ruleAgentProperties ).getRuleBase();
 	}
 	
+	public RuleBase loadRuleBaseFromRuleAgent(final Properties ruleAgentProperties) throws IOException, Exception 
+	{
+		return RuleAgent.newRuleAgent( ruleAgentProperties ).getRuleBase();
+	}
+	
+	/**
+	 * This shows how rules are loaded up from a deployed package.
+	 */
+	public RuleAgent createRuleAgent(final String ruleAgentProperties) throws IOException, Exception 
+	{
+		return RuleAgent.newRuleAgent( "/" + ruleAgentProperties );
+	}
+	
 	private String getFileContents( final String fileName ) throws RuleServiceException
 	{
 		InputStream inputStream = getRulesInputStream( fileName );
-		final String fileContents; 
 		try 
 		{
-    		fileContents = StreamUtils.readStreamString( inputStream, "UTF-8" );
+    		return StreamUtils.readStreamString( inputStream, "UTF-8" );
 		} 
-		catch (UnsupportedEncodingException e)
+		catch ( final UnsupportedEncodingException e)
 		{
 			throw new RuleServiceException("Could not read from file [" + fileName + "].", e);
 		} 
@@ -264,14 +241,13 @@
 		{
 			safeClose( inputStream );
 		}
-		return fileContents;
 	}
 	
 	//	private instance methods
 	
 	private Reader getRulesReader(final InputStream inputStream) 
 	{
-		return new InputStreamReader(inputStream);
+		return new InputStreamReader( inputStream );
 	}
 
 	private InputStream getRulesInputStream(final String rulesFile) throws RuleServiceException 
@@ -283,6 +259,27 @@
 			return resourceAsStream;
 	}
 	
+	private RuleBase getNewRuleBaseWithPackage( final PackageBuilder builder ) throws RuleServiceException, RuleServiceBuilderException
+	{
+		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+		try 
+		{
+			ruleBase.addPackage( builder.getPackage() );
+		} 
+		catch (final Exception ex) 
+		// 	need to catch Exception as RuleBase.addPackage throws it
+		{
+			throw new RuleServiceException(ex.getMessage(), ex);
+		}
+		
+		if ( builder.hasErrors() )
+		{
+			throw new RuleServiceBuilderException( "PackageBuilder generated errors: ", builder.getErrors() );
+		}
+		
+		return ruleBase;
+	}
+	
 	//	private static methods
 	
 	private static void safeClose( final InputStream is ) 
@@ -303,6 +300,4 @@
 			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-23 00:28:21 UTC (rev 20687)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleService.java	2008-06-23 08:23:28 UTC (rev 20688)
@@ -33,6 +33,7 @@
 import org.drools.StatefulSession;
 import org.drools.StatelessSession;
 import org.drools.WorkingMemory;
+import org.drools.agent.RuleAgent;
 import org.drools.compiler.DroolsParserException;
 import org.jboss.internal.soa.esb.assertion.AssertArgument;
 import org.jboss.internal.soa.esb.services.routing.cbr.JBRulesCounter;
@@ -52,18 +53,26 @@
  * @author <a href="mailto:dbevenius at redhat.com">Daniel Bevenius</a>
  * 
  */
-public class DroolsRuleService implements RuleService {
+public class DroolsRuleService implements RuleService 
+{
 	
 	/**
 	 * The lifecycle resource factory for RuleBases.
 	 */
 	private static final LifecycleResourceFactory<Map<String, RuleBase>> lifecycleRuleBaseFactory = new LifecycleRuleBaseFactory();
+	
+	private static final LifecycleResourceFactory<Map<String, RuleAgent>> lifecycleRuleAgentFactory = new LifecycleRuleAgentFactory();
 	/**
-	 * The lifecycle resource bule bases.
+	 * The lifecycle resource rule bases.
 	 */
 	private static final LifecycleResource<Map<String, RuleBase>> lifecycleRuleBases = new LifecycleResource<Map<String, RuleBase>>(
 			lifecycleRuleBaseFactory, LifecyclePriorities.RULE_BASE_PRIORITY);
 	/**
+	 * RuleAgents cache
+	 */
+	private static final LifecycleResource<Map<String, RuleAgent>> lifecycleRuleAgents = new LifecycleResource<Map<String, RuleAgent>>(
+			lifecycleRuleAgentFactory, LifecyclePriorities.RULE_BASE_PRIORITY);
+	/**
 	 * The lifecycle resource rule sets.
 	 */
 	private static final LifecycleResourceFactory<Map<String, String>> lifecycleRuleSetFactory = new LifecycleRuleSetFactory();
@@ -119,10 +128,10 @@
 
 			updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_SUCCEED );
 		} 
-		catch (RuleServiceException ree) 
+		catch (RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + ree.getMessage(), ree);
+			throw e;
 		}
 		return message;
 	}
@@ -155,18 +164,19 @@
 		
 		final long startTime = System.nanoTime();
 
-		try {
-			RuleBase ruleBase = getRuleBaseForDecisionTable(decisionTable, ruleReload);
-			message = executeStatelessRules(ruleBase, message, globals, objectList);
+		try 
+		{
+			RuleBase ruleBase = getRuleBaseForDecisionTable( decisionTable, ruleReload );
+			message = executeStatelessRules( ruleBase, message, globals, objectList );
 
 			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_SUCCEED );
-
-			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 e;
 		}
+		return message;
 	}
 
 	/**
@@ -195,36 +205,26 @@
 		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) 
-			{
-				ruleBases.put(ruleAgentProperties, ruleBase);
-
-				message = executeStatelessRules(ruleBase, message, globals, objectList);
-
-    			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_SUCCEED );
-			}
-
-			return message;
-
+    		final RuleBase ruleBase = getRuleBaseForRuleAgent( ruleAgentProperties ) ;
+			message = executeStatelessRules(ruleBase, message, globals, objectList);
+			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_SUCCEED );
 		} 
-		catch (IOException e) 
+		catch ( final IOException e) 
 		{
 			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException( "Could not read the ruleAgentProperties. " + e.getMessage(), e);
+			throw new RuleServiceException( "Could not read the ruleAgentProperties file [" + ruleAgentProperties + "]", e);
 		} 
-		catch (RuleServiceException e) 
+		catch ( final RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
 		} 
-		catch (Exception e) 
+		catch ( final Exception e) 
 		{
 			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
 			throw new RuleServiceException( "RuleAgent could not get the RuleBase. " + e.getMessage(), e);
 		}
+		return message;
 	}
 
 	/**
@@ -261,15 +261,15 @@
 
 		try 
 		{
-			RuleBase ruleBase = getRuleBaseForFileBasedRules(ruleSet, dsl, ruleReload);
-			message = executeStatefulRules(ruleBase, false, message, globals, objectList);
+			RuleBase ruleBase = getRuleBaseForFileBasedRules( ruleSet, dsl, ruleReload );
+			message = executeStatefulRules( ruleBase, false, message, globals, objectList );
 
 			updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_SUCCEED);
 		} 
-		catch (RuleServiceException e) 
+		catch (final RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
 		}
 		return message;
 	}
@@ -312,7 +312,7 @@
 		catch (RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
 		}
 		return message;
 	}
@@ -343,18 +343,11 @@
 		final long startTime = System.nanoTime();
 		try 
 		{
-			DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
-			RuleBase ruleBase = rbHelper.loadRuleBaseFromRuleAgent(ruleAgentProperties);
+    		final RuleBase ruleBase = getRuleBaseForRuleAgent( ruleAgentProperties ) ;
+			
+			message = executeStatefulRules(ruleBase, false, message, globals, objectList);
 
-			final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
-			if (ruleBase != null) 
-			{
-				ruleBases.put(ruleAgentProperties, ruleBase);
-
-				message = executeStatefulRules(ruleBase, false, message, globals, objectList);
-
-    			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_SUCCEED );
-			}
+			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_SUCCEED );
 		} 
 		catch (IOException e) 
 		{
@@ -364,7 +357,7 @@
 		catch (RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, ruleAgentProperties, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
 		} 
 		catch (Exception e) 
 		{
@@ -373,6 +366,8 @@
 		}
 		return message;
 	}
+	
+	
 
 	/**
 	 * Continue executing rules where the working memory already exists.
@@ -405,20 +400,18 @@
 		try 
 		{
 			final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
-			final RuleBase ruleBase = ruleBases.get(rules);
+			final RuleBase ruleBase = ruleBases.get( rules );
 			
-			message = executeStatefulRules(ruleBase, dispose, message, globals, objectList);
+			message = executeStatefulRules( ruleBase, dispose, message, globals, objectList );
 
 			updateJBRulesCounter( startTime, rules, JBRulesCounter.RULES_SUCCEED );
-
-			return message;
-
 		} 
 		catch (Exception e) 
 		{
 			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 ) 
@@ -427,6 +420,8 @@
 		rulesCounter.registerMBean();
 	}
 	
+	//	private methods 
+	
 	private void updateJBRulesCounter( final long startTime , final String rules, final String result  )
 	{
 		if (rulesCounter != null) 
@@ -436,6 +431,8 @@
 		}
 	}
 	
+	//	package protected methods
+	
 	/**
 	 * Determine if file based rules need reloading and return the rulebase
 	 * 
@@ -455,7 +452,6 @@
 			final String dsl,
 			final boolean ruleReload) throws RuleServiceException 
 	{
-		
 		final long startTime = System.nanoTime();
 		
 		try 
@@ -476,7 +472,7 @@
 				}
 			}
 			final Map<String, RuleBase> ruleBases = lifecycleRuleBases.getLifecycleResource();
-			RuleBase ruleBase = ruleBases.get(ruleSet);
+			RuleBase ruleBase = ruleBases.get( ruleSet );
 			if ( ruleBase == null || isRulesChanged ) 
 			{
 				ruleBase = rbHelper.createRuleBaseFromRuleFiles(ruleSet, dsl);
@@ -509,18 +505,15 @@
 		catch (final RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, ruleSet, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
 		}
 	}
 	
 	/**
 	 * Determine if decision table need reloading and return the rulebase
 	 * 
-	 * @param ruleSet -
-	 *            String reference to a file which contains a ruleSet.
-	 * @param dsl -
-	 *            String reference to a file which contains a custom rule language
-	 *            definition
+	 * @param decisionTable -
+	 *            String reference to a file which contains a decision table.
 	 * @param ruleReload -
 	 *            if set to true, a ruleSet update should result in reloading the
 	 *            ruleSet.
@@ -535,32 +528,36 @@
 		try 
 		{
 			DroolsRuleBaseHelper rbHelper = DroolsRuleBaseHelper.getInstance();
-			RuleBase ruleBase;
-			if ( ruleReload ) 
+			RuleBase ruleBase = getCachedRuleBases().get( decisionTable );
+			if ( ruleReload || ruleBase == null ) 
 			{
-				String drl = rbHelper.getSpreadsheetRules(decisionTable);
-				ruleBase = getRuleBaseForFileBasedRules(drl, null, ruleReload);
+				ruleBase = rbHelper.createRuleBaseFromDecisionTable(decisionTable);
+				getCachedRuleBases().put( decisionTable, ruleBase );
 			} 
 			else 
 			{
-				ruleBase = rbHelper.createRuleBaseFromDecisionTable(decisionTable);
+				ruleBase = getRuleBaseForFileBasedRules( decisionTable, null, ruleReload );
 			}
 			return ruleBase;
 		} 
 		catch (IOException e) 
 		{
 			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not read the rules. " + e.getMessage(), e);
+			throw new RuleServiceException("Could not read the rules from [" + decisionTable + "]", e);
 		} 
 		catch (DroolsParserException e) 
 		{
 			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw new RuleServiceException("Could not parse the rules in [" + decisionTable + "]", e);
 		} 
 		catch (RuleServiceException e) 
 		{
 			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
-			throw new RuleServiceException("Could not parse the rules. " + e.getMessage(), e);
+			throw e;
+		} catch (LifecycleResourceException e)
+		{
+			updateJBRulesCounter( startTime, decisionTable, JBRulesCounter.RULES_FAILED );
+			throw new RuleServiceException("Caught a LifecycleResourceException :", e);
 		}
 	}
 	
@@ -702,6 +699,32 @@
 		}
 	}
 	
+	RuleBase getRuleBaseForRuleAgent( final String ruleAgentProperties ) throws IOException, Exception
+	{
+		Map<String, RuleAgent> ruleAgents = getCachedRuleAgents();
+		RuleAgent ruleAgent = ruleAgents.get( ruleAgentProperties );
+		if ( ruleAgent == null )
+		{
+			ruleAgent = DroolsRuleBaseHelper.getInstance().createRuleAgent( ruleAgentProperties );
+			ruleAgents.put( ruleAgentProperties, ruleAgent );
+		}
+		
+		RuleBase currentRuleBase = ruleAgent.getRuleBase();
+		//	always update the cache as the rulebase might have been updated.
+		getCachedRuleBases().put( ruleAgentProperties, currentRuleBase );
+		return currentRuleBase;
+	}
+	
+	Map<String, RuleAgent> getCachedRuleAgents() throws LifecycleResourceException
+	{
+		return lifecycleRuleAgents.getLifecycleResource();
+	}
+	
+	Map<String, RuleBase> getCachedRuleBases() throws LifecycleResourceException
+	{
+		return lifecycleRuleBases.getLifecycleResource();
+	}
+	
 	/**
 	 * The lifecycle resource factory for rule sets.
 	 * 
@@ -746,6 +769,40 @@
 			//	NoOp
 		}
 	}
+	
+	public static class LifecycleRuleAgentFactory implements LifecycleResourceFactory<Map<String, RuleAgent>> {
+        /**
+         * Create a resource object which will be associated with the
+         * specified lifecycle identity.
+         * 
+         * @param lifecycleIdentity
+         *            The associated lifecycle identity.
+         * @return The lifecycle resource
+         * @throws LifecycleResourceException
+         *             for errors during construction.
+         */
+        public Map<String, RuleAgent> createLifecycleResource( final String lifecycleIdentity) throws LifecycleResourceException 
+        {
+        	return new ConcurrentHashMap<String, RuleAgent>();
+        }
+    
+        /**
+         * Destroy a resource object which is associated with the specified
+         * lifecycle identity.
+         * 
+         * @param resource
+         *            The lifecycle resource.
+         * @param lifecycleIdentity
+         *            The associated lifecycle identity.
+         * @return The lifecycle resource.
+         * @throws LifecycleResourceException
+         *             for errors during destroy.
+         */
+        public void destroyLifecycleResource( final Map<String, RuleAgent> resource, final String lifecycleIdentity) throws LifecycleResourceException 
+        {
+        	//	NoOp
+        }
+    }
 
 	/**
 	 * The lifecycle resource factory for rule sets.
@@ -793,6 +850,4 @@
 		}
 	}
 	
-	
-	
 }

Modified: labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java	2008-06-23 00:28:21 UTC (rev 20687)
+++ labs/jbossesb/workspace/dbevenius/ruleservice/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleServiceUnitTest.java	2008-06-23 08:23:28 UTC (rev 20688)
@@ -22,8 +22,7 @@
 
 package org.jboss.internal.soa.esb.services.rules;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -34,8 +33,10 @@
 import junit.framework.JUnit4TestAdapter;
 
 import org.drools.RuleBase;
+import org.drools.agent.RuleAgent;
 import org.jboss.internal.soa.esb.services.routing.cbr.Order;
 import org.jboss.soa.esb.actions.Counter;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.message.format.MessageFactory;
 import org.jboss.soa.esb.message.format.MessageType;
@@ -63,28 +64,68 @@
 	private ArrayList<String> messagePathList;
 	
 	@Test
-	public void executeStatefulRules() throws RuleServiceException
+	public void executeStatelessRules()
 	{
 		Map<String,Object> globals = getGlobalsWithDestAndMessage();
-		message = ruleService.executeStatefulRules( ruleBase, true, message , globals, null );
+		message = ruleService.executeStatelessRules( ruleBase, message , globals, null );
 		ArrayList<String> destinations = getDistinations( globals );
 		assertTrue( destinations.size() == 1 );
 	}
 	
 	@Test
-	public void executeStatefulRulesDrl() throws RuleServiceException
+	public void executeStatelessRulesFromDecisionTableReload() throws RuleServiceException
 	{
+		Map<String,Object> globals = getGlobalsWithDest();
+		final String decisionTable = "RuleBaseHelper.xls";
+		message = ruleService.executeStatelessRulesFromDecisionTable( decisionTable, true, message, globals, null );
+		ArrayList<String> destinations = getDistinations( globals );
+		assertTrue( destinations.size() == 1 );
+	}
+	
+	@Test
+	public void executeStatelessRulesFromDecisionTable() throws RuleServiceException
+	{
+		Map<String,Object> globals = getGlobalsWithDest();
+		final String decisionTable = "RuleBaseHelper.xls";
+		message = ruleService.executeStatelessRulesFromDecisionTable( decisionTable, false, message, globals, null );
+		ArrayList<String> destinations = getDistinations( globals );
+		assertTrue( destinations.size() == 1 );
+	}
+	
+	@Test
+	public void executeStatfulRulesFromDecisionTableReload() throws RuleServiceException
+	{
+		Map<String,Object> globals = getGlobalsWithDest();
+		final String decisionTable = "RuleBaseHelper.xls";
+		message = ruleService.executeStatefulRulesFromDecisionTable( decisionTable, true, message, globals, null );
+		ArrayList<String> destinations = getDistinations( globals );
+		assertTrue( destinations.size() == 1 );
+	}
+	
+	@Test
+	public void executeStatfulRulesFromDecisionTable() throws RuleServiceException
+	{
+		Map<String,Object> globals = getGlobalsWithDest();
+		final String decisionTable = "RuleBaseHelper.xls";
+		message = ruleService.executeStatefulRulesFromDecisionTable( decisionTable, false, message, globals, null );
+		ArrayList<String> destinations = getDistinations( globals );
+		assertTrue( destinations.size() == 1 );
+	}
+	
+	@Test
+	public void executeStatefulRules() throws RuleServiceException
+	{
 		Map<String,Object> globals = getGlobalsWithDestAndMessage();
-		message = ruleService.executeStatefulRules( "JBossESBRules.drl", null, true, message, globals, null );
+		message = ruleService.executeStatefulRules( ruleBase, true, message , globals, null );
 		ArrayList<String> destinations = getDistinations( globals );
 		assertTrue( destinations.size() == 1 );
 	}
 	
 	@Test
-	public void executeStatelessRules()
+	public void executeStatefulRulesDrl() throws RuleServiceException
 	{
 		Map<String,Object> globals = getGlobalsWithDestAndMessage();
-		message = ruleService.executeStatelessRules( ruleBase, message , globals, null );
+		message = ruleService.executeStatefulRules( "JBossESBRules.drl", null, true, message, globals, null );
 		ArrayList<String> destinations = getDistinations( globals );
 		assertTrue( destinations.size() == 1 );
 	}
@@ -107,14 +148,11 @@
         
         //	process message again with a counter instance 
         objectList = new ObjectMapper().createObjectList(message, messagePathList);
-		//message = ruleService.executeStatefulRules( "JBossESBPricingRulesStateful.drl", null, false, false, message, globals, objectList );
 		message = ruleService.continueStatefulRulesExecution( "JBossESBPricingRulesStateful.drl", true, message, globals, objectList );
 		
         Counter counter = (Counter) message.getBody().get("Counter");
-        System.out.println(counter.getCounter());
         
         assertEquals( 2 , counter.getCounter() );
-        
 	}
 	
 	/* 
@@ -134,11 +172,38 @@
 		ArrayList<String> destinations = getDistinations( globals );
 		assertTrue( destinations.size() == 1 );
 		
-		//	execute a second time. This should reuse the same session
 		message = ruleService.executeStatefulRules( ruleBase, true, message , globals, null );
-		assertTrue( "Should have added a second destination to the existing global", destinations.size() == 2 );
+		assertTrue( destinations.size() == 2 );
 	}
 	
+	/*
+	 	Commented out for the same reason as the previous test.
+	@Test
+	*/
+	public void executeStatefulRulesCheckCached() throws RuleServiceException, LifecycleResourceException
+	{
+		ruleService.getCachedRuleBases().clear();
+		final String ruleAgentProperites = "RuleBaseHelper.properties";
+		Map<String,Object> globals = getGlobalsWithDest();
+		ruleService.executeStatefulRulesFromRuleAgent( ruleAgentProperites, message , globals, null );
+		
+		Map<String, RuleAgent> ruleAgents = ruleService.getCachedRuleAgents();
+		assertEquals( 1,  ruleAgents.size() );
+		RuleAgent ruleAgent = ruleAgents.get( ruleAgentProperites );
+		assertNotNull( ruleAgent );
+		
+		RuleBase rBase = ruleAgent.getRuleBase();
+		assertEquals ( rBase, ruleService.getCachedRuleBases().get( ruleAgentProperites ) );
+		
+		for ( int i = 0 ; i < 10 ; i++ )
+    		ruleService.executeStatefulRulesFromRuleAgent( ruleAgentProperites, message , globals, null );
+		
+		assertEquals( 1,  ruleAgents.size() );
+		assertEquals( 1,  ruleService.getCachedRuleBases().size() );
+		assertEquals ( rBase, ruleService.getCachedRuleBases().get( ruleAgentProperites ) );
+	}
+		
+	
 	//	Test setup methods
 	
 	@Before
@@ -171,10 +236,8 @@
 	
 	private Map<String,Object> getGlobalsWithDestAndMessage()
 	{
-		Map<String,Object> globals = new HashMap<String,Object>();
-		ArrayList<String> destinations =  new ArrayList<String>();
-		globals.put("destinations", destinations );
-		globals.put("message", message );
+		Map<String,Object> globals = getGlobalsWithDest();
+		globals.putAll( getGlobalsWithMessage( message ));
 		return globals;
 	}
 	




More information about the jboss-svn-commits mailing list