[jboss-svn-commits] JBL Code SVN: r29653 - in labs/jbossesb/trunk/product: services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 19 06:47:14 EDT 2009


Author: beve
Date: 2009-10-19 06:47:13 -0400 (Mon, 19 Oct 2009)
New Revision: 29653

Modified:
   labs/jbossesb/trunk/product/.classpath
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
   labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java
   labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
   labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java
Log:
Work for https://jira.jboss.org/jira/browse/JBESB-2889 "RuleServiceCallHelper performance"


Modified: labs/jbossesb/trunk/product/.classpath
===================================================================
--- labs/jbossesb/trunk/product/.classpath	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/.classpath	2009-10-19 10:47:13 UTC (rev 29653)
@@ -1,9 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/antlr-runtime-3.1.1.jar"/>
 	<classpathentry kind="lib" path="lib/ext/jbossws-core.jar"/>
 	<classpathentry kind="lib" path="lib/ext/jboss-jaxws.jar"/>
 	<classpathentry kind="lib" path="lib/ext/jboss-saaj.jar"/>
 	<classpathentry excluding="**/.svn/" kind="src" path="rosetta/src"/>
+	<classpathentry kind="src" path="services/jbrules/src/main/resources"/>
+	<classpathentry kind="src" path="services/jbrules/src/test/resources"/>
 	<classpathentry excluding="**/.svn/" kind="src" path="rosetta/tests/src"/>
 	<classpathentry excluding="**/.svn/" kind="src" path="rosetta/tests/resources"/>
 	<classpathentry excluding="**/.svn/" kind="src" path="services/slsb/src/main/java"/>
@@ -159,5 +162,14 @@
 	<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.0.1.jar"/>
 	<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.1.0.jar"/>
 	<classpathentry kind="lib" path="build/jbossesb/lib/jbossesb-config-model-1.2.0.jar"/>
+	<classpathentry kind="lib" path="build/jbossesb-server-4.6/server/default/lib/hsqldb.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/core-3.4.2.v_883_R34x.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/drools-jsr94-5.0.1.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/drools-mc-5.0.1.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/drools-templates-5.0.1.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/janino-2.5.15.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/jsr94-1.1.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/jxl-2.4.2.jar"/>
+	<classpathentry kind="lib" path="services/jbrules/lib/ext/xpp3_min-1.1.3.4.O.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouter.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -27,13 +27,15 @@
 import java.util.Map;
 
 import org.apache.log4j.Logger;
-import org.drools.lang.DRLParser.entry_point_key_return;
+import org.jboss.internal.soa.esb.services.rules.RuleInfoBuilder;
 import org.jboss.internal.soa.esb.services.rules.RuleServiceCallHelper;
 import org.jboss.internal.soa.esb.services.rules.RuleServiceException;
+import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.services.routing.MessageRouterException;
 import org.jboss.soa.esb.services.routing.cbr.ContentBasedRouter;
