[jboss-svn-commits] JBL Code SVN: r23934 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/agent and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Nov 18 22:16:24 EST 2008
Author: mark.proctor at jboss.com
Date: 2008-11-18 22:16:24 -0500 (Tue, 18 Nov 2008)
New Revision: 23934
Added:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentFactory.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentProvider.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeEventListener.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/KnowledgeAgentProviderImpl.java
Modified:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseFactory.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilderFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
Log:
JBRULES-1734 Drools API
-A simplified KnowlegeAgent now works
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseFactory.java 2008-11-19 02:59:50 UTC (rev 23933)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseFactory.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -1,32 +1,37 @@
package org.drools;
+import java.util.Properties;
+
public class KnowledgeBaseFactory {
private static KnowledgeBaseProvider provider;
- public static void setKnowledgeBaseProvider(KnowledgeBaseProvider provider) {
- KnowledgeBaseFactory.provider = provider;
+ public static KnowledgeBase newKnowledgeBase() {
+ return getsetKnowledgeBaseProvider().newKnowledgeBase();
}
- public static KnowledgeBase newKnowledgeBase() {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newKnowledgeBase();
+ public static KnowledgeBase newKnowledgeBase(KnowledgeBaseConfiguration conf) {
+
+ return getsetKnowledgeBaseProvider().newKnowledgeBase(conf);
}
- public static KnowledgeBase newKnowledgeBase(KnowledgeBaseConfiguration conf) {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newKnowledgeBase(conf);
+ public static KnowledgeBaseConfiguration newKnowledgBaseConfiguration() {
+ return getsetKnowledgeBaseProvider().newKnowledgeBaseConfiguration();
}
- public static KnowledgeBaseConfiguration newKnowledgeBaseConfiguration() {
+ public static KnowledgeBaseConfiguration newKnowledgBaseConfiguration(Properties properties, ClassLoader classLoader) {
+ return getsetKnowledgeBaseProvider().newKnowledgeBaseConfiguration( properties, classLoader );
+ }
+
+ public static void setKnowledgeBaseProvider(KnowledgeBaseProvider provider) {
+ KnowledgeBaseFactory.provider = provider;
+ }
+
+ public static synchronized KnowledgeBaseProvider getsetKnowledgeBaseProvider() {
if ( provider == null ) {
loadProvider();
- }
- return provider.newKnowledgeBaseConfiguration();
+ }
+ return provider;
}
private static void loadProvider() {
@@ -34,19 +39,8 @@
// we didn't find anything in properties so lets try and us reflection
Class<KnowledgeBaseProvider> cls = ( Class<KnowledgeBaseProvider> ) Class.forName( "org.drools.impl.KnowledgeBaseProviderImpl" );
setKnowledgeBaseProvider( cls.newInstance() );
- } catch ( Exception e2 ) {
+ } catch ( Exception e ) {
throw new ProviderInitializationException( "Provider org.drools.impl.KnowledgeBaseProviderImpl could not be set." );
- }
-
-// try {
-// ChainedProperties properties = new ChainedProperties( "drools-providers.conf" );
-// String className = properties.getProperty( "KnowledgeSessionProvider", null );
-// if ( className != null && className.trim().length() > 0 ) {
-// Class<KnowledgeBaseProvider> cls = ( Class<KnowledgeBaseProvider> ) Class.forName( className );
-// setKnowledgeBaseProvider( cls.newInstance() );
-// }
-// } catch ( Exception e1 ) {
-//
-// }
+ }
}
}
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -0,0 +1,55 @@
+package org.drools.agent;
+
+import org.drools.KnowledgeBase;
+
+/**
+ * This manages a single KnowledeBase, using the given properties.
+ * You should only have ONE instance of this agent per KnowledeBase configuration.
+ * You can get the KnowledeBase from this agent repeatedly, as needed, or if you keep the KnowledeBase,
+ * under most configurations it will be automatically updated.
+ *
+ * How this behaves depends on the properties that you pass into it (documented below)
+ *
+ * CONFIG OPTIONS (to be passed in as properties):
+ * <code>newInstance</code>: setting this to "true" means that each time the rules are changed
+ * a new instance of the KnowledeBase is created (as opposed to updated in place)
+ * the default is to update in place. DEFAULT: false. If you set this to true,
+ * then you will need to call getRuleBase() each time you want to use it. If it is false,
+ * then it means you can keep your reference to the KnowledeBase and it will be updated automatically
+ * (as well as any StatefulKnowlegeSessions).
+ *
+ * <code>poll</code>The number of seconds to poll for changes. Polling
+ * happens in a background thread. eg: poll=30 #30 second polling.
+ *
+ * <code>file</code>: a space separated listing of files that make up the
+ * packages of the KnowledeBase. Each package can only be in one file. You can't have
+ * packages spread across files. eg: file=/your/dir/file1.pkg file=/your/dir/file2.pkg
+ * If the file has a .pkg extension, then it will be loaded as a binary Package (eg from the BRMS). If its a
+ * DRL file (ie a file with a .drl extension with rule source in it), then it will attempt to compile it (of course, you will need the drools-compiler and its dependencies
+ * available on your classpath).
+ *
+ * <code>dir</code>: a single file system directory to monitor for packages.
+ * As with files, each package must be in its own file.
+ * eg: dir=/your/dir
+ *
+ * <code>url</code>: A space separated URL to a binary KnowledeBase in the BRMS.
+ * eg: url=http://server/drools-guvnor/packages/somePakage/VERSION_1
+ * For URL you will also want a local cache directory setup:
+ * eg: localCacheDir=/some/dir/that/exists
+ * This is needed so that the runtime can startup and load packages even if the BRMS
+ * is not available (or the network).
+ *
+ * <code>name</code>
+ * the Name is used in any logging, so each agent can be differentiated (you may have one agent per KnowledeBase
+ * that you need in your application).
+ *
+ * There is also an KnowledgeAgentEventListener interface which you can provide which will call back when lifecycle
+ * events happen, or errors/warnings occur. As the updating happens in a background thread, this may be important.
+ * The default event listener logs to the System.err output stream.
+ *
+ */
+public interface KnowledgeAgent {
+ String getName();
+
+ KnowledgeBase getKnowledgeBase();
+}
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentFactory.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentFactory.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -0,0 +1,52 @@
+package org.drools.agent;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseProvider;
+import org.drools.ProviderInitializationException;
+
+public class KnowledgeAgentFactory {
+ private static KnowledgeAgentProvider provider;
+
+ public synchronized static void setKnowledgeAgentProvider(KnowledgeAgentProvider provider) {
+ KnowledgeAgentFactory.provider = provider;
+ }
+
+ public static KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config) {
+ return newKnowledgeAgent( name,
+ config,
+ null,
+ null );
+ }
+
+ /**
+ * This allows an optional listener to be passed in.
+ * The default one prints some stuff out to System.err only when really needed.
+ */
+ public static KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeEventListener listener,
+ KnowledgeBaseConfiguration ruleBaseConf) {
+
+ return getKnowledgeAgentProvider().newKnowledgeAgent(name, config, listener, ruleBaseConf);
+ }
+
+ private static synchronized KnowledgeAgentProvider getKnowledgeAgentProvider() {
+ if ( provider == null ) {
+ loadProvider();
+ }
+ return provider;
+ }
+
+ private static void loadProvider() {
+ try {
+ // we didn't find anything in properties so lets try and us reflection
+ Class<KnowledgeAgentProvider> cls = ( Class<KnowledgeAgentProvider> ) Class.forName( "org.drools.agent.KnowledgeAgentProviderImpl" );
+ setKnowledgeAgentProvider( cls.newInstance() );
+ } catch ( Exception e ) {
+ throw new ProviderInitializationException( "Provider org.drools.agent.KnowledgeAgentProvider could not be set." );
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentProvider.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgentProvider.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -0,0 +1,36 @@
+package org.drools.agent;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBaseConfiguration;
+
+public interface KnowledgeAgentProvider {
+
+ KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config);
+
+ /**
+ * Properties configured to load up packages into a KnowledgeBase with the provided
+ * configuration (and monitor them for changes).
+ */
+ KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeBaseConfiguration ruleBaseConf);
+
+ /**
+ * This allows an optional listener to be passed in.
+ * The default one prints some stuff out to System.err only when really needed.
+ */
+ KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeEventListener listener);
+
+ /**
+ * This allows an optional listener to be passed in.
+ * The default one prints some stuff out to System.err only when really needed.
+ */
+ KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeEventListener listener,
+ KnowledgeBaseConfiguration ruleBaseConf);
+}
Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeEventListener.java (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeEventListener.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -0,0 +1,24 @@
+package org.drools.agent;
+
+public interface KnowledgeEventListener {
+ /**
+ * For general info messages
+ */
+ public void info(String message);
+
+ /**
+ * For a warning (useful when tracking down problems).
+ */
+ public void warning(String message);
+
+ /**
+ * An exception occurred.
+ */
+ public void exception(Exception e);
+
+
+ /**
+ * These should not be logged, just shown if needed.
+ */
+ public void debug(String message);
+}
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilderFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilderFactory.java 2008-11-19 02:59:50 UTC (rev 23933)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilderFactory.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -7,45 +7,37 @@
public class KnowledgeBuilderFactory {
private static volatile KnowledgeBuilderProvider provider;
- public static void setKnowledgeBuilderProvider(KnowledgeBuilderProvider provider) {
- KnowledgeBuilderFactory.provider = provider;
- }
-
public static KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration() {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newKnowledgeBuilderConfiguration();
+ return getKnowledgeBuilderProvider().newKnowledgeBuilderConfiguration();
}
public static KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration(Properties properties, ClassLoader classLoader) {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newKnowledgeBuilderConfiguration( properties,
+ return getKnowledgeBuilderProvider().newKnowledgeBuilderConfiguration( properties,
classLoader );
}
public static DecisionTableConfiguration newDecisionTableConfiguration() {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newDecisionTableConfiguration();
+ return getKnowledgeBuilderProvider().newDecisionTableConfiguration();
}
public static KnowledgeBuilder newKnowledgeBuilder() {
- if ( provider == null ) {
- loadProvider();
- }
- return provider.newKnowledgeBuilder();
+ return getKnowledgeBuilderProvider().newKnowledgeBuilder();
}
public static KnowledgeBuilder newKnowledgeBuilder(KnowledgeBuilderConfiguration conf) {
+ return getKnowledgeBuilderProvider().newKnowledgeBuilder(conf);
+ }
+
+ public static void setKnowledgeBuilderProvider(KnowledgeBuilderProvider provider) {
+ KnowledgeBuilderFactory.provider = provider;
+ }
+
+ public static synchronized KnowledgeBuilderProvider getKnowledgeBuilderProvider() {
if ( provider == null ) {
loadProvider();
- }
- return provider.newKnowledgeBuilder(conf);
- }
+ }
+ return provider;
+ }
private static void loadProvider() {
try {
@@ -54,15 +46,5 @@
} catch ( Exception e2 ) {
throw new ProviderInitializationException( "Provider org.drools.builder.impl.KnowledgeBuilderProviderImpl could not be set.", e2 );
}
-
-// try {
-// ChainedProperties properties = new ChainedProperties( "drools-providers.conf" );
-// String className = properties.getProperty( "KnowledgeBuilderProvider", null );
-// if ( className != null && className.trim().length() > 0 ) {
-// Class<KnowledgeBuilderProvider> cls = ( Class<KnowledgeBuilderProvider> ) Class.forName( className );
-// setKnowledgeBuilderProvider( cls.newInstance() );
-// }
-// } catch ( Exception e1 ) {
-// }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java 2008-11-19 02:59:50 UTC (rev 23933)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -6,31 +6,11 @@
*
* @author Michael Neale
*/
-public interface AgentEventListener {
+public interface AgentEventListener extends KnowledgeEventListener {
/**
* This sets the name for logging.
*/
public void setAgentName(String name);
-
- /**
- * For general info messages.
- */
- public void info(String message);
-
- /**
- * For a warning (useful when tracking down problems).
- */
- public void warning(String message);
-
- /**
- * An exception occurred.
- */
- public void exception(Exception e);
-
-
- /**
- * These should not be logged, just shown if needed.
- */
- public void debug(String message);
+
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/KnowledgeAgentProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/KnowledgeAgentProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/KnowledgeAgentProviderImpl.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -0,0 +1,75 @@
+package org.drools.agent;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.impl.KnowledgeBaseImpl;
+
+public class KnowledgeAgentProviderImpl
+ implements
+ KnowledgeAgentProvider {
+
+ public KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config) {
+ return new KnowledgeAgentWrapper( name,
+ RuleAgent.newRuleAgent( config ) );
+ }
+
+ public KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeBaseConfiguration kbaseConf) {
+ return new KnowledgeAgentWrapper( name,
+ RuleAgent.newRuleAgent( config ) );
+ }
+
+ public KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeEventListener listener) {
+ return new KnowledgeAgentWrapper( name,
+ RuleAgent.newRuleAgent( config ) );
+ }
+
+ public KnowledgeAgent newKnowledgeAgent(String name,
+ Properties config,
+ KnowledgeEventListener listener,
+ KnowledgeBaseConfiguration kbaseConf) {
+ return new KnowledgeAgentWrapper( name,
+ RuleAgent.newRuleAgent( config,
+ null,
+ ((RuleBaseConfiguration) kbaseConf) ) );
+ }
+
+ public static class KnowledgeAgentWrapper
+ implements
+ KnowledgeAgent {
+ private String name;
+ private RuleAgent ruleAgent;
+ private RuleBase ruleBase;
+ private KnowledgeBase kbase;
+
+ KnowledgeAgentWrapper(String name,
+ RuleAgent ruleAgent) {
+ this.ruleAgent = ruleAgent;
+ ruleAgent.listener.setAgentName( name );
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public synchronized KnowledgeBase getKnowledgeBase() {
+ RuleBase newRuleBase = this.ruleAgent.getRuleBase();
+ if ( newRuleBase != this.ruleBase ) {
+ // if ruleBase is null or newRuleBase is a new instance then create a new kbase.
+ this.ruleBase = newRuleBase;
+ this.kbase = new KnowledgeBaseImpl( this.ruleBase );
+ }
+ return this.kbase;
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java 2008-11-19 02:59:50 UTC (rev 23933)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -96,6 +96,8 @@
URLScanner.class );
}
};
+
+ String name;
/**
* This is true if the rulebase is created anew each time.
@@ -283,6 +285,13 @@
listener,
ruleBaseConfiguration );
}
+
+ public void setName(String name) {
+ this.name = name;
+ if ( this.listener != null ) {
+ this.listener.setAgentName( this.name );
+ }
+ }
static Properties loadFromProperties(String propsFileName) {
InputStream in = RuleAgent.class.getResourceAsStream( propsFileName );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java 2008-11-19 02:59:50 UTC (rev 23933)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java 2008-11-19 03:16:24 UTC (rev 23934)
@@ -2,6 +2,7 @@
import java.io.File;
import java.io.FileOutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -10,6 +11,7 @@
import junit.framework.TestCase;
+import org.drools.KnowledgeBase;
import org.drools.RuleBase;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseConfiguration.SequentialAgenda;
@@ -268,7 +270,69 @@
rb__ );
}
+
+ public void testPollingFilesRuleBaseReplace2() throws Exception {
+ File dir = RuleBaseAssemblerTest.getTempDirectory();
+ Package p1 = new Package( "p1" );
+ File p1f = new File( dir,
+ "p43_.pkg" );
+ RuleBaseAssemblerTest.writePackage( p1,
+ p1f );
+
+ Package p2 = new Package( "p2" );
+ File p2f = new File( dir,
+ "p44_.pkg" );
+ RuleBaseAssemblerTest.writePackage( p2,
+ p2f );
+
+ String path = dir.getPath() + "/" + "p43_.pkg " + dir.getPath() + "/p44_.pkg";
+
+ Properties props = new Properties();
+ props.setProperty( "file",
+ path );
+
+ props.setProperty( "newInstance",
+ "true" );
+
+ props.setProperty( "poll", "1" );
+
+ KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "agent1", props );
+
+ //RuleAgent ag = RuleAgent.newRuleAgent( props );
+
+ //assertTrue( ag.isNewInstance() );
+
+ KnowledgeBase kbase = kagent.getKnowledgeBase();
+
+ assertEquals( 2,
+ kbase.getKnowledgePackages().size() );
+
+ KnowledgeBase kbase_ = kagent.getKnowledgeBase();
+ assertSame( kbase,
+ kbase_ );
+
+// //only change one
+ RuleBaseAssemblerTest.writePackage( p1,
+ p1f );
+ int i = 0;
+ while ( i < 10 && kagent.getKnowledgeBase() == kbase ) {
+ // this will sleep for a max of 5 seconds, it'll check every 500ms to see if a new kbase exists
+ // if it exists, it will break the loop.
+ Thread.sleep( 500 );
+ i++;
+ }
+
+ kbase_ = kagent.getKnowledgeBase();
+ assertNotSame( kbase,
+ kbase_ );
+
+ //check we will have 2
+ assertEquals( 2,
+ kbase.getKnowledgePackages().size() );
+
+ }
+
public void testPollingFilesRuleBaseRemoveNewInstanceFalse() throws Exception {
File dir = RuleBaseAssemblerTest.getTempDirectory();
More information about the jboss-svn-commits
mailing list