[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