+import org.jboss.soa.esb.services.rules.RuleInfo;
 
 /**
  * The Implementation of a rule based Content Router. Here we use JBossRules.
@@ -47,8 +49,8 @@
 {
 	private static Logger logger = Logger.getLogger(JBossRulesRouter.class);
 	
-	private ConfigTree configTree;
-	
+    private RuleServiceCallHelper ruleServiceCallHelper;
+
 	/**
      * Route the message with a reference to the ruleSets supplied in the message.
      * Not implemented.
@@ -85,7 +87,7 @@
 			final Message message, 
 			final List<Object> objectList) throws MessageRouterException
 	{
-		return route(ruleSet, null, ruleReload, message, objectList);
+	    return route(message, objectList);
 	}
 
 	/**
@@ -115,23 +117,41 @@
 			Message message, 
 			final List<Object> objectList ) throws MessageRouterException
 	{
-		try
-		{
-    		Map<String,Object> globals = new HashMap<String,Object>();
-    		List<String> destinations = new ArrayList<String>();
-    		globals.put( "destinations", destinations );
-    		message = RuleServiceCallHelper.executeRulesService( ruleSet, ruleLanguage, ruleReload, message, objectList, globals, configTree );
-    		return destinations;
-		} 
-		catch (final RuleServiceException e)
-		{
-			throw new MessageRouterException(e.getMessage(), e);
-		}
+	    return route(message, objectList);
 	}
-
+	
+	private List<String> route(Message message, final List<Object> objectList) throws MessageRouterException
+    {
+        try
+        {
+            final Map<String,Object> globals = new HashMap<String,Object>();
+            List<String> destinations = new ArrayList<String>();
+            globals.put("destinations", destinations);
+            
+            RuleInfoBuilder builder =  ruleServiceCallHelper.getRuleInfoBuilder();
+            builder.globals(globals);
+            builder.defaultFacts(objectList);
+            final RuleInfo ruleInfo = builder.build();
+            ruleServiceCallHelper.executeRulesService(message, ruleInfo);
+        
+            return destinations;
+        } 
+        catch (final RuleServiceException e)
+        {
+            throw new MessageRouterException(e.getMessage(), e);
+        }
+    }
+	
 	public void setConfigTree(final ConfigTree configTree) 
 	{
-		this.configTree = configTree;
+	    try
+        {
+            this.ruleServiceCallHelper = new RuleServiceCallHelper(configTree);
+        }
+        catch (ConfigurationException e)
+        {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
 	}
         
 }

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleInfoBuilder.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -52,6 +52,12 @@
         AssertArgument.isNotNullAndNotEmpty(ruleSource, "ruleSource");
         this.ruleSource = ruleSource;
     }
+    
+    public RuleInfoBuilder ruleSource(final String ruleSource)
+    {
+        this.ruleSource = ruleSource;
+        return this;
+    }
 
     public RuleInfoBuilder ruleType(final String type)
     {

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/RuleServiceCallHelper.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -21,22 +21,25 @@
  */
 package org.jboss.internal.soa.esb.services.rules;
 
+import static org.jboss.soa.esb.listeners.ListenerTagNames.RULE_RELOAD_TAG;
 import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.CONTINUE;
 import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DECISION_TABLE;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.RULE_AGENT_PROPERTIES;
 import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DISPOSE;
 import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.IMPL_CLASS;
+import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.RULE_AGENT_PROPERTIES;
 import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.STATEFUL;
-import java.util.List;
-import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.listeners.ListenerTagNames;
 import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.services.rules.RuleInfo;
 import org.jboss.soa.esb.services.rules.RuleService;
