[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