[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