[jboss-svn-commits] JBL Code SVN: r19255 - 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
Wed Mar 26 17:21:05 EDT 2008
Author: mingjin
Date: 2008-03-26 17:21:04 -0400 (Wed, 26 Mar 2008)
New Revision: 19255
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/DialectData.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
labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MVELDialectData.java
Log:
JBRULES-1535 User provided packages with the same name were merged/changed after calling RuleBase.addPackage
- AbstractRuleBase: Using MergedPackage to handle package merges.
- DialectData: added clone() method.
- DialectDatas: perform proper merge.
- JavaDialectData: implemented clone and perform proper merge.
- MVELDialectData: implemented clone.
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-26 18:47:10 UTC (rev 19254)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java 2008-03-26 21:21:04 UTC (rev 19255)
@@ -88,7 +88,7 @@
protected transient MapBackedClassLoader classLoader;
private transient Objenesis objenesis;
-
+
/** The fact handle factory. */
protected FactHandleFactory factHandleFactory;
@@ -276,7 +276,7 @@
}
/**
- * Creates Objenesis instance for the RuleBase.
+ * Creates Objenesis instance for the RuleBase.
* @return a standart Objenesis instanse with caching turned on.
*/
protected Objenesis createObjenesis() {
@@ -401,6 +401,15 @@
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
@@ -413,7 +422,7 @@
public synchronized void addPackage(final Package newPkg) {
newPkg.checkValidity();
synchronized ( this.pkgs ) {
- final Package pkg = (Package) this.pkgs.get( newPkg.getName() );
+ Package pkg = (Package) this.pkgs.get( newPkg.getName() );
// only acquire the lock if it hasn't been done explicitely
boolean doUnlock = false;
@@ -425,12 +434,19 @@
this.eventSupport.fireBeforePackageAdded( newPkg );
- if ( pkg != null ) {
+ 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 );
- } else {
- this.pkgs.put( newPkg.getName(),
- newPkg );
}
final Map newGlobals = newPkg.getGlobals();
@@ -511,7 +527,14 @@
newPkg );
}
}
- globals.putAll( newPkg.getGlobals() );
+ if (globals == Collections.EMPTY_MAP) {
+ for (Object object : newPkg.getGlobals().entrySet()) {
+ Map.Entry entry = (Map.Entry)object;
+ pkg.addGlobal((String)entry.getKey(), (Class)entry.getValue());
+ }
+ } else {
+ globals.putAll( newPkg.getGlobals() );
+ }
// add type declarations
for ( TypeDeclaration type : newPkg.getTypeDeclarations().values() ) {
@@ -777,16 +800,16 @@
this.packageClassLoader );
streamWithLoader.setRuleBase( this );
- final StatefulSession session = (StatefulSession) streamWithLoader.readObject();
+ final StatefulSession session = (StatefulSession) streamWithLoader.readObject();
synchronized ( this.pkgs ) {
((InternalWorkingMemory) session).setRuleBase( this );
((InternalWorkingMemory) session).setId( (nextWorkingMemoryCounter()) );
-
+
ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
- executor.setCommandExecutor( new CommandExecutor( session ) );
- ((InternalWorkingMemory) session).setExecutorService( executor );
+ executor.setCommandExecutor( new CommandExecutor( session ) );
+ ((InternalWorkingMemory) session).setExecutorService( executor );
if ( keepReference ) {
addStatefulSession( session );
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectData.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectData.java 2008-03-26 18:47:10 UTC (rev 19254)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectData.java 2008-03-26 21:21:04 UTC (rev 19255)
@@ -1,13 +1,15 @@
package org.drools.rule;
-public interface DialectData {
+public interface DialectData {
public void removeRule(Package pkg, Rule rule);
-
+
public void removeFunction(Package pkg, Function function);
-
+
public void merge(DialectData newData);
-
+
public boolean isDirty();
-
+
public void reload();
+
+ public DialectData clone();
}
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-26 18:47:10 UTC (rev 19254)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java 2008-03-26 21:21:04 UTC (rev 19255)
@@ -89,18 +89,16 @@
}
public void merge(DialectDatas newDatas) {
- for(Iterator it = newDatas.dialects.entrySet().iterator(); it.hasNext(); ) {
- Entry entry = ( Entry ) it.next();
- DialectData data = ( DialectData ) this.dialects.get( entry.getKey() );
- data.merge( ( DialectData ) entry.getValue() );
+ for (Entry<String, DialectData> entry : newDatas.dialects.entrySet()) {
+ DialectData data = this.dialects.get( entry.getKey() );
+ if (data == null) {
+ this.dialects.put(entry.getKey(), entry.getValue().clone());
+ } else {
+ data.merge( entry.getValue() );
+ }
}
- if ( this.lineMappings != null ) {
- // merge line mappings
- this.lineMappings.putAll( newDatas.getLineMappings() );
- } else {
- this.lineMappings = newDatas.getLineMappings();
- }
+ getLineMappings().putAll(newDatas.getLineMappings());
}
public boolean isDirty() {
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-26 18:47:10 UTC (rev 19254)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java 2008-03-26 21:21:04 UTC (rev 19255)
@@ -95,6 +95,13 @@
this.dirty = false;
}
+ public DialectData clone() {
+ DialectData cloneOne = new JavaDialectData();
+
+ cloneOne.merge(this);
+ return cloneOne;
+ }
+
public boolean isDirty() {
return this.dirty;
}
@@ -157,6 +164,12 @@
public void merge(DialectData newData) {
JavaDialectData newJavaData = (JavaDialectData) newData;
+ if (this.classLoader == null) {
+ this.classLoader = new PackageClassLoader(newJavaData.getClassLoader().getParent(), this);
+ }
+ // Add invokers
+ putAllInvokers( newJavaData.getInvokers() );
+
// 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();
@@ -165,8 +178,6 @@
newJavaData.read( files[i] ) );
}
- // Add invokers
- putAllInvokers( newJavaData.getInvokers() );
}
private void removeClasses(final ConditionalElement ce) {
@@ -207,6 +218,9 @@
public void write(final String resourceName,
final byte[] clazzData) throws RuntimeDroolsException {
+ if (this.store == null) {
+ this.store = new HashMap();
+ }
if ( this.store.put( resourceName,
clazzData ) != null ) {
// we are updating an existing class so reload();
@@ -333,6 +347,9 @@
}
public void putAllInvokers(final Map invokers) {
+ if (this.invokerLookups == null) {
+ this.invokerLookups = new HashMap();
+ }
this.invokerLookups.putAll( invokers );
}
Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MVELDialectData.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MVELDialectData.java 2008-03-26 18:47:10 UTC (rev 19254)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MVELDialectData.java 2008-03-26 21:21:04 UTC (rev 19255)
@@ -4,7 +4,6 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@@ -27,7 +26,13 @@
this.functionFactory = new MapFunctionResolverFactory();
}
- public MapFunctionResolverFactory getFunctionFactory() {
+ public DialectData clone() {
+ DialectData clone = new MVELDialectData();
+ clone.merge(this);
+ return clone;
+ }
+
+ public MapFunctionResolverFactory getFunctionFactory() {
return this.functionFactory;
}
More information about the jboss-svn-commits
mailing list