[jboss-svn-commits] JBL Code SVN: r19163 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 20 14:57:07 EDT 2008


Author: mingjin
Date: 2008-03-20 14:57:07 -0400 (Thu, 20 Mar 2008)
New Revision: 19163

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LargeRuleBaseSerializationTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
Log:
JBRULES-1488 optimization to reduce stack usage
- DroolsObjectInputStream: moved all object reading code into readObject().
- DroolsObjectOutputStream: moved all object writing code into writeObjectOrReference().
- BetaNode: moved super.read/writeExternal to last.
- Rete: moved stack intensive calls back.
- ReteooRuleBase: moved stack intensive calls back.
- LargeRuleBaseSerializationTest: increased number of rules to 1000.

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LargeRuleBaseSerializationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LargeRuleBaseSerializationTest.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LargeRuleBaseSerializationTest.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -3,7 +3,6 @@
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.PackageBuilder;
 import org.drools.lang.descr.PackageDescr;
-import org.drools.rule.*;
 import org.drools.rule.Package;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
@@ -17,7 +16,7 @@
  * Settings | File Templates.
  */
 public class LargeRuleBaseSerializationTest extends TestCase {
-    private static final int    RULE_COUNT  = 200;
+    private static final int    RULE_COUNT  = 1000;
 
     public void testLargeRuleBase() throws Exception{
         System.out.println("Generating "+RULE_COUNT+" rules");
@@ -39,7 +38,6 @@
         rb.addPackage(pkg);
 
         rb  = SerializationHelper.serializeObject(rb);
-
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -221,51 +221,85 @@
             case RT_EMPTY_MAP:
                 return readEmptyMap();
             default:
-                return readObject(type);
-        }
-    }
+                int handle = readHandle();
 
-    private Object readObject(byte type) throws IOException, ClassNotFoundException {
-        int handle = readHandle();
-
-        switch (type) {
-            case RT_EXTERNALIZABLE:
-                return readExternalizable(handle);
-            case RT_STRING:
-                return readString(handle);
-            case RT_MAP:
-                return readMap(handle);
-            case RT_COLLECTION:
-                return readCollection(handle);
-            case RT_ARRAY:
-                return readArray(handle);
-            case RT_CLASS:
-                return readClass(handle);
-            case RT_REFERENCE:
-                return readReference(handle);
-            case RT_ATOMICREFERENCEARRAY:
-                return readAtomicReferenceArray(handle);
-            case RT_SERIALIZABLE:
-                return readSerializable(handle);
-            default:
-                throw new StreamCorruptedException("Unsupported object type: " + type);
+                switch (type) {
+                    case RT_EXTERNALIZABLE: {
+                        Class clazz = (Class) readObject();
+                        Externalizable externalizable;
+                        try {
+                            externalizable = (Externalizable) clazz.newInstance();
+                        } catch (InstantiationException e) {
+                            throw newInvalidClassException(clazz, e);
+                        } catch (IllegalAccessException e) {
+                            throw newInvalidClassException(clazz, e);
+                        }
+                        registerObject(handle, externalizable);
+                        externalizable.readExternal(this);
+                        return externalizable;
+                    }
+                    case RT_STRING:
+                        return readString(handle);
+                    case RT_MAP: {
+                        Class clazz = (Class) readObject();
+                        int size = dataInput.readInt();
+                        Map<Object, Object> map = (Map<Object, Object>) newCollection(handle, clazz, size);
+                        while (size-- > 0) {
+                            Object key = readObject();
+                            Object value = readObject();
+                            map.put(key, value);
+                        }
+                        return map;
+                    }
+                    case RT_COLLECTION: {
+                        Class clazz = (Class) readObject();
+                        int size = dataInput.readInt();
+                        Collection<Object> collection = (Collection<Object>) newCollection(handle, clazz, size);
+                        while (size-- > 0) {
+                            collection.add(readObject());
+                        }
+                        return collection;
+                    }
+                    case RT_ARRAY: {
+                        Class clazz = (Class) readObject();
+                        int length = dataInput.readInt();
+                        Class componentType = clazz.getComponentType();
+                        Object array = Array.newInstance(componentType, length);
+                        registerObject(handle, array);
+                        if (componentType.isPrimitive()) {
+                            readPrimitiveArray(array, length, componentType);
+                        } else {
+                            Object[] objects    = (Object[])array;
+                            for (int i = 0; i < length; ++i) {
+                                objects[i] = readObject();
+                            }
+                        }
+                        return array;
+                    }
+                    case RT_CLASS:
+                        return readClass(handle);
+                    case RT_REFERENCE:
+                        return readReference(handle);
+                    case RT_ATOMICREFERENCEARRAY: {
+                        int length  = dataInput.readInt();
+                        AtomicReferenceArray<Object>    array   = new AtomicReferenceArray<Object>(length);
+                        registerObject(handle, array);
+                        for (int i = 0; i < length; ++i) {
+                            array.set(i, readObject());
+                        }
+                        return array;
+                    }
+                    case RT_SERIALIZABLE: {
+                        Object  object  =  dataInput.readObject();
+                        registerObject(handle, object);
+                        return object;
+                    }
+                    default:
+                        throw new StreamCorruptedException("Unsupported object type: " + type);
+                }
         }
     }
 