-import org.apache.log4j.Logger;
+import org.jboss.soa.esb.services.rules.StatefulRuleInfo;
 
 /**
- * RuleServiceCallHelper is a util class for calling
+ * RuleServiceCallHelper is a class for calling
  * methods on a {@link RuleService} implementation.
  * </p>
  * 
@@ -45,137 +48,247 @@
  */
 public class RuleServiceCallHelper
 {
-
     private static Logger logger = Logger.getLogger(RuleServiceCallHelper.class);
+    
+    /**
+     * The {@link RuleService} implementation to use.
+     */
+    private RuleService ruleService;
+    
+    /**
+     * The rule set.
+     */
+    private String ruleSet;
+    
+    /**
+     * The optional rule language. (DSL)
+     */
+    private String ruleLanguage;
+    
+    /**
+     * True if a ruleSet is being used. 
+     */
+    private boolean useRuleSet;
 
-    private RuleServiceCallHelper()
+    /** 
+     * The decision table to be use, if configured.
+     */
+    private String decisionTable;
+    private boolean useDecisionTable;
+
+    /** 
+     * The rule agent to be use, if configured.
+     */
+    private String ruleAgent;
+    private boolean useRuleAgent;
+    
+    /**
+     * Should this be a stateful rules execution.
+     */
+    private boolean stateful;
+    
+    /**
+     * Controll the reloading of rules.
+     */
+    private boolean ruleReload;
+
+    public RuleServiceCallHelper(final ConfigTree config) throws ConfigurationException
 	{
-		throw new AssertionError();
+        final String ruleServiceImpl = config.getAttribute(IMPL_CLASS.getTagName(), DroolsRuleService.class.getName());
+        try
+        {
+            ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
+            ruleService.setConfigTree( config );
+        } 
+        catch (RuleServiceException e)
+        {
+            throw new ConfigurationException("Could not create RuleService", e);
+        }
+        
+        ruleSet = config.getAttribute(ListenerTagNames.RULE_SET_TAG);
+        ruleLanguage = config.getAttribute(ListenerTagNames.RULE_LANGUAGE_TAG);
+        
+        String ruleReloadStr = config.getAttribute(ListenerTagNames.RULE_RELOAD_TAG);
+        if (ruleReloadStr != null && "true".equals(ruleReloadStr)) 
+        {
+            ruleReload = true;
+        }
+        
+        useRuleSet = ruleSet != null;
+        if (ruleSet == null)
+        {
+            // Extract the decicion table from the configuration(if configured).
+            decisionTable = config.getAttribute( DECISION_TABLE.getTagName() );
+            useDecisionTable = decisionTable != null;
+            
+            if (useDecisionTable == false)
+            {
+                // Extract the ruleAgent from the configuration(if configured).
+                ruleAgent = config.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
+                useRuleAgent = true;
+        
+                if(logger.isDebugEnabled()) 
+                {
+                    if (ruleAgent != null && ruleReload) 
+                    {
+                        logger.debug("'" + RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified.  Ignoring the '" + RULE_RELOAD_TAG + "' configuration.");
+                    }
+                }
+            }
+        }
+        
+        stateful = Boolean.valueOf(config.getAttribute(STATEFUL.getTagName()));
 	}
     
-	public static Message executeRulesService( 
-			String ruleSet,
-			final String ruleLanguage,
-			final boolean ruleReload,
-			Message message, 
-			final List<Object> objectList,
-			final Map<String, Object> globals,
-			final ConfigTree configTree ) throws RuleServiceException 
-	{
-	   return executeRulesService(ruleSet, ruleLanguage, ruleReload, message, objectList, globals, null, configTree);
-	}
-	
-	/**
-	 * This helper method delegates to the configured RuleService implementation.
-	 * <p/>
-	 * If the message object instance has a property 'continue' set to true, this method
-	 * will invoke {@link RuleService#continueStatefulRulesExecution(String, boolean, Message, Map, List)}.
-	 * This will continue an existing stateful session.
-	 * <br>
-	 * <br>
-	 * Otherwise this method will delete one of the stateless or stateful methods in RuleService 
-	 * depending on the configuration property 'stateful' is true or false. Default is stateless.
-	 * 
-	 * @param ruleSet -
-	 *            String reference to a file which contains a ruleSet.
-	 * @param ruleLanguage -
-	 *            String reference to a file which contains a custom rule
-	 *            language definition
-	 * @param ruleReload -
-	 *            if set to true, a ruleSet update should result in reloading the ruleSet.
-	 * @param message -
-	 *            Message that is updated with the results.
-	 * @param objectList - 
-	 * 			  a list with additional objects (typically pulled from the message) to be inserted into 
-	 *            working memory 
-	 * @param globals -
-	 *            Map of globals variables that should be set in the working memory
-	 * @param configTree -
-	 * 			  configuration instance to access properties from jboss-esb.xml
-	 * @return Message	-
-	 * 			  the ESB Message object which might have been updated.
-	 * @throws RuleServiceException
-	 */
-	public static Message executeRulesService( 
-			String ruleSet,
-			final String ruleLanguage,
-			final boolean ruleReload,
-			Message message, 
-			final List<Object> objectList,
-			final Map<String, Object> globals,
-			final Map<String, List<Object>> entryPointMap,
-			final ConfigTree configTree ) throws RuleServiceException 
-	{
-		final String ruleServiceImpl = configTree.getAttribute( IMPL_CLASS.getTagName(), "org.jboss.internal.soa.esb.services.rules.DroolsRuleService" );
-		final RuleService ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
-		ruleService.setConfigTree( configTree );
-		
-		final String decisionTable = configTree.getAttribute( DECISION_TABLE.getTagName() );
-		final String ruleAgent = configTree.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
-
-        if(logger.isDebugEnabled()) {
-            final boolean isRuleReloadSpecified = (configTree.getAttribute(ListenerTagNames.RULE_RELOAD_TAG) != null);
-            if (ruleAgent != null && isRuleReloadSpecified) {
-                logger.debug("'" + ListenerTagNames.RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified.  Ignoring the '" + ListenerTagNames.RULE_RELOAD_TAG + "' configuration.");
+    public Message executeRulesService(Message message, final RuleInfo ruleInfo) throws RuleServiceException 
+    {
+        if (isStateful())
+        {
+            return executeStateful(ruleInfo, message);
+        }
+        else
+        {
+            return executeStateless(ruleInfo, message);
+        }
+    }
+    
+    public Message executeStateless(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
+    {
+        if (useRuleSet)
+        {
+            return ruleService.executeStatelessRules(ruleInfo, message);
+        }
+        else if (useDecisionTable)
+        {
+            return ruleService.executeStatelessRulesFromDecisionTable(ruleInfo, message);
+        }
+        else if (useRuleAgent)
+        {
+            return ruleService.executeStatelessRulesFromRuleAgent(ruleInfo, message);
+        }
+        else
+        {
+            throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
+        }
+        
+    }
+    
+    public Message executeStateful(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
+    {
+        final boolean dispose = getDisposeProperty(message);
+        StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose);
+            
+        final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
+        if (continueStateful)
+        {
+            checkDisposePropertyIsSpecified(message);
+            return ruleService.continueStatefulRulesExecution(statefulRuleInfo, message);
+        }
+        else
+        {
+            if (useRuleSet)
+            {
+                return ruleService.executeStatefulRules(statefulRuleInfo, message);
             }
+            else if (useDecisionTable)
+            {
+                return ruleService.executeStatefulRulesFromDecisionTable(statefulRuleInfo, message);
+            }
+            else if (useRuleAgent)
+            {
+                return ruleService.executeStatefulRulesFromRuleAgent(statefulRuleInfo, message);
+            }
+            else
+            {
+                throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
+            }
         }
+    }
+    
+    public String determineRuleSource()
+    {
+        if (useRuleSet)
+        {
+            return ruleSet;
+        }
+        else if (useDecisionTable)
+        {
+            return decisionTable;
+        }
+        else 
+        {
+            return ruleAgent;
+        }
+    }
+    
+    public boolean isUseRuleSet()
+    {
+        return useRuleSet;
+    }
+    
+    public boolean isUseDecisionTable()
+    {
+        return useDecisionTable;
+    }
+    
+    public boolean isUseRuleAgent()
+    {
+        return useRuleAgent;
+    }
+    
+    public boolean isStateful()
+    {
+        return stateful;
+    }
+    
+    public String getRuleSet()
+    {
+        return ruleSet;
+    }
 
-        final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
-		if ( continueStateful )
-		{
-			//	ruleSet can be a rule file, decisiontable or a ruleAgent properties file for continueStatefulRules
-			if ( ruleSet == null )
-				ruleSet = decisionTable != null ? decisionTable : ruleAgent;  
-			
-			message = ruleService.continueStatefulRulesExecution( ruleSet, getDisposeProperty( message ), message, globals, objectList );
-		}
-		else
-		{
-    		final boolean stateful = Boolean.valueOf( configTree.getAttribute( STATEFUL.getTagName()) );
-		
-    		if ( stateful )
-    		{
-    			if ( ruleSet != null )
-        			message = ruleService.executeStatefulRules( ruleSet, ruleLanguage, ruleReload, message, globals, objectList );
-    			else if ( decisionTable != null )
-        			message =  ruleService.executeStatefulRulesFromDecisionTable( decisionTable, ruleReload, message, globals, objectList );
-    			else if ( ruleAgent != null )
-        			message = ruleService.executeStatefulRulesFromRuleAgent( ruleAgent, message, globals, objectList );
-    			else
-    				throwRuleServiceException();
-    		}
-    		else
-    		{
-    			if ( ruleSet != null )
-        			message = ruleService.executeStatelessRules( ruleSet, ruleLanguage, ruleReload, message, globals, objectList );
-    			else if ( decisionTable != null )
-        			message = ruleService.executeStatelessRulesFromDecisionTable( decisionTable, ruleReload, message, globals, objectList );
-    			else if ( ruleAgent != null )
-        			message = ruleService.executeStatelessRulesFromRuleAgent( ruleAgent, message, globals, objectList );
-    			else
-    				throwRuleServiceException();
-    		}
-		}
-		return message;
-	}
-	
-	//	private static methods
-	
-	private static void throwRuleServiceException() throws RuleServiceException
-	{
-		throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
-	}
-	
-	private static boolean getDisposeProperty( final Message message ) throws RuleServiceException
-	{
-		Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
-		if ( dispose == null )
-		{
-			throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
-					CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
-					" be disposed or memory leaks can occur.");
-		}
-		return (Boolean)dispose;
-	}
+    public String getRuleLanguage()
+    {
+        return ruleLanguage;
+    }
 
+    public String getDecisionTable()
+    {
+        return decisionTable;
+    }
+
+    public String getRuleAgent()
+    {
+        return ruleAgent;
+    }
+
+    public boolean isRuleReload()
+    {
+        return ruleReload;
+    }
+
+    public RuleInfoBuilder getRuleInfoBuilder()
+    {
+        final RuleInfoBuilder builder = new RuleInfoBuilder(determineRuleSource());
+        builder.dslSource(ruleLanguage);
+        builder.reload(ruleReload);
+        return builder;
+    }
+
+    private static boolean getDisposeProperty(final Message message) throws RuleServiceException
+    {
+        Object dispose = message.getProperties().getProperty(DISPOSE.getTagName());
+        return (dispose != null);
+    }
+
+    private static void checkDisposePropertyIsSpecified( final Message message ) throws RuleServiceException
+    {
+        Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
+        if ( dispose == null )
+        {
+            throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
+                    CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
+                    " be disposed or memory leaks can occur.");
+        }
+    }
 }
+    
\ No newline at end of file

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/soa/esb/actions/BusinessRulesProcessor.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -21,33 +21,19 @@
  */
 package org.jboss.soa.esb.actions;
 
-import static org.jboss.soa.esb.listeners.ListenerTagNames.RULE_RELOAD_TAG;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.CONTINUE;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DECISION_TABLE;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.DISPOSE;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.IMPL_CLASS;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.RULE_AGENT_PROPERTIES;
-import static org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.STATEFUL;
-
 import java.util.List;
 
-import org.apache.log4j.Logger;
-import org.jboss.internal.soa.esb.services.rules.DroolsRuleService;
 import org.jboss.internal.soa.esb.services.rules.RuleInfoBuilder;
+import org.jboss.internal.soa.esb.services.rules.RuleServiceCallHelper;
 import org.jboss.internal.soa.esb.services.rules.RuleServiceException;
-import org.jboss.internal.soa.esb.services.rules.RuleServiceFactory;
-import org.jboss.internal.soa.esb.services.rules.StatefulRuleInfoImpl;
 import org.jboss.internal.soa.esb.services.rules.util.RuleConfigUtil;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.helpers.ConfigTree;
-import org.jboss.soa.esb.listeners.ListenerTagNames;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.message.mapping.ObjectMappingException;
 import org.jboss.soa.esb.services.registry.RegistryException;
 import org.jboss.soa.esb.services.routing.MessageRouterException;
 import org.jboss.soa.esb.services.rules.RuleInfo;
-import org.jboss.soa.esb.services.rules.RuleService;
-import org.jboss.soa.esb.services.rules.StatefulRuleInfo;
 
 /**
  * BusinessRulesProcessor extends {@link ContentBasedRouter} but does not perform any routing, it only 
@@ -83,85 +69,14 @@
  */
 public class BusinessRulesProcessor extends ContentBasedRouter
 {
-    /**
-     * Logger.
-     */
-    private Logger log = Logger.getLogger(BusinessRulesProcessor.class);
-    
-    /**
-     * The {@link RuleService} implementation to use.
-     */
-    private RuleService ruleService;
-    
-    /**
-     * True if a ruleSet is being used. 
-     */
-    private boolean useRuleSet;
+    private RuleServiceCallHelper ruleServiceCallHelper;
 
-    /** 
-     * The decision table to be use, if configured.
-     */
-    private String decisionTable;
-    private boolean useDecisionTable;
-
-    /** 
-     * The rule agent to be use, if configured.
-     */
-    private String ruleAgent;
-    private boolean useRuleAgent;
-    
-    /**
-     * ConfigTree representing the xml configuration.
-     */
-	private ConfigTree configTree;
-
-	/**
-	 * Should this be a stateful rules execution.
-	 */
-    private Boolean stateful;
-
 	public BusinessRulesProcessor(final ConfigTree config) throws ConfigurationException, RegistryException, MessageRouterException
 	{
         super(config);
-        this.configTree = config;
-        
-        // Create the RuleService implementation.
-		final String ruleServiceImpl = configTree.getAttribute(IMPL_CLASS.getTagName(), DroolsRuleService.class.getName());
-		try
-        {
-            ruleService = RuleServiceFactory.getRuleService( ruleServiceImpl );
-    		ruleService.setConfigTree( configTree );
-        } 
-		catch (RuleServiceException e)
-        {
-		    throw new ConfigurationException("Could not create RuleService", e);
-        }
-		
-		useRuleSet = _ruleSet != null;
-		if (useRuleSet == false)
-		{
-    		// Extract the decicion table from the configuration(if configured).
-    		decisionTable = configTree.getAttribute( DECISION_TABLE.getTagName() );
-    		useDecisionTable = decisionTable != null;
-    		
-    		if (useDecisionTable == false)
-    		{
-        		// Extract the ruleAgent from the configuration(if configured).
-                ruleAgent = configTree.getAttribute( RULE_AGENT_PROPERTIES.getTagName() );
-                useRuleAgent = true;
-        
-                if(log.isDebugEnabled()) 
-                {
-                    if (ruleAgent != null && _ruleReload) 
-                    {
-                        log.debug("'" + RULE_RELOAD_TAG + "' is specified on the same configuration as a Rule Agent configuration is specified.  Ignoring the '" + RULE_RELOAD_TAG + "' configuration.");
-                    }
-                }
-            }
-		}
-        
-		stateful = Boolean.valueOf( configTree.getAttribute( STATEFUL.getTagName()) );
+	    ruleServiceCallHelper = new RuleServiceCallHelper(config);
 	}
+	
 	/** 
      * Inspect the content of the message using a rule set 
      *  
@@ -186,139 +101,14 @@
         }
 	}
 	
-	/**
-	 * 
-	 * @param message
-	 * @param objectList
-	 * @throws RuleServiceException 
-	 * @throws MessageRouterException
-	 */
 	Message executeRulesService(Message message, final List<Object> objectList) throws RuleServiceException 
 	{
-	    final String ruleSource = determineRuleSource();
-		RuleInfoBuilder builder = new RuleInfoBuilder(ruleSource);
-		builder.dslSource(_ruleLanguage);
+		final RuleInfoBuilder builder =  ruleServiceCallHelper.getRuleInfoBuilder();
 		builder.global("message", message);
-		builder.reload(_ruleReload);
 		builder.facts(RuleConfigUtil.extractObjectsFromMessage(entryPointMap, message));
 		builder.defaultFacts(objectList);
-		
 		final RuleInfo ruleInfo = builder.build();
-		
-		if (stateful)
-		{
-		    return executeStateful(ruleInfo, message);
-		}
-		else
-		{
-		    return executeStateless(ruleInfo, message);
-		}
+		return ruleServiceCallHelper.executeRulesService(message, ruleInfo);
 	}
 	
-	private Message executeStateless(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
-	{
-	    if (useRuleSet)
-	    {
-            return ruleService.executeStatelessRules(ruleInfo, message);
-	    }
-        else if (useDecisionTable)
-        {
-            return ruleService.executeStatelessRulesFromDecisionTable(ruleInfo, message);
-        }
-        else if (useRuleAgent)
-        {
-            return ruleService.executeStatelessRulesFromRuleAgent(ruleInfo, message);
-        }
-        else
-        {
-    		throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
-        }
-	    
-	}
-	
-	private Message executeStateful(final RuleInfo ruleInfo, final Message message) throws RuleServiceException
-	{
-	    final boolean dispose = getDisposeProperty(message);
-        StatefulRuleInfo statefulRuleInfo = new StatefulRuleInfoImpl(ruleInfo, dispose);
-            
-        final Boolean continueStateful = (Boolean) message.getProperties().getProperty( CONTINUE.getTagName(), Boolean.FALSE );
-        if (continueStateful)
-        {
-            checkDisposePropertyIsSpecified(message);
-            return ruleService.continueStatefulRulesExecution(statefulRuleInfo, message);
-        }
-        else
-        {
-            if (useRuleSet)
-            {
-                return ruleService.executeStatefulRules(statefulRuleInfo, message);
-            }
-            else if (useDecisionTable)
-            {
-                return ruleService.executeStatefulRulesFromDecisionTable(statefulRuleInfo, message);
-            }
-            else if (useRuleAgent)
-            {
-                return ruleService.executeStatefulRulesFromRuleAgent(statefulRuleInfo, message);
-            }
-            else
-            {
-        		throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
-            }
-        }
-	}
-	
-	private static Message throwRuleServiceException() throws RuleServiceException
-	{
-		throw new RuleServiceException( "One of '" + ListenerTagNames.RULE_SET_TAG + "', '" + DECISION_TABLE.getTagName() + "', or ' " + RULE_AGENT_PROPERTIES.getTagName() + "'must be specified as properties in jboss-esb.xml");
-	}
-	
-	private String determineRuleSource()
-	{
-	    if (useRuleSet)
-	    {
-	        return _ruleSet;
-	    }
-	    else if (useDecisionTable)
-	    {
-	        return decisionTable;
-	    }
-	    else 
-	    {
-	        return ruleAgent;
-	    }
-	}
-	
-	private static boolean getDisposeProperty( final Message message ) throws RuleServiceException
-    {
-        Object dispose = message.getProperties().getProperty(DISPOSE.getTagName());
-        return (dispose != null);
-    }
-	
-	private static void checkDisposePropertyIsSpecified( final Message message ) throws RuleServiceException
-    {
-        Object dispose = message.getProperties().getProperty( DISPOSE.getTagName() );
-        if ( dispose == null )
-        {
-            throw new RuleServiceException("The property [" + DISPOSE.getTagName() + "] must be specified when [" +
-                    CONTINUE.getTagName() + "] is true. This is required as it is important that the rules working memory "+
-                    " be disposed or memory leaks can occur.");
-        }
-    }
-	
-	boolean isUseRuleSet()
-	{
-	    return useRuleSet;
-	}
-	
-	boolean isUseDecisionTable()
-	{
-	    return useDecisionTable;
-	}
-	
-	boolean isUseRuleAgent()
-	{
-	    return useRuleAgent;
-	}
-	
 }

Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/internal/soa/esb/services/routing/cbr/JBossRulesRouterUnitTest.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -65,7 +65,7 @@
 		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
 		jbrRouter.setConfigTree( configTree );
 
-		List<String> destinationServices = jbrRouter.route("JBossESBRules.drl",false,message,null);
+		List<String> destinationServices = jbrRouter.route(null, false, message, null);
 		assertNotNull(destinationServices);
 		assertTrue(destinationServices.size()>0);
 		assertEquals(destinationServices.iterator().next(),"serialized-destination");
@@ -107,7 +107,7 @@
 		Message message = createMessage( MessageType.JBOSS_XML);
 		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
 		jbrRouter.setConfigTree( configTree );
-		List<String> destinationServices = jbrRouter.route("JBossESBRules.drl",false,message,null);
+		List<String> destinationServices = jbrRouter.route(null, null, false, message, null);
 		assertEquals(destinationServices.iterator().next(),"xml-destination");
 	}
 
@@ -116,10 +116,10 @@
 	{
 		Message message = createMessage( MessageType.JBOSS_XML);
 		message.getBody().add(("<jbossesb>TEST BODY</jbossesb>").getBytes());
-		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
 		jbrRouter.setConfigTree( configTree );
 
-		List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+		List<String> destinationServices = jbrRouter.route(null,null, false, message, null);
 		assertEquals(destinationServices.iterator().next(),"XML_XPath_Destination");
 	}
 
@@ -129,10 +129,10 @@
 		Message message = createMessage( MessageType.JBOSS_XML );
 		message.getBody().add(("<Dave>rocks</Dave>").getBytes());
 
-		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
 		jbrRouter.setConfigTree( configTree );
 
-		List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+		List<String> destinationServices = jbrRouter.route(null,null, false, message, null);
 		assertEquals(destinationServices.iterator().next(),"XML_XPath_Dave_Destination");
 	}
 
@@ -142,10 +142,10 @@
 		Message message = createMessage( MessageType.JBOSS_XML );
 		message.getBody().add(("<price>1.55</price>").getBytes());
 
-		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
 		jbrRouter.setConfigTree( configTree );
 
-		List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+		List<String> destinationServices = jbrRouter.route(null, null,false, message, null);
 		assertEquals(destinationServices.iterator().next(),"XML_XPath_GreaterThan_Destination");
 	}
 
@@ -157,17 +157,17 @@
 			Message message = MessageFactory.getInstance().getMessage( MessageType.JBOSS_XML );
 			//set the body inside the Message
 			message.getBody().add(("<price>0.55</price>").getBytes());
-    		ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules.drl").build();
+			ConfigTree configTree = new CBRConfigTreeBuilder( true ).ruleFile( "JBossESBRules-XPath.drl").ruleLanguage("XPathLanguage.dsl").build();
     		jbrRouter.setConfigTree( configTree );
 
-			List<String> destinationServices = jbrRouter.route("JBossESBRules-XPath.drl","XPathLanguage.dsl",false,message,null);
+			List<String> destinationServices = jbrRouter.route(null, null,false,message,null);
 			assertEquals(destinationServices.iterator().next(),"XML_XPath_LessThan_Destination");
 		} catch (MessageRouterException e) {
 			e.printStackTrace();
 		}
 	}
 
