[jboss-svn-commits] JBL Code SVN: r18911 - in labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools: reteoo and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Mar 12 22:04:11 EDT 2008


Author: mingjin
Date: 2008-03-12 22:04:10 -0400 (Wed, 12 Mar 2008)
New Revision: 18911

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/reteoo/ReteooBuilder.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/DroolsClassLoader.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/MapBackedClassLoader.java
Log:
Serializing DroolsClassLoader

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-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -57,6 +57,7 @@
 import org.drools.rule.Package;
 import org.drools.rule.JavaDialectData;
 import org.drools.rule.Rule;
+import org.drools.rule.DroolsClassLoader;
 import org.drools.spi.ExecutorServiceFactory;
 import org.drools.spi.FactHandleFactory;
 import org.drools.util.ObjectHashSet;
@@ -188,14 +189,14 @@
             droolsStream    = new DroolsObjectOutputStream(bytes);
         }
 
+        droolsStream.writeObject( this.pkgs );
+        droolsStream.writeObject( this.config );
         droolsStream.writeObject( this.classLoader.getStore() );
-        droolsStream.writeObject( this.pkgs );
 
         // Rules must be restored by an ObjectInputStream that can resolve using a given ClassLoader to handle seaprately by storing as
         // a byte[]
         droolsStream.writeObject( this.id );
         droolsStream.writeInt(workingMemoryCounter);
-        droolsStream.writeObject( this.config );
         droolsStream.writeObject( this.processes );
         droolsStream.writeObject( this.agendaGroupRuleTotals );
         droolsStream.writeObject( this.factHandleFactory );
@@ -234,15 +235,15 @@
 
             droolsStream    = new DroolsObjectInputStream(new ByteArrayInputStream(bytes));
         }
-        droolsStream.setRuleBase( this );
+        this.pkgs = (Map) droolsStream.readObject();
+        this.config = (RuleBaseConfiguration) droolsStream.readObject();
+
         Map store = (Map) droolsStream.readObject();
         this.packageClassLoader = new CompositePackageClassLoader( droolsStream.getClassLoader() );
         this.classLoader = new MapBackedClassLoader( this.packageClassLoader, store );
         this.packageClassLoader.addClassLoader( this.classLoader );
         this.objenesis = createObjenesis();
 
-        this.pkgs = (Map) droolsStream.readObject();
-
         for ( final Object object : this.pkgs.values()) {
             this.packageClassLoader.addClassLoader( ((Package) object).getDialectDatas().getClassLoader() );
         }
@@ -250,7 +251,6 @@
         this.id = (String) droolsStream.readObject();
         this.workingMemoryCounter   = droolsStream.readInt();
 
-        this.config = (RuleBaseConfiguration) droolsStream.readObject();
         this.config.setClassLoader( droolsStream.getClassLoader() );
 
         this.processes = (Map) droolsStream.readObject();

Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-03-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -305,6 +305,7 @@
         droolsStream.writeObject(rules);
         droolsStream.writeObject(idGenerator);
         droolsStream.writeBoolean(ordered);