-    private Object readArray(int handle) throws IOException, ClassNotFoundException {
-        Class clazz = (Class) readObject();
-        int length = dataInput.readInt();
-        Class componentType = clazz.getComponentType();
-        Object array = Array.newInstance(componentType, length);
-        registerObject(handle, array);
-        if (componentType.isPrimitive()) {
-            readPrimitiveArray(array, length, componentType);
-        } else {
-            readObjectArray((Object[]) array, length);
-        }
-        return array;
-    }
-
     private void readPrimitiveArray(Object array, int length, Class clazz) throws IOException {
         if (clazz == Integer.TYPE) {
             readIntArray((int[]) array, length);
@@ -334,12 +368,6 @@
         }
     }
 
-    private void readObjectArray(Object[] objects, int length) throws IOException, ClassNotFoundException {
-        for (int i = 0; i < length; ++i) {
-            objects[i] = readObject();
-        }
-    }
-
     private static Object readNull() {
         return null;
     }
@@ -356,66 +384,12 @@
         return Collections.EMPTY_MAP;
     }
 
-    private Object readSerializable(int handle) throws ClassNotFoundException, IOException {
-        Object  object  =  dataInput.readObject();
-        registerObject(handle, object);
-        return object;
-    }
-
-    private Object readExternalizable(int handle) throws ClassNotFoundException, IOException {
-        Class clazz = (Class) readObject();
-        Externalizable externalizable;
-        try {
-            externalizable = (Externalizable) clazz.newInstance();
-        } catch (InstantiationException e) {
-            throw newInvalidClassException(clazz, e);
-        } catch (IllegalAccessException e) {
-            throw newInvalidClassException(clazz, e);
-        }
-        registerObject(handle, externalizable);
-        externalizable.readExternal(this);
-        return externalizable;
-    }
-
     private String readString(int handle) throws IOException {
         String string = dataInput.readUTF();
         registerObject(handle, string);
         return string;
     }
 
