[jboss-svn-commits] JBL Code SVN: r14443 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/server/selector and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Aug 22 07:03:04 EDT 2007
Author: michael.neale at jboss.com
Date: 2007-08-22 07:03:04 -0400 (Wed, 22 Aug 2007)
New Revision: 14443
Added:
labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/
labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/
labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
Modified:
labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
Log:
JBRULES-1020 Custom selectors for package building
Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,12 @@
+package org.drools.brms.server.selector;
+
+/**
+ * This is a simple named fact for the selectors.
+ * @author michaelneale
+ *
+ */
+public class Allow {
+
+ public Allow() {}
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,25 @@
+package org.drools.brms.server.selector;
+
+import org.drools.repository.AssetItem;
+
+
+/**
+ *
+ * Asset selectors can be used to choose if an asset is part of a build.
+ *
+ * Asset selectors should be stateless, they will be called multiple times.
+ *
+ * @author Michael Neale
+ *
+ */
+public interface AssetSelector {
+
+
+ /**
+ *
+ * @param asset The asset to be tested.
+ * @return true if asset it allowed.
+ */
+ boolean isAssetAllowed(AssetItem asset);
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,67 @@
+package org.drools.brms.server.selector;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+import org.drools.CheckedDroolsException;
+import org.drools.RuleBase;
+import org.drools.RuntimeDroolsException;
+import org.drools.StatelessSession;
+import org.drools.StatelessSessionResult;
+import org.drools.compiler.RuleBaseLoader;
+import org.drools.repository.AssetItem;
+
+/**
+ * This uses rules to decide if an asset is to be included in a build.
+ *
+ * @author Michael Neale
+ *
+ */
+public class RuleBasedSelector implements AssetSelector {
+
+ private static final Logger log = Logger.getLogger( RuleBasedSelector.class );
+
+
+ String ruleFile;
+ private RuleBase ruleBase;
+
+ public RuleBasedSelector(String val) {
+ this.ruleFile = val;
+
+ InputStream ins = this.getClass().getResourceAsStream( ruleFile );
+ InputStreamReader reader = new InputStreamReader(ins);
+
+
+ try {
+ this.ruleBase = RuleBaseLoader.getInstance().loadFromReader( reader );
+ } catch ( CheckedDroolsException e ) {
+ log.error( e );
+ throw new RuntimeDroolsException(e);
+ } catch ( IOException e ) {
+ log.error( e );
+ throw new RuntimeDroolsException(e);
+ }
+
+ }
+
+ public boolean isAssetAllowed(AssetItem asset) {
+ return evalRules( asset );
+ }
+
+ boolean evalRules(Object asset) {
+ StatelessSession session = ruleBase.newStatelessSession();
+ StatelessSessionResult result = session.executeWithResults( asset );
+
+ java.util.Iterator objects = result.iterateObjects();
+ while(objects.hasNext()) {
+ if (objects.next() instanceof Allow) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,103 @@
+package org.drools.brms.server.selector;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+import org.drools.repository.AssetItem;
+
+
+public class SelectorManager {
+
+ private static final Logger log = Logger.getLogger( SelectorManager.class );
+ public static String SELECTOR_CONFIG_PROPERTIES = "/selectors.properties";
+ private static final SelectorManager INSTANCE = new SelectorManager(SELECTOR_CONFIG_PROPERTIES);
+
+ public Map<String, AssetSelector> selectors = new HashMap<String, AssetSelector>();
+
+
+
+ SelectorManager(String configPath) {
+ log.debug("Loading selectors");
+ Properties props = new Properties();
+ try {
+ props.load(this.getClass().getResourceAsStream(configPath));
+ for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
+ String selectorName = (String) iter.next();
+ String val = props.getProperty(selectorName);
+ if (val.endsWith("drl")) {
+ selectors.put(selectorName ,loadRuleSelector( val) );
+ } else {
+ selectors.put(selectorName, loadSelectorImplementation( val ));
+ }
+ }
+ } catch (IOException e) {
+ log.error("Unable to load selectors.", e);
+ }
+ }
+
+ /**
+ * Return a selector. If the name is null or empty it will return a nil/default selector
+ * (one that lets everything through). If the selector iis not found, it will return null;
+ */
+ public AssetSelector getSelector(String name) {
+ if (name == null || "".equals(name.trim())) {
+ return nilSelector();
+ } else {
+ if (this.selectors.containsKey( name )) {
+
+ return this.selectors.get( name );
+ } else {
+ log.debug( "No selector found by the name of " + name );
+ return null;
+ }
+ }
+ }
+
+
+
+ private AssetSelector nilSelector() {
+ return new AssetSelector() {
+ public boolean isAssetAllowed(AssetItem asset) {
+ return true;
+ }
+ };
+ }
+
+ private AssetSelector loadSelectorImplementation(String val) throws IOException {
+
+ try {
+ return (AssetSelector) Thread.currentThread().getContextClassLoader().loadClass( val ).newInstance();
+
+ } catch ( InstantiationException e ) {
+ log.error( e );
+ return null;
+ } catch ( IllegalAccessException e ) {
+ log.error( e );
+ return null;
+ } catch ( ClassNotFoundException e ) {
+ log.error( e );
+ return null;
+ }
+
+ }
+
+
+
+
+ private AssetSelector loadRuleSelector(String val) {
+
+ return new RuleBasedSelector(val);
+ }
+
+
+
+
+ public static SelectorManager getInstance() {
+ return INSTANCE;
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,44 @@
+#############################################################################################
+# SELECTOR CONFIGURATION FILE
+#
+# Selectors are used when building packages to filter assets based on arbitary criteria.
+# Selectors can either be a class that implements the AssetSelector interface, or a path to a drl file with
+# rules as to what is to be included (the rule file must be on the class path as indicated by that path).
+#
+#############################################################################################
+
+#<name>=</Path to drl> OR <className of a class that implements AssetSelector>
+
+#############################################################################################
+#example:
+#testServer=com.yourcompany.YourSelector
+#prodServer=/SomeRules.drl
+#############################################################################################
+
+#############################################################################################
+#it knows its a rule file if it ends in .drl
+#the names are what you use in the GUI when building a package.
+#############################################################################################
+
+#############################################################################################
+#The contents of SomeRules.drl should follow the pattern of:
+
+#package org.drools.brms.server.selector
+#
+#dialect "mvel"
+#
+#import org.drools.repository.AssetItem
+#import org.drools.brms.server.selector.Allow
+#
+#rule "rule1"
+# when
+# AssetItem()
+# then
+# insert(new Allow())
+#end
+
+#NOTE: to allow an asset, use "insert (new Allow())"
+# the fields that are available are the properties of AssetItem -
+# eg, statusDescription, lastModified, creator etc etc...
+
+#############################################################################################
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java 2007-08-22 09:03:28 UTC (rev 14442)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -2,13 +2,13 @@
/*
* Copyright 2005 JBoss Inc
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,6 +18,7 @@
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
+import java.io.StringReader;
import java.util.Calendar;
import java.util.Date;
@@ -48,6 +49,7 @@
import org.drools.brms.server.util.TableDisplayHandler;
import org.drools.brms.server.util.TestEnvironmentSessionHelper;
import org.drools.common.DroolsObjectInputStream;
+import org.drools.compiler.RuleBaseLoader;
import org.drools.repository.AssetItem;
import org.drools.repository.CategoryItem;
import org.drools.repository.PackageItem;
@@ -113,6 +115,12 @@
assertFalse( "".equals( uuid ) );
AssetItem localItem = impl.repository.loadAssetByUUID( uuid );
+
+// String drl = "package org.drools.repository\n\ndialect 'mvel'\n\n" +
+// "rule Rule1 \n when \n AssetItem(description != null) \n then \n System.out.println(\"yeah\");\nend";
+// RuleBase rb = RuleBaseLoader.getInstance().loadFromReader(new StringReader(drl));
+// rb.newStatelessSession().execute(localItem);
+
assertEquals( "test Delete Unversioned",
localItem.getName() );
@@ -162,9 +170,9 @@
assertFalse( packages[0].uuid == null );
assertFalse( packages[0].uuid.equals( "" ) );
- //just for performance testing with scaling up numbers of rules
+ //just for performance testing with scaling up numbers of rules
// for (int i=1; i <= 1000; i++) {
- // impl.createNewRule( "somerule_" + i, "description",
+ // impl.createNewRule( "somerule_" + i, "description",
// "testAddRule", "another", "drl" );
// }
@@ -342,7 +350,7 @@
asset = impl.loadRuleAsset( uuid );
impl.checkinVersion( asset ); //2
asset = impl.loadRuleAsset( uuid );
- impl.checkinVersion( asset ); //HEAD
+ impl.checkinVersion( asset ); //HEAD
TableDataResult result = impl.loadAssetHistory( uuid );
assertNotNull( result );
@@ -447,7 +455,7 @@
assertEquals( "testCheckinCategory/deeper",
asset2.metaData.categories[2] );
- //now lets try a concurrent edit of an asset.
+ //now lets try a concurrent edit of an asset.
//asset3 will be loaded and edited, and then asset2 will try to clobber, it, which should fail.
//as it is optimistically locked.
RuleAsset asset3 = serv.loadRuleAsset( asset2.uuid );
@@ -974,7 +982,7 @@
res.data.length );
impl.removeAsset( uuid4 );
-
+
res = impl.listAssets( pkgUUID,
arr( "testRemoveAsset" ),
-1,
@@ -982,12 +990,12 @@
assertEquals( 3,
res.data.length );
}
-
-
+
+
public void testArchiveAsset() throws Exception {
RepositoryService impl = getService();
String cat = "testArchiveAsset";
- impl.createCategory( "/",
+ impl.createCategory( "/",
cat,
"ya" );
String pkgUUID = impl.createPackage( "testArchiveAsset",
@@ -1024,27 +1032,27 @@
res.data.length );
impl.archiveAsset( uuid4, true );
-
+
res = impl.listAssets( pkgUUID,
arr( "testArchiveAsset" ),
-1,
0 );
assertEquals( 3,
res.data.length );
-
+
impl.archiveAsset( uuid4, false );
-
+
res = impl.listAssets( pkgUUID,
arr( "testArchiveAsset" ),
-1,
0 );
assertEquals( 4,
res.data.length );
-
+
}
-
+
public void testLoadSuggestionCompletionEngine() throws Exception {
RepositoryService impl = getService();
String uuid = impl.createPackage( "testSuggestionComp",
@@ -1058,8 +1066,8 @@
}
/**
- * This will test creating a package, check it compiles, and can exectute rules,
- * then take a snapshot, and check that it reports errors.
+ * This will test creating a package, check it compiles, and can exectute rules,
+ * then take a snapshot, and check that it reports errors.
*/
public void testBinaryPackageCompileAndExecute() throws Exception {
ServiceImplementation impl = getService();
@@ -1130,8 +1138,8 @@
}
/**
- * This will test creating a package with a BRL rule, check it compiles, and can exectute rules,
- * then take a snapshot, and check that it reports errors.
+ * This will test creating a package with a BRL rule, check it compiles, and can exectute rules,
+ * then take a snapshot, and check that it reports errors.
*/
public void testBinaryPackageCompileAndExecuteWithBRXML() throws Exception {
ServiceImplementation impl = getService();
@@ -1249,7 +1257,7 @@
}
/**
- * this loads up a precompile binary package. If this fails,
+ * this loads up a precompile binary package. If this fails,
* then it means it needs to be updated. It gets the package form the BRL example above.
*/
public void testLoadAndExecBinary() throws Exception {
Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,5 @@
+package org.drools.brms.server.selector;
+
+public class DummyClass {
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,50 @@
+package org.drools.brms.server.selector;
+
+import junit.framework.TestCase;
+
+public class SelectorManagerTest extends TestCase {
+
+ public void testSelectorMangerConfig() {
+ SelectorManager sm = SelectorManager.getInstance();
+ assertNotNull(sm);
+ assertNotNull(sm.selectors);
+
+ assertNull(sm.getSelector( "goo" ));
+ assertNotNull(sm.getSelector( "selector1" ));
+ assertTrue(sm.getSelector( "selector1" ) instanceof TestSelector);
+ assertNotNull(sm.getSelector( "selector2" ));
+ assertTrue(sm.getSelector( "selector2" ) instanceof RuleBasedSelector);
+
+ RuleBasedSelector sel = (RuleBasedSelector) sm.getSelector( "selector2" );
+ assertEquals("/TestSelector.drl", sel.ruleFile);
+
+ assertFalse(sel.evalRules( new DummyClass() ));
+ assertTrue(sel.evalRules( new Allow() ));
+ assertFalse(sel.evalRules( new DummyClass() ));
+ assertTrue(sel.evalRules( new Allow() ));
+
+
+ assertNull(sm.getSelector( "selector3" ));
+
+ assertNotNull(sm.getSelector( "" ));
+ assertNotNull(sm.getSelector( null ));
+ AssetSelector nil = sm.getSelector( null );
+ assertTrue(nil.isAssetAllowed( null ));
+
+
+ sm = new SelectorManager("/emptyselectors.properties");
+
+ assertNull(sm.getSelector( "XX" ));
+ assertNotNull(sm.getSelector( null ));
+
+ nil = sm.getSelector( " " );
+ assertTrue(nil.isAssetAllowed( null ));
+
+
+ assertSame( SelectorManager.getInstance(), SelectorManager.getInstance());
+
+
+
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,14 @@
+package org.drools.brms.server.selector;
+
+import org.drools.repository.AssetItem;
+
+public class TestSelector
+ implements
+ AssetSelector {
+
+ public boolean isAssetAllowed(AssetItem asset) {
+
+ return true;
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,14 @@
+package org.drools.brms.server.selector
+
+dialect "mvel"
+
+import org.drools.repository.AssetItem
+import org.drools.brms.server.selector.Allow
+
+rule "rule1"
+ when
+ AssetItem()
+ then
+ insert(new Allow())
+end
+
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1 @@
+#this is deliberately empty to test the default state of the system
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties 2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,3 @@
+selector1=org.drools.brms.server.selector.TestSelector
+selector2=/TestSelector.drl
+selector3=XXX
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the jboss-svn-commits
mailing list