+        droolsStream.writeObject(ruleBase);
         if (!isDrools) {
             bytes.close();
             out.writeObject(bytes.toByteArray());
@@ -328,7 +329,7 @@
         this.ordered        = in.readBoolean();
 
         // TODO: possible null for rule base.
-        this.ruleBase       = droolsStream.getRuleBase();
+        this.ruleBase       = (InternalRuleBase)droolsStream.readObject();
         this.ruleBuilder    = new ReteooRuleBuilder();
         if (!isDrools) {
             bytes.close();

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-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -1,15 +1,21 @@
 package org.drools.rule;
 
 import java.io.InputStream;
-import java.net.URL;
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class CompositePackageClassLoader extends ClassLoader implements DroolsClassLoader  {
+public class CompositePackageClassLoader extends ClassLoader implements DroolsClassLoader, Externalizable  {
 
-    private final List classLoaders = new ArrayList();
+    private List classLoaders  = new ArrayList();
 
+    public CompositePackageClassLoader() {
+    }
+
     public CompositePackageClassLoader(final ClassLoader parentClassLoader) {
         super( parentClassLoader );
     }
@@ -18,6 +24,14 @@
         this.classLoaders.add( classLoader );
     }
 
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        classLoaders    = (List)in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(classLoaders);
+    }
+
     public void removeClassLoader(final ClassLoader classLoader) {
         for ( final Iterator it = this.classLoaders.iterator(); it.hasNext(); ) {
             if ( it.next() == classLoader ) {

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-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DialectDatas.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -4,14 +4,11 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.drools.common.DroolsObjectInputStream;
-import org.drools.common.DroolsObjectOutputStream;
 import org.drools.common.DroolsObjectInput;
 
 public class DialectDatas implements Externalizable {
@@ -31,13 +28,7 @@
     }
 
     public DialectDatas(ClassLoader classLoader) {
-        if (classLoader == null) {
-            classLoader = Thread.currentThread().getContextClassLoader();
-            if ( classLoader == null ) {
-                classLoader = getClass().getClassLoader();
-            }
-        }
-        this.parentClassLoader = classLoader;
+        setParentClassLoader(classLoader);
         this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
         this.dialects = new HashMap<String, DialectData>();
     }
@@ -48,6 +39,8 @@
      *
      */
     public void writeExternal(final ObjectOutput stream) throws IOException {
+        stream.writeObject(this.classLoader);
+        stream.writeObject(this.parentClassLoader instanceof DroolsClassLoader ? this.parentClassLoader : null);
         stream.writeObject( this.lineMappings );
         stream.writeObject(this.dialects);
     }
@@ -60,18 +53,14 @@
      */
     public void readExternal(final ObjectInput stream) throws IOException,
                                                               ClassNotFoundException {
+        this.classLoader    = (CompositePackageClassLoader)stream.readObject();
+        setParentClassLoader((ClassLoader)stream.readObject());
+        if (stream instanceof DroolsObjectInput) {
+            ((DroolsObjectInput)stream).setClassLoader(this.classLoader);
+            ((DroolsObjectInput)stream).setDialectDatas(this);
+        }
         this.lineMappings = (Map) stream.readObject();
         this.dialects     = (Map<String, DialectData>)stream.readObject();
-        if (((DroolsObjectInputStream)stream).getClassLoader() instanceof CompositePackageClassLoader) {
-            this.classLoader        = (CompositePackageClassLoader)((DroolsObjectInputStream)stream).getClassLoader();
-            this.parentClassLoader  = this.classLoader.getParent();
-        }
-        else {
-            this.parentClassLoader  = ((DroolsObjectInputStream)stream).getClassLoader();
-            this.classLoader        = new CompositePackageClassLoader(this.parentClassLoader);
-        }
-
-        ((DroolsObjectInput)stream).setDialectDatas(this);
     }
 
     public void addDialectData(String dialect, DialectData dialectData) {
@@ -142,6 +131,12 @@
     }
 
     public void setParentClassLoader(ClassLoader classLoader) {
+        if (classLoader == null) {
+            classLoader = Thread.currentThread().getContextClassLoader();
+            if ( classLoader == null ) {
+                classLoader = getClass().getClassLoader();
+            }
+        }
         this.parentClassLoader = classLoader;
     }
 

Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java	2008-03-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -1,10 +1,11 @@
 package org.drools.rule;
 
 import java.io.InputStream;
+import java.io.Externalizable;
 
 public interface DroolsClassLoader {
-    
+
     InputStream getResourceAsStream(final String name);
-    
+
     public Class fastFindClass(final String name);
 }

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-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/JavaDialectData.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -90,7 +90,7 @@
 
     public JavaDialectData(final DialectDatas datas) {
         this.datas = datas;
-        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader() );
+        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader(), this );
         this.datas.addClassLoader( this.classLoader );
         this.invokerLookups = new HashMap();
         this.store = new HashMap();
@@ -111,9 +111,11 @@
             stream  = new DroolsObjectOutputStream(stream);
         }
         stream.writeObject( this.datas );
+        stream.writeObject( classLoader );
         stream.writeObject( this.store );
         stream.writeObject( this.AST );
         stream.writeObject( this.invokerLookups );
+        stream.writeBoolean( this.dirty );
     }
 
     /**
@@ -128,12 +130,15 @@
                           ? (DroolsObjectInputStream)stream
                           : new DroolsObjectInputStream(stream);
         this.datas = (DialectDatas)droolsStream.readObject();
-        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader() );
+        this.classLoader = (PackageClassLoader)droolsStream.readObject();
         this.datas.addClassLoader( this.classLoader );
         this.store = (Map) stream.readObject();
         this.AST = stream.readObject();
+        if (droolsStream.getClassLoader() instanceof CompositePackageClassLoader) {
+            ((CompositePackageClassLoader)droolsStream.getClassLoader()).addClassLoader(classLoader);
+        }
         this.invokerLookups = (Map) droolsStream.readObject();
-        this.dirty  = true;
+        this.dirty  = droolsStream.readBoolean();
     }
 
     public ClassLoader getClassLoader() {
@@ -255,11 +260,11 @@
 
     /**
      * This class drops the classLoader and reloads it. During this process  it must re-wire all the invokeables.
-     * @throws CheckedDroolsException
+     * @throws RuntimeDroolsException
      */
     public void reload() throws RuntimeDroolsException {
         // drops the classLoader and adds a new one
-        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader() );
+        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader(), this );
         this.datas.addClassLoader( this.classLoader );
 
         // Wire up invokers
@@ -358,19 +363,32 @@
      * @author mproctor
      *
      */
-    public class PackageClassLoader extends ClassLoader
+    public static class PackageClassLoader extends ClassLoader
         implements
-        DroolsClassLoader {
+        DroolsClassLoader, Externalizable {
+        private JavaDialectData parent;
 
-        public PackageClassLoader(final ClassLoader parentClassLoader) {
+        public PackageClassLoader() {
+        }
+
+        public PackageClassLoader(final ClassLoader parentClassLoader, JavaDialectData parent) {
             super( parentClassLoader );
+            this.parent = parent;
         }
 
+        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            parent  = (JavaDialectData)in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(parent);
+        }
+
         public Class fastFindClass(final String name) {
             final Class clazz = findLoadedClass( name );
 
-            if ( clazz == null ) {
-                final byte[] clazzBytes = read( convertClassToResourcePath( name ) );
+            if ( clazz == null && parent != null) {
+                final byte[] clazzBytes = parent.read( convertClassToResourcePath( name ) );
                 if ( clazzBytes != null ) {
                     return defineClass( name,
                                         clazzBytes,
@@ -420,7 +438,7 @@
 
 
         public InputStream getResourceAsStream(final String name) {
-            final byte[] bytes = (byte[]) JavaDialectData.this.store.get( name );
+            final byte[] bytes = (byte[]) parent.store.get( name );
             if ( bytes != null ) {
                 return new ByteArrayInputStream( bytes );
             } else {

Modified: labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
===================================================================
--- labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-03-13 01:44:55 UTC (rev 18910)
+++ labs/jbossrules/branches/ming-serialization/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-03-13 02:04:10 UTC (rev 18911)
@@ -3,16 +3,20 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.Serializable;
+import java.io.ObjectInput;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.ProtectionDomain;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
 
 public class MapBackedClassLoader extends ClassLoader
     implements
-    DroolsClassLoader,
-    Serializable {
+    DroolsClassLoader, Externalizable {
 
     private static final long             serialVersionUID = 400L;
 
@@ -28,6 +32,9 @@
         } );
     }
 
+    public MapBackedClassLoader() {
+    }
+
     public MapBackedClassLoader(final ClassLoader parentClassLoader) {
         super( parentClassLoader );
         this.store = new HashMap();
@@ -39,6 +46,14 @@
         this.store = store;
     }
 
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        store    = (Map)in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(store);
+    }
+
     public void addResource(String className,
                             byte[] bytes) {
         addClass( className,




More information about the jboss-svn-commits mailing list