-    private AtomicReferenceArray<Object> readAtomicReferenceArray(int handle)
-            throws IOException, ClassNotFoundException {
-        int length  = dataInput.readInt();
-        AtomicReferenceArray<Object>    array   = new AtomicReferenceArray<Object>(length);
-        registerObject(handle, array);
-        for (int i = 0; i < length; ++i) {
-            array.set(i, readObject());
-        }
-        return array;
-    }
-
-    private Map readMap(int handle) throws IOException, ClassNotFoundException {
-        Class clazz = (Class) readObject();
-        int size = dataInput.readInt();
-        Map<Object, Object> map = (Map<Object, Object>) newCollection(handle, clazz, size);
-        for (int i = 0; i < size; ++i) {
-            Object key = readObject();
-            Object value = readObject();
-            map.put(key, value);
-        }
-        return map;
-    }
-
-    private Collection readCollection(int handle) throws IOException, ClassNotFoundException {
-        Class clazz = (Class) readObject();
-        int size = dataInput.readInt();
-        Collection<Object> collection = (Collection<Object>) newCollection(handle, clazz, size);
-        for (int i = 0; i < size; ++i) {
-            collection.add(readObject());
-        }
-        return collection;
-    }
-
     private Object newCollection(int handle, Class clazz, int size) throws IOException {
         Object collection;
         try {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -7,7 +7,6 @@
 import java.io.OutputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
-import java.io.ByteArrayOutputStream;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.IdentityHashMap;
@@ -37,49 +36,6 @@
         writeRecordType(RT_NULL);
     }
 
-    private void writeObjectOrReference(Object object, Class clazz) throws IOException {
-        int handle = registerObject(object);
-        if (handle < 0) {
-            writeObject(object, clazz, -handle);
-        } else {
-            writeReference(handle);
-        }
-    }
-
-    private void writeObject(Object object, Class clazz, int handle) throws IOException {
-        if (Externalizable.class.isAssignableFrom(clazz)) {
-            writeExternalizable((Externalizable) object, clazz, handle);
-        } else if (String.class.isAssignableFrom(clazz)) {
-            writeString((String) object, handle);
-        } else if (Map.class.isAssignableFrom(clazz)) {
-            writeMap((Map) object, clazz, handle);
-        } else if (Collection.class.isAssignableFrom(clazz)) {
-            writeCollection((Collection) object, clazz, handle);
-        } else if (clazz == Class.class) {
-            writeClass((Class) object, handle);
-        } else if (clazz.isArray()) {
-            writeArray(object, clazz, handle);
-        } else if (AtomicReferenceArray.class.isAssignableFrom(clazz)) {
-            writeAtomicReferenceArray((AtomicReferenceArray)object, handle);
-        } else if (Serializable.class.isAssignableFrom(clazz)) {
-            writeSerializable((Serializable) object, handle);
-        } else {
-            throw new NotSerializableException("Unsupported class: " + clazz);
-        }
-    }
-
-    private void writeArray(Object array, Class clazz, int handle) throws IOException {
-        writeRecordType(RT_ARRAY);
-        writeHandle(handle);
-        writeObject(clazz);
-        Class componentType = clazz.getComponentType();
-        if (componentType.isPrimitive()) {
-            writePrimitiveArray(array, componentType);
-        } else {
-            writeObjectArray((Object[]) array);
-        }
-    }
-
     private void writePrimitiveArray(Object array, Class clazz) throws IOException {
         if (clazz == Integer.TYPE) {
             writeIntArray(array);
@@ -172,18 +128,10 @@
         }
     }
 
-    private void writeObjectArray(Object[] objects) throws IOException {
-        int length = objects.length;
-        writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeObject(objects[i]);
-        }
-    }
-
     private void writeClass(Class clazz, int handle) throws IOException {
         writeRecordType(RT_CLASS);
         writeHandle(handle);
-        writeObjectOrReference(clazz.getName(), String.class);
+        writeObject(clazz.getName());
     }
 
     private void writeString(String string, int handle) throws IOException {
@@ -192,54 +140,6 @@
         writeUTF(string);
     }
 
