[jboss-svn-commits] JBL Code SVN: r19347 - in labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools: rule and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Mar 31 17:40:54 EDT 2008
Author: mingjin
Date: 2008-03-31 17:40:54 -0400 (Mon, 31 Mar 2008)
New Revision: 19347
Modified:
labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java
labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java
Log:
JBRULES-1535 - Fixed the failed test case - DynamicRulesTest.testDynamicFunction
AbstractRuleBase.java: perform proper package merge including functions.
CompositePackageClassLoader: check existence of classLoader before adding to the list.
DialectDatas: merge changes.
JavaDialectData: set dirty when new PackageClassLoader was created.
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java 2008-03-31 16:15:38 UTC (rev 19346)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java 2008-03-31 21:40:54 UTC (rev 19347)
@@ -43,14 +43,8 @@
import org.drools.event.RuleBaseEventSupport;
import org.drools.objenesis.Objenesis;
import org.drools.process.core.Process;
-import org.drools.rule.CompositePackageClassLoader;
-import org.drools.rule.DialectDatas;
-import org.drools.rule.ImportDeclaration;
-import org.drools.rule.InvalidPatternException;
-import org.drools.rule.MapBackedClassLoader;
+import org.drools.rule.*;
import org.drools.rule.Package;
-import org.drools.rule.Rule;
-import org.drools.rule.TypeDeclaration;
import org.drools.spi.ExecutorServiceFactory;
import org.drools.spi.FactHandleFactory;
import org.drools.util.ObjectHashSet;
@@ -401,15 +395,6 @@
this.wms = null;
}
- public static class MergedPackage extends Package {
- public MergedPackage() {
- }
-
- public MergedPackage(String name, ClassLoader classLoader) {
- super(name, classLoader);
- }
- }
-
/**
* Add a <code>Package</code> to the network. Iterates through the
* <code>Package</code> adding Each individual <code>Rule</code> to the
@@ -435,20 +420,18 @@
this.eventSupport.fireBeforePackageAdded( newPkg );
if ( pkg == null ) {
- this.pkgs.put( newPkg.getName(),
- newPkg );
- } else {
- if (!(pkg instanceof MergedPackage)) {
- Package temp = new MergedPackage(pkg.getName(),
- pkg.getDialectDatas().getParentClassLoader());
- this.pkgs.put(pkg.getName(), temp);
- mergePackage(temp, pkg);
- pkg = temp;
- }
- mergePackage( pkg,
- newPkg );
+ pkg = new Package(newPkg.getName(),
+ newPkg.getDialectDatas().getParentClassLoader());
+ pkgs.put(pkg.getName(), pkg);
+ this.packageClassLoader.addClassLoader( pkg.getDialectDatas().getClassLoader());
}
+ else {
+ this.packageClassLoader.addClassLoader( newPkg.getDialectDatas().getClassLoader() );
+ }
+ mergePackage( pkg,
+ newPkg );
+
final Map newGlobals = newPkg.getGlobals();
if (newGlobals != null) {
@@ -496,8 +479,6 @@
}
}
- this.packageClassLoader.addClassLoader( newPkg.getDialectDatas().getClassLoader() );
-
this.eventSupport.fireAfterPackageAdded( newPkg );
// only unlock if it had been acquired implicitely
@@ -582,6 +563,13 @@
pkg.getDialectDatas().merge( newPkg.getDialectDatas() );
+ if ( newPkg.getFunctions() != null) {
+ for (Object object : newPkg.getFunctions().entrySet()) {
+ Map.Entry entry = (Map.Entry)object;
+ pkg.addFunction((Function)entry.getValue());
+ }
+ }
+
if ( this.reloadPackageCompilationData == null ) {
this.reloadPackageCompilationData = new ReloadPackageCompilationData();
}
@@ -882,11 +870,11 @@
implements
RuleBaseAction {
private static final long serialVersionUID = 1L;
- private Set set;
+ private Set<DialectDatas> set;
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
- set = (Set) in.readObject();
+ set = (Set<DialectDatas>) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
@@ -895,15 +883,14 @@
public void addDialectDatas(final DialectDatas dialectDatas) {
if ( this.set == null ) {
- this.set = new HashSet();
+ this.set = new HashSet<DialectDatas>();
}
-
- this.set.add( dialectDatas );
+ if (!this.set.contains(dialectDatas))
+ this.set.add( dialectDatas );
}
public void execute(final InternalRuleBase ruleBase) {
- for ( final Iterator it = this.set.iterator(); it.hasNext(); ) {
- final DialectDatas dialectDatas = (DialectDatas) it.next();
+ for ( final DialectDatas dialectDatas : this.set ) {
dialectDatas.reloadDirty();
}
}
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java 2008-03-31 16:15:38 UTC (rev 19346)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java 2008-03-31 21:40:54 UTC (rev 19347)
@@ -7,28 +7,23 @@
public class CompositePackageClassLoader extends ClassLoader implements DroolsClassLoader {
- private final List classLoaders = new ArrayList();
+ private final List<DroolsClassLoader> classLoaders = new ArrayList<DroolsClassLoader>();
public CompositePackageClassLoader(final ClassLoader parentClassLoader) {
super( parentClassLoader );
}
public void addClassLoader(final ClassLoader classLoader) {
- this.classLoaders.add( classLoader );
+ if (!this.classLoaders.contains((DroolsClassLoader)classLoader))
+ this.classLoaders.add( (DroolsClassLoader)classLoader );
}
public void removeClassLoader(final ClassLoader classLoader) {
- for ( final Iterator it = this.classLoaders.iterator(); it.hasNext(); ) {
- if ( it.next() == classLoader ) {
- it.remove();
- break;
- }
- }
+ this.classLoaders.remove((DroolsClassLoader)classLoader);
}
public Class fastFindClass(final String name) {
- for ( final Iterator it = this.classLoaders.iterator(); it.hasNext(); ) {
- final DroolsClassLoader classLoader = (DroolsClassLoader) it.next();
+ for ( final DroolsClassLoader classLoader : this.classLoaders ) {
final Class clazz = classLoader.fastFindClass( name );
if ( clazz != null ) {
return clazz;
@@ -38,11 +33,11 @@
}
/**
- * Javadocs recommend that this method not be overloaded. We overload this so that we can prioritise the fastFindClass
+ * Javadocs recommend that this method not be overloaded. We overload this so that we can prioritise the fastFindClass
* over method calls to parent.loadClass(name, false); and c = findBootstrapClass0(name); which the default implementation
- * would first - hence why we call it "fastFindClass" instead of standard findClass, this indicates that we give it a
+ * would first - hence why we call it "fastFindClass" instead of standard findClass, this indicates that we give it a
* higher priority than normal.
- *
+ *
*/
protected synchronized Class loadClass(final String name,
final boolean resolve) throws ClassNotFoundException {
@@ -68,10 +63,10 @@
return clazz;
}
-
+
public InputStream getResourceAsStream(final String name) {
InputStream stream = super.getResourceAsStream( name );
-
+
for ( final Iterator it = this.classLoaders.iterator(); it.hasNext(); ) {
final DroolsClassLoader classLoader = (DroolsClassLoader) it.next();
stream = classLoader.getResourceAsStream( name );
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java 2008-03-31 16:15:38 UTC (rev 19346)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java 2008-03-31 21:40:54 UTC (rev 19347)
@@ -11,8 +11,6 @@
import java.util.Map;
import java.util.Map.Entry;
-import org.drools.common.DroolsObjectInput;
-
public class DialectDatas implements Externalizable {
private transient ClassLoader parentClassLoader;
private CompositePackageClassLoader classLoader;
@@ -93,8 +91,7 @@
DialectData data = this.dialects.get( entry.getKey() );
if (data == null) {
DialectData dialectData = entry.getValue().clone();
- if (dialectData instanceof JavaDialectData)
- ((JavaDialectData)dialectData).setDialectDatas(this);
+ dialectData.setDialectDatas(this);
this.dialects.put(entry.getKey(), dialectData);
} else {
data.merge( entry.getValue() );
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java 2008-03-31 16:15:38 UTC (rev 19346)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java 2008-03-31 21:40:54 UTC (rev 19347)
@@ -25,17 +25,13 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.drools.RuntimeDroolsException;
import org.drools.base.accumulators.JavaAccumulatorFunctionExecutor;
-import org.drools.common.DroolsObjectInputStream;
-import org.drools.common.DroolsObjectOutputStream;
import org.drools.common.DroolsObjectInput;
import org.drools.spi.Accumulator;
import org.drools.spi.Consequence;
@@ -142,6 +138,13 @@
this.dirty = droolsStream.readBoolean();
}
+ protected Map getStore() {
+ if (store == null) {
+ store = new HashMap();
+ }
+ return store;
+ }
+
public ClassLoader getClassLoader() {
return this.classLoader;
}
@@ -170,18 +173,23 @@
if (this.classLoader == null) {
this.classLoader = new PackageClassLoader(newJavaData.getClassLoader().getParent(), this);
+ this.dirty = true;
}
- // Add invokers
- putAllInvokers( newJavaData.getInvokers() );
+ this.dirty = newData.isDirty();
// First update the binary files
// @todo: this probably has issues if you add classes in the incorrect order - functions, rules, invokers.
- final String[] files = newJavaData.list();
- for ( int i = 0, length = files.length; i < length; i++ ) {
- write( files[i],
- newJavaData.read( files[i] ) );
+ for ( String file : newJavaData.list()) {
+ // no need to wire, as we already know this is done in a merge
+ if (getStore().put( file,
+ newJavaData.read( file ) ) != null ) {
+ // we are updating an existing class so reload();
+ this.dirty = true;
+ }
}
+ // Add invokers
+ putAllInvokers( newJavaData.getInvokers() );
}
private void removeClasses(final ConditionalElement ce) {
@@ -214,18 +222,15 @@
public byte[] read(final String resourceName) {
byte[] bytes = null;
- if ( this.store != null && !this.store.isEmpty()) {
- bytes = (byte[]) this.store.get( resourceName );
+ if ( !getStore().isEmpty()) {
+ bytes = (byte[])getStore().get( resourceName );
}
return bytes;
}
public void write(final String resourceName,
final byte[] clazzData) throws RuntimeDroolsException {
- if (this.store == null) {
- this.store = new HashMap();
- }
- if ( this.store.put( resourceName,
+ if ( getStore().put( resourceName,
clazzData ) != null ) {
// we are updating an existing class so reload();
//reload();
@@ -242,8 +247,8 @@
}
public boolean remove(final String resourceName) throws RuntimeDroolsException {
- this.invokerLookups.remove( resourceName );
- if ( this.store.remove( convertClassToResourcePath( resourceName ) ) != null ) {
+ getInvokers().remove( resourceName );
+ if (getStore().remove( convertClassToResourcePath( resourceName ) ) != null ) {
// we need to make sure the class is removed from the classLoader
// reload();
this.dirty = true;
@@ -253,17 +258,13 @@
}
public String[] list() {
- if ( this.store == null ) {
- return new String[0];
- }
- final List names = new ArrayList();
+ String[] names = new String[getStore().size()];
+ int i = 0;
- for ( final Iterator it = this.store.keySet().iterator(); it.hasNext(); ) {
- final String name = (String) it.next();
- names.add( name );
+ for ( Object object : getStore().keySet()) {
+ names[i++] = (String)object;
}
-
- return (String[]) names.toArray( new String[this.store.size()] );
+ return names;
}
/**
@@ -277,8 +278,8 @@
// Wire up invokers
try {
- for ( final Iterator it = this.invokerLookups.entrySet().iterator(); it.hasNext(); ) {
- Entry entry = (Entry) it.next();
+ for ( final Object object : getInvokers().entrySet() ) {
+ Entry entry = (Entry) object;
wire( (String) entry.getKey(),
entry.getValue() );
}
@@ -296,8 +297,8 @@
}
public void clear() {
- this.store.clear();
- this.invokerLookups.clear();
+ getStore().clear();
+ getInvokers().clear();
this.AST = null;
reload();
}
@@ -305,7 +306,7 @@
public void wire(final String className) throws ClassNotFoundException,
InstantiationException,
IllegalAccessException {
- final Object invoker = this.invokerLookups.get( className );
+ final Object invoker = getInvokers().get( className );
wire( className,
invoker );
}
@@ -341,29 +342,29 @@
}
public String toString() {
- return this.getClass().getName() + this.store.toString();
+ return this.getClass().getName() +getStore().toString();
}
public void putInvoker(final String className,
final Object invoker) {
- this.invokerLookups.put( className,
+ getInvokers().put( className,
invoker );
}
public void putAllInvokers(final Map invokers) {
- if (this.invokerLookups == null) {
- this.invokerLookups = new HashMap();
- }
- this.invokerLookups.putAll( invokers );
+ getInvokers().putAll( invokers );
}
public Map getInvokers() {
+ if (this.invokerLookups == null) {
+ this.invokerLookups = new HashMap();
+ }
return this.invokerLookups;
}
public void removeInvoker(final String className) {
- this.invokerLookups.remove( className );
+ getInvokers().remove( className );
}
public Object getAST() {
More information about the jboss-svn-commits
mailing list