-	@Test ( expected = MessageRouterException.class )
+	@Test ( expected = IllegalArgumentException.class )
 	public void shouldThrowIfNoRuleSetIsSupplied() throws MessageRouterException
 	{
 		//add new messages
@@ -178,7 +178,7 @@
 		jbrRouter.route( null ,"XPathLanguage.dsl",false,message,null);
 	}
 
-	@Test ( expected = MessageRouterException.class )
+	@Test ( expected = IllegalStateException.class )
 	public void shouldThrowIfRuleServiceImplIsInvalid() throws MessageRouterException
 	{
 		//add new messages

Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/BusinessRulesProcessorUnitTest.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -140,36 +140,6 @@
         assertEquals( "20%" ,message.getBody().get("DiscountObject"));
     }
 
-	@Test
-	public void isUseRuleSet() throws ConfigurationException, RegistryException, MessageRouterException
-	{
-        ConfigTree config = new CBRConfigTreeBuilder(true).ruleFile("test.dsl").build();
-        BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
-        assertTrue(processor.isUseRuleSet());
-        assertFalse(processor.isUseRuleAgent());
-        assertFalse(processor.isUseDecisionTable());
-	}
-
-	@Test
-    public void isUseDecisionTable() throws ConfigurationException, RegistryException, MessageRouterException
-    {
-        ConfigTree config = new CBRConfigTreeBuilder(true).decisionTable("test.exl").build();
-        BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
-        assertTrue(processor.isUseDecisionTable());
-        assertFalse(processor.isUseRuleSet());
-        assertFalse(processor.isUseRuleAgent());
-    }
-
-	@Test
-	public void isUseRuleAgent() throws ConfigurationException, RegistryException, MessageRouterException
-	{
-        ConfigTree config = new CBRConfigTreeBuilder(true).ruleAgent("testRuleAgentFile.properties").build();
-        BusinessRulesProcessor processor = new BusinessRulesProcessor(config);
-        assertTrue(processor.isUseRuleAgent());
-        assertFalse(processor.isUseRuleSet());
-        assertFalse(processor.isUseDecisionTable());
-	}
-
 	public static junit.framework.Test suite()
 	{
 		return new JUnit4TestAdapter(BusinessRulesProcessorUnitTest.class);

Modified: labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java	2009-10-19 10:30:01 UTC (rev 29652)
+++ labs/jbossesb/trunk/product/services/jbrules/src/test/java/org/jboss/soa/esb/actions/CBRConfigTreeBuilder.java	2009-10-19 10:47:13 UTC (rev 29653)
@@ -45,6 +45,7 @@
  		
 	//	optional 
 	private String ruleFile;
+	private String ruleLanguage;
 	private List<String> messagePathList;
 	private Map<String, List<String>> entryPointFacts;
 	private boolean stateful;
@@ -64,6 +65,12 @@
 		return this;
 	}
 	
+	public CBRConfigTreeBuilder ruleLanguage( final String dsl )
+	{
+		this.ruleLanguage = dsl;
+		return this;
+	}
+	
 	public CBRConfigTreeBuilder decisionTable( final String decisionTable )
 	{
 		this.decisionTable = decisionTable;
@@ -115,6 +122,9 @@
         else
         	throw new IllegalStateException("One of ruleFile, decisionTable or ruleAgent must be set");
         
+        if (ruleLanguage != null)
+	        configTree.setAttribute( ListenerTagNames.RULE_LANGUAGE_TAG, ruleLanguage);
+        
             
         if ( messagePathList != null )
         {



More information about the jboss-svn-commits mailing list