-    private void writeReference(int handle) throws IOException {
-        writeRecordType(RT_REFERENCE);
-        writeHandle(handle);
-    }
-
-    private void writeExternalizable(Externalizable externalizable, Class clazz, int handle) throws IOException {
-        writeRecordType(RT_EXTERNALIZABLE);
-        writeHandle(handle);
-        writeObject(clazz);
-        externalizable.writeExternal(this);
-    }
-
-    private void writeSerializable(Serializable serializable, int handle) throws IOException {
-        writeRecordType(RT_SERIALIZABLE);
-        writeHandle(handle);
-        dataOutput.writeObject(serializable);
-    }
-
-    private void writeAtomicReferenceArray(AtomicReferenceArray array, int handle) throws IOException {
-        writeRecordType(RT_ATOMICREFERENCEARRAY);
-        writeHandle(handle);
-        writeInt(array.length());
-        for (int i = 0; i < array.length(); i++)
-            writeObject(array.get(i));
-    }
-
-    private void writeMap(Map map, Class clazz, int handle) throws IOException {
-        writeRecordType(RT_MAP);
-        writeHandle(handle);
-        writeObject(clazz);
-        writeInt(map.size());
-        for (Object object : map.entrySet()) {
-            Map.Entry entry = (Map.Entry) object;
-            writeObject(entry.getKey());
-            writeObject(entry.getValue());
-        }
-    }
-
-    private void writeCollection(Collection collection, Class clazz, int handle) throws IOException {
-        writeRecordType(RT_COLLECTION);
-        writeHandle(handle);
-        writeObject(clazz);
-        writeInt(collection.size());
-        for (Object object : collection) {
-            writeObject(object);
-        }
-    }
-
     private void writeEmptySet() throws IOException {
         writeRecordType(RT_EMPTY_SET);
     }
@@ -297,10 +197,74 @@
                 writeEmptyList();
             } else if (clazz == EMPTY_MAP_CLASS) {
                 writeEmptyMap();
-            } else if (clazz == String.class) {
-                writeObjectOrReference(((String) object).intern(), clazz);
             } else {
-                writeObjectOrReference(object, clazz);
+                if (clazz == String.class)
+                    object  = ((String)object).intern();
+                int handle = registerObject(object);
+                if (handle < 0) {
+                    handle  = -handle;
+                    if (Externalizable.class.isAssignableFrom(clazz)) {
+                        writeRecordType(RT_EXTERNALIZABLE);
+                        writeHandle(handle);
+                        writeObject(clazz);
+                        ((Externalizable)object).writeExternal(this);
+                    } else if (String.class.isAssignableFrom(clazz)) {
+                        writeString((String) object, handle);
+                    } else if (Map.class.isAssignableFrom(clazz)) {
+                        Map map = (Map)object;
+                        writeRecordType(RT_MAP);
+                        writeHandle(handle);
+                        writeObject(clazz);
+                        writeInt(map.size());
+                        for (Object obj : map.entrySet()) {
+                            Map.Entry entry = (Map.Entry) obj;
+                            writeObject(entry.getKey());
+                            writeObject(entry.getValue());
+                        }
+                    } else if (Collection.class.isAssignableFrom(clazz)) {
+                        Collection collection   = (Collection)object;
+                        writeRecordType(RT_COLLECTION);
+                        writeHandle(handle);
+                        writeObject(clazz);
+                        writeInt(collection.size());
+                        for (Object obj : collection) {
+                            writeObject(obj);
+                        }
+                    } else if (clazz == Class.class) {
+                        writeClass((Class) object, handle);
+                    } else if (clazz.isArray()) {
+                        writeRecordType(RT_ARRAY);
+                        writeHandle(handle);
+                        writeObject(clazz);
+                        Class componentType = clazz.getComponentType();
+                        if (componentType.isPrimitive()) {
+                            writePrimitiveArray(object, componentType);
+                        } else {
+                            Object[]    array = (Object[])object;
+                            int length = array.length;
+                            writeInt(length);
+                            for (int i = 0; i < length; ++i) {
+                                writeObject(array[i]);
+                            }
+                        }
+                    } else if (AtomicReferenceArray.class.isAssignableFrom(clazz)) {
+                        AtomicReferenceArray array  = (AtomicReferenceArray)object;
+                        writeRecordType(RT_ATOMICREFERENCEARRAY);
+                        writeHandle(handle);
+                        writeInt(array.length());
+                        for (int i = 0; i < array.length(); i++)
+                            writeObject(array.get(i));
+                    } else if (Serializable.class.isAssignableFrom(clazz)) {
+                        writeRecordType(RT_SERIALIZABLE);
+                        writeHandle(handle);
+                        dataOutput.writeObject(object);
+                    } else {
+                        throw new NotSerializableException("Unsupported class: " + clazz);
+                    }
+                } else {
+                    writeRecordType(RT_REFERENCE);
+                    writeHandle(handle);
+                }
             }
         }
         flush();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -101,29 +101,29 @@
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
+        constraints   = (BetaConstraints)in.readObject();
         leftInput   = (LeftTupleSource)in.readObject();
         rightInput   = (ObjectSource)in.readObject();
-        constraints   = (BetaConstraints)in.readObject();
         previousTupleSinkNode   = (LeftTupleSinkNode)in.readObject();
         nextTupleSinkNode   = (LeftTupleSinkNode)in.readObject();
         previousObjectSinkNode   = (ObjectSinkNode)in.readObject();
         nextObjectSinkNode   = (ObjectSinkNode)in.readObject();
         objectMemory    = in.readBoolean();
         tupleMemoryEnabled  = in.readBoolean();
+        super.readExternal(in);
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
+        out.writeObject(constraints);
         out.writeObject(leftInput);
         out.writeObject(rightInput);
-        out.writeObject(constraints);
         out.writeObject(previousTupleSinkNode);
         out.writeObject(nextTupleSinkNode);
         out.writeObject(previousObjectSinkNode);
         out.writeObject(nextObjectSinkNode);
         out.writeBoolean(objectMemory);
         out.writeBoolean(tupleMemoryEnabled);
+        super.writeExternal(out);
     }
 
     public BetaNodeFieldConstraint[] getConstraints() {
@@ -149,7 +149,7 @@
         this.rightInput.networkUpdated();
         this.leftInput.networkUpdated();
     }
-    
+
     public List getRules() {
         final List list = new ArrayList();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -164,7 +164,7 @@
     public void networkUpdated() {
         // nothing to do
     }
-    
+
     protected void doRemove(final RuleRemovalContext context,
                             final ReteooBuilder builder,
                             final BaseNode node,
@@ -225,14 +225,14 @@
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
         out.writeObject(entryPoints);
         out.writeObject(ruleBase);
+        super.writeExternal(out);
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
         entryPoints = (Map<EntryPoint, EntryPointNode>) in.readObject();
         ruleBase    = (InternalRuleBase)in.readObject();
+        super.readExternal(in);
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-03-20 17:57:40 UTC (rev 19162)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-03-20 18:57:07 UTC (rev 19163)
@@ -131,6 +131,10 @@
         super( id,
                config,
                factHandleFactory );
+        setupRete();
+    }
+
+    private void setupRete() {
         this.rete = new Rete( this );
         this.reteooBuilder = new ReteooBuilder( this );
 
@@ -139,7 +143,6 @@
                                                  this.rete,
                                                  EntryPoint.DEFAULT );
         epn.attach();
-
     }
 
     /**
@@ -149,8 +152,8 @@
      */
     public void writeExternal(final ObjectOutput stream) throws IOException {
         super.writeExternal( stream );
+        stream.writeObject(this.reteooBuilder);
         stream.writeObject(this.rete);
-        stream.writeObject(this.reteooBuilder);
     }
 
     /**
@@ -162,8 +165,8 @@
     public void readExternal(final ObjectInput stream) throws IOException,
                                                       ClassNotFoundException {
         super.readExternal( stream );
+        this.reteooBuilder = (ReteooBuilder) stream.readObject();
         this.rete = (Rete) stream.readObject();
-        this.reteooBuilder = (ReteooBuilder) stream.readObject();
     }
 
     // ------------------------------------------------------------




More information about the jboss-svn-commits mailing list