[jboss-svn-commits] JBL Code SVN: r17377 - in labs/jbossrules/branches/serialization: drools-compiler/src/test/java/org/drools/compiler and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Dec 23 01:22:56 EST 2007


Author: haruki_zaemon
Date: 2007-12-23 01:22:55 -0500 (Sun, 23 Dec 2007)
New Revision: 17377

Added:
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectStreamConstants.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/Resolvable.java
Modified:
   labs/jbossrules/branches/serialization/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/branches/serialization/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/agent/FileScanner.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/spi/Extractor.java
   labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/util/BinaryRuleBaseLoader.java
   labs/jbossrules/branches/serialization/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
   labs/jbossrules/branches/serialization/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
Log:
[NEW] Custom serialization mechanism. WARNING: Failing tests!!!


Modified: labs/jbossrules/branches/serialization/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/branches/serialization/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2007-12-23 06:22:55 UTC (rev 17377)
@@ -4,7 +4,7 @@
 
 
         java.io.InputStream is = @{ruleClassName}.class.getClassLoader().getResourceAsStream( "@{package}.@{ruleClassName}".replace( '.', '/' ) + ".class" );
-                
+
         java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
         byte[] data = new byte[1024];
         int byteCount;
@@ -12,21 +12,21 @@
             while ( (byteCount = is.read( data,
                                  0,
                                  1024 )) > -1 )
-            {                    
+            {
                 bos.write(data, 0, byteCount);
             }
         } catch ( java.io.IOException e ) {
             throw new org.drools.RuntimeDroolsException("Unable getResourceAsStream for Class '@{ruleClassName}' ");
-        }               
-        
+        }
+
         org.drools.asm.ClassReader classReader = new org.drools.asm.ClassReader( bos.toByteArray() );
         classReader.accept( visit, true );
         org.drools.asm.util.TraceMethodVisitor trace = visit.getTrace();
-        return trace.getText();     
+        return trace.getText();
     }
 >>=::
-    
 
+
 equals() ::=<<
     public boolean equals(Object object) {
         if (object == null ) {
@@ -34,13 +34,13 @@
         } else if ( object == this ){
             return true;
         }
-        
+
         if ( ! (object instanceof org.drools.spi.CompiledInvoker) ) {
             return false;
         }
-        
+
         org.drools.spi.CompiledInvoker other = ( org.drools.spi.CompiledInvoker ) object;
-        
+
         return org.drools.util.asm.MethodComparator.compareBytecode( getMethodBytecode(), other.getMethodBytecode() );
     }
 >>=::
@@ -57,15 +57,15 @@
 public class @{invokerClassName} implements org.drools.spi.ReturnValueExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
-    
+
     public org.drools.spi.FieldValue evaluate(java.lang.Object object,
                             org.drools.spi.Tuple tuple,
-                            org.drools.rule.Declaration[] previousDeclarations, 
-                            org.drools.rule.Declaration[] localDeclarations, 
-                            org.drools.WorkingMemory workingMemory) throws Exception {                               
+                            org.drools.rule.Declaration[] previousDeclarations,
+                            org.drools.rule.Declaration[] localDeclarations,
+                            org.drools.WorkingMemory workingMemory) throws Exception {
 
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
-        @end{}                
+        @end{}
         @if{readLocalsFromTuple}
           @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( localDeclarations[@{i0}] ) ).getObject() );
           @end{}
@@ -75,22 +75,22 @@
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
-        
-        return @{ruleClassName}.@{methodName}( 
-            @foreach{declarations as declr} @{declr.identifier} 
-            @end{","}  @if{localDeclarations != empty && declarations != empty}, at end{}       
-            @foreach{localDeclarations as declr} @{declr.identifier} 
+
+        return @{ruleClassName}.@{methodName}(
+            @foreach{declarations as declr} @{declr.identifier}
+            @end{","}  @if{localDeclarations != empty && declarations != empty}, at end{}
+            @foreach{localDeclarations as declr} @{declr.identifier}
             @end{","}@if{globals != empty && (localDeclarations != empty || declarations != empty)}, at end{}
             @foreach{globals as identifier}@{identifier}
             @end{","} );
-    }    
-    
+    }
+
     @includeByRef{hashCode(hashCode = hashCode)}
-    
+
     @includeByRef{getMethodBytecode(package = package, ruleClassName = ruleClassName, methodName = methodName)}
-    
-    @includeByRef{equals()}       
-}     
+
+    @includeByRef{equals()}
+}
 >>=::
 
 predicateInvoker() ::=<<
@@ -99,35 +99,35 @@
 public class @{invokerClassName} implements org.drools.spi.PredicateExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
-    
+
     public boolean evaluate(java.lang.Object object,
                             org.drools.spi.Tuple tuple,
-                            org.drools.rule.Declaration[] previousDeclarations, 
-                            org.drools.rule.Declaration[] localDeclarations, 
-                            org.drools.WorkingMemory workingMemory) throws Exception {                               
+                            org.drools.rule.Declaration[] previousDeclarations,
+                            org.drools.rule.Declaration[] localDeclarations,
+                            org.drools.WorkingMemory workingMemory) throws Exception {
 
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) previousDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( previousDeclarations[@{i0}] ) ).getObject() );
-        @end{}                
+        @end{}
         @foreach{localDeclarationTypes, localDeclarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) localDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, object );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
-        
-        return @{ruleClassName}.@{methodName}( 
-            @foreach{declarations as declr} @{declr.identifier} 
-            @end{","}  @if{localDeclarations != empty && declarations != empty}, at end{}       
-            @foreach{localDeclarations as declr} @{declr.identifier} 
+
+        return @{ruleClassName}.@{methodName}(
+            @foreach{declarations as declr} @{declr.identifier}
+            @end{","}  @if{localDeclarations != empty && declarations != empty}, at end{}
+            @foreach{localDeclarations as declr} @{declr.identifier}
             @end{","}@if{globals != empty && (localDeclarations != empty || declarations != empty)}, at end{}
             @foreach{globals as identifier}@{identifier}
             @end{","} );
-    }    
-    
+    }
+
     @includeByRef{hashCode(hashCode = hashCode)}
-    
+
     @includeByRef{getMethodBytecode(package = package, ruleClassName = ruleClassName, methodName = methodName)}
-    
-    @includeByRef{equals()}       
-}     
+
+    @includeByRef{equals()}
+}
 >>=::
 
 evalInvoker() ::=<<
@@ -136,29 +136,29 @@
 public class @{invokerClassName} implements org.drools.spi.EvalExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
-    
+
     public boolean evaluate(org.drools.spi.Tuple tuple,
-                            org.drools.rule.Declaration[] declarations, 
-                            org.drools.WorkingMemory workingMemory) throws Exception {                             
+                            org.drools.rule.Declaration[] declarations,
+                            org.drools.WorkingMemory workingMemory) throws Exception {
 
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) tuple.get( declarations[@{i0}] ) ).getObject() );
-        @end{}                
+        @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
         @end{}
-        
-        return @{ruleClassName}.@{methodName}( 
-            @foreach{declarations as declr} @{declr.identifier} 
+
+        return @{ruleClassName}.@{methodName}(
+            @foreach{declarations as declr} @{declr.identifier}
             @end{","} @if{globals != empty && declarations != empty}, at end{}
             @foreach{globals as identifier}@{identifier}
             @end{","} );
-    }    
-    
+    }
+
     @includeByRef{hashCode(hashCode = hashCode)}
-    
+
     @includeByRef{getMethodBytecode(package = package, ruleClassName = ruleClassName, methodName = methodName)}
-    
-    @includeByRef{equals()}       
-}     
+
+    @includeByRef{equals()}
+}
 >>=::
 
 accumulateInvoker() ::=<<
@@ -171,11 +171,11 @@
 public class @{invokerClassName} implements org.drools.spi.Accumulator, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
-    
+
     public Object createContext() {
         return new @{ruleClassName}.@{className}();
     }
-    
+
     public void init(java.lang.Object workingMemoryContext,
                      java.lang.Object context,
                      org.drools.spi.Tuple leftTuple,
@@ -184,12 +184,12 @@
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
-        @end{}    
-        
+        @end{}
+
         ((@{ruleClassName}.@{className})context).init(
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
 	        @foreach{globals as identifier} @{identifier}@end{","} );
-        
+
     }
 
     public void accumulate(java.lang.Object workingMemoryContext,
@@ -202,7 +202,7 @@
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
-        @end{}    
+        @end{}
         @if{isMultiPattern}
           @foreach{innerDeclarations as declr} @{declr.extractor.extractToClassName} @{declr.identifier} = (@{declr.extractor.extractToClassName}) innerDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( innerDeclarations[@{i0}] ) ).getObject() );
           @end{}
@@ -213,7 +213,7 @@
         ((@{ruleClassName}.@{className})context).accumulate(
             workingMemory,
             innerDeclarations,
-            handle.getObject()@if{declarations != empty}, at end{} 
+            handle.getObject()@if{declarations != empty}, at end{}
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
 	        @foreach{globals as identifier} @{identifier}@end{","}@if{innerDeclarations != empty}, at end{}
             @foreach{innerDeclarations as declr} @{declr.identifier}@end{","});
@@ -229,7 +229,7 @@
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
-        @end{}    
+        @end{}
         @if{isMultiPattern}
           @foreach{innerDeclarations as declr} @{declr.extractor.extractToClassName} @{declr.identifier} = (@{declr.extractor.extractToClassName}) innerDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( innerDeclarations[@{i0}] ) ).getObject() );
           @end{}
@@ -237,11 +237,11 @@
           @foreach{innerDeclarations as declr} @{declr.extractor.extractToClassName} @{declr.identifier} = (@{declr.extractor.extractToClassName}) innerDeclarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, handle.getObject() );
           @end{}
         @end{}
-        
+
         ((@{ruleClassName}.@{className})context).reverse(
             workingMemory,
             innerDeclarations,
-            handle.getObject()@if{declarations != empty}, at end{} 
+            handle.getObject()@if{declarations != empty}, at end{}
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
 	        @foreach{globals as identifier} @{identifier}@end{","}@if{innerDeclarations != empty}, at end{}
             @foreach{innerDeclarations as declr} @{declr.identifier}@end{","});
@@ -255,13 +255,13 @@
         @foreach{declarationTypes, declarations as type, declr} @{type} @{declr.identifier} = ( @{type} ) declarations[@{i0}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, ( (org.drools.common.InternalFactHandle) leftTuple.get( declarations[@{i0}] ) ).getObject() );
         @end{}
         @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
-        @end{}    
-        
+        @end{}
+
         return ((@{ruleClassName}.@{className})context).getResult(
             @foreach{declarations as declr} @{declr.identifier}@end{","}@if{globals != empty}, at end{}
 	        @foreach{globals as identifier} @{identifier}@end{","} );
     }
-    
+
     public boolean supportsReverse() {
         return @{supportsReverse};
     }
@@ -269,14 +269,14 @@
     public Object createWorkingMemoryContext() {
         return null;
     }
-    
+
     @includeByRef{hashCode(hashCode = hashCode)}
-    
-    @includeByRef{equals()}       
 
+    @includeByRef{equals()}
+
     public java.util.List getMethodBytecode() {
         java.io.InputStream is = @{ruleClassName}.class.getClassLoader().getResourceAsStream( "@{package}.@{ruleClassName}".replace( '.', '/' ) + "$@{className}" + ".class" );
-                
+
         java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
         byte[] data = new byte[1024];
         int byteCount;
@@ -284,48 +284,52 @@
             while ( (byteCount = is.read( data,
                                  0,
                                  1024 )) > -1 )
-            {                    
+            {
                 bos.write(data, 0, byteCount);
             }
         } catch ( java.io.IOException e ) {
             throw new org.drools.RuntimeDroolsException("Unable getResourceAsStream for Class '@{ruleClassName}$@{className}' ");
-        }               
-        return Collections.singletonList( bos );     
+        }
+        return Collections.singletonList( bos );
     }
-}     
+}
 >>=::
 
 consequenceInvoker() ::=<<
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.Consequence
+public class @{invokerClassName} implements org.drools.spi.Consequence, java.io.Externalizable
 {
-    private static final long serialVersionUID  = 400L;
+    public void evaluate(org.drools.spi.KnowledgeHelper knowledgeHelper,
+                         org.drools.WorkingMemory workingMemory) throws Exception {
 
-    public void evaluate(org.drools.spi.KnowledgeHelper knowledgeHelper,
-                         org.drools.WorkingMemory workingMemory) throws Exception {    
-                       
         org.drools.spi.Tuple tuple = knowledgeHelper.getTuple();
         org.drools.rule.Rule rule = knowledgeHelper.getRule();
-        org.drools.rule.Declaration[] declarations = rule.getDeclarations();                                                  
+        org.drools.rule.Declaration[] declarations = rule.getDeclarations();
 
         @foreach{declarationTypes, declarations, indexes, notPatterns as type, declr, index, notPattern}
-          org.drools.common.InternalFactHandle @{declr.identifier}__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[@{index}].getIdentifier() ) );        
+          org.drools.common.InternalFactHandle @{declr.identifier}__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[@{index}].getIdentifier() ) );
           @{type} @{declr.identifier} = ( @{type} )  declarations[@{index}].@{declr.nativeReadMethod.name}( (org.drools.common.InternalWorkingMemory) workingMemory, @{declr.identifier}__Handle__.getObject() );
           @if{notPattern}@{declr.identifier}__Handle__ =  (org.drools.common.InternalFactHandle) knowledgeHelper.getWorkingMemory().getFactHandle( @{declr.identifier} );@end{}
         @end{}
-        
-        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" ); 
-        @end{}    
-        
-        @{ruleClassName}.@{methodName} ( 
+
+        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
+        @end{}
+
+        @{ruleClassName}.@{methodName} (
             knowledgeHelper at if{declarations != empty}, at end{}
             @foreach{declarations as declr} @{declr.identifier}, @{declr.identifier}__Handle__
             @end{","}@if{globals != empty}, at end{}
 	        @foreach{globals as identifier} @{identifier}
 	        @end{","} );
     }
-}     
+
+    public void writeExternal(java.io.ObjectOutput stream) throws java.io.IOException {
+    }
+
+    public void readExternal(java.io.ObjectInput stream) throws java.io.IOException, java.lang.ClassNotFoundException {
+    }
+}
 >>=::
 
 actionInvoker() ::=<<
@@ -335,16 +339,16 @@
 {
     private static final long serialVersionUID  = 400L;
 
-    public void execute(org.drools.WorkingMemory workingMemory) throws Exception {    
-                               
-        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" ); 
-        @end{}    
-        
-        @{processClassName}.@{methodName} ( 
+    public void execute(org.drools.WorkingMemory workingMemory) throws Exception {
+
+        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
+        @end{}
+
+        @{processClassName}.@{methodName} (
 	        @foreach{globals as identifier} @{identifier}
 	        @end{","} );
     }
-}     
+}
 >>=::
 
 returnValueEvaluatorInvoker() ::=<<
@@ -354,14 +358,14 @@
 {
     private static final long serialVersionUID  = 400L;
 
-    public Object evaluate(org.drools.WorkingMemory workingMemory) throws Exception {    
-                               
-        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" ); 
-        @end{}    
-        
-        return @{processClassName}.@{methodName} ( 
+    public Object evaluate(org.drools.WorkingMemory workingMemory) throws Exception {
+
+        @foreach{globalTypes, globals as type, identifier} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
+        @end{}
+
+        return @{processClassName}.@{methodName} (
 	        @foreach{globals as identifier} @{identifier}
 	        @end{","} );
     }
-}     
+}
 >>=::
\ No newline at end of file

Modified: labs/jbossrules/branches/serialization/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,13 +2,13 @@
 
 /*
  * Copyright 2005 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -192,7 +192,7 @@
                       pkg.getPackageCompilationData().list().length );
 
         builder.addPackage( packageDescr );
-        
+
         pkg = builder.getPackage();
 
         rule = pkg.getRule( "rule-1" );
@@ -1003,7 +1003,7 @@
         PackageBuilder builder = new PackageBuilder();
         PackageDescr pkgDescr = new PackageDescr( "org.test" );
         builder.addPackage( pkgDescr );
-        
+
         final Field dialectField = builder.getClass().getDeclaredField( "dialect" );
         dialectField.setAccessible( true );
         JavaDialect dialect = (JavaDialect) dialectField.get( builder );
@@ -1020,7 +1020,7 @@
         javaConf.setCompiler( JavaDialectConfiguration.JANINO );
         builder = new PackageBuilder( conf );
         builder.addPackage( pkgDescr );
-        
+
         dialect = (JavaDialect) dialectField.get( builder );
         compiler = (JavaCompiler) compilerField.get( dialect );
         assertSame( JaninoJavaCompiler.class,
@@ -1032,7 +1032,7 @@
         javaConf.setCompiler( JavaDialectConfiguration.ECLIPSE );
         builder = new PackageBuilder( conf );
         builder.addPackage( pkgDescr );
-        
+
         dialect = (JavaDialect) dialectField.get( builder );
         compiler = (JavaCompiler) compilerField.get( dialect );
         assertSame( EclipseJavaCompiler.class,
@@ -1213,7 +1213,7 @@
         ObjectOutputStream out = new ObjectOutputStream( data );
         out.writeObject( pkg );
 
-        ObjectInputStream objIn = new DroolsObjectInputStream( new ByteArrayInputStream( data.toByteArray() ) );
+        DroolsObjectInputStream objIn = new DroolsObjectInputStream( new ByteArrayInputStream( data.toByteArray() ) );
         Package pkg2 = (Package) objIn.readObject();
         assertNotNull( pkg2 );
 
@@ -1250,22 +1250,22 @@
         assertFalse( pkg.getRuleFlows().containsKey( "1" ) );
 
     }
-    
+
     public void testJaninoWithStaticImports() throws Exception {
         PackageBuilderConfiguration cfg = new PackageBuilderConfiguration();
         JavaDialectConfiguration javaConf = ( JavaDialectConfiguration ) cfg.getDialectConfiguration( "java" );
         javaConf.setCompiler( JavaDialectConfiguration.JANINO );
-        
-        
+
+
         PackageBuilder bldr = new PackageBuilder(cfg);
         bldr.addPackageFromDrl( new StringReader("package testBuilderPackageConfig \n import java.util.List") );
         bldr.addPackageFromDrl( new StringReader("function void doSomething() {\n System.err.println(List.class.toString()); }"));
-        
+
         assertFalse(bldr.hasErrors());
-        
+
     }
-    
 
+
     class MockRuleFlow
         implements
         Process {
@@ -1291,7 +1291,7 @@
         public String getVersion() {
             return null;
         }
-        
+
         public String getPackageName() {
         	return null;
         }
@@ -1307,7 +1307,7 @@
 
         public void setVersion(String version) {
         }
-        
+
         public void setPackageName(String packageName) {
         }
 

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/agent/FileScanner.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/agent/FileScanner.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/agent/FileScanner.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -4,7 +4,6 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -106,7 +105,7 @@
     	} else {
 
 	        Package p1_ = null;
-	        ObjectInputStream in;
+            DroolsObjectInputStream in;
 	        try {
 	            in = new DroolsObjectInputStream( new FileInputStream( pkgFile ) );
 	            p1_ = (Package) in.readObject();

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,13 +2,13 @@
 
 /*
  * Copyright 2005 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,8 +17,9 @@
  */
 
 import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
 import java.lang.reflect.Method;
 
 import org.drools.RuntimeDroolsException;
@@ -29,24 +30,25 @@
 
 /**
  * This provides access to fields, and what their numerical index/object type is.
- * This is basically a wrapper class around dynamically generated subclasses of 
+ * This is basically a wrapper class around dynamically generated subclasses of
  * BaseClassFieldExtractor,
- *  which allows serialization by regenerating the accessor classes 
+ *  which allows serialization by regenerating the accessor classes
  * when needed.
- * 
+ *
  * @author Michael Neale
  */
 public class ClassFieldExtractor
     implements
-    FieldExtractor {
-    /**
-     * 
-     */
-    private static final long        serialVersionUID = 400L;
+    FieldExtractor,
+    Externalizable {
+
     private String                   fieldName;
     private Class                    clazz;
     private transient FieldExtractor extractor;
 
+    private ClassFieldExtractor() {
+    }
+
     public ClassFieldExtractor(final Class clazz,
                                final String fieldName) {
         this( clazz,
@@ -73,36 +75,6 @@
               factory );
     }
 
-    private void writeObject(ObjectOutputStream s) throws IOException {
-        // Call even if there is no default serializable fields.
-        s.defaultWriteObject();
-    }
-
-    private void readObject(final ObjectInputStream is) throws ClassNotFoundException,
-                                                       IOException,
-                                                       Exception {
-        //always perform the default de-serialization first
-        is.defaultReadObject();
-        if ( is instanceof DroolsObjectInputStream ) {
-            DroolsObjectInputStream dois = (DroolsObjectInputStream) is;
-            this.extractor = dois.getExtractorFactory().getExtractor( this.clazz,
-                                                                      this.fieldName,
-                                                                      dois.getClassLoader() );
-        } else {
-            this.extractor = ClassFieldExtractorCache.getInstance().getExtractor( this.clazz,
-                                                                                  this.fieldName,
-                                                                                  this.clazz.getClassLoader() );
-
-        }
-    }
-
-//    private Object readResolve() {
-//        // always return the value from the cache
-//        return ClassFieldExtractorCache.getInstance().getExtractor( this.clazz,
-//                                                                    this.fieldName,
-//                                                                    this.clazz.getClassLoader() );
-//    }
-
     private void init(final ClassLoader classLoader,
                       final ClassFieldExtractorFactory factory) {
         try {
@@ -229,4 +201,34 @@
     public boolean isGlobal() {
         return false;
     }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(fieldName);
+        out.writeObject(clazz);
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        fieldName = (String) in.readObject();
+        clazz = (Class) in.readObject();
+
+        if (in instanceof DroolsObjectInputStream) {
+            DroolsObjectInputStream dois = (DroolsObjectInputStream) in;
+            this.extractor = dois.getExtractorFactory().getExtractor(this.clazz,
+                    this.fieldName,
+                    dois.getClassLoader());
+        } else {
+            this.extractor = ClassFieldExtractorCache.getInstance().getExtractor(this.clazz,
+                    this.fieldName,
+                    this.clazz.getClassLoader());
+
+        }
+    }
+
+//    public Object readResolve() {
+//        // always return the value from the cache
+//        return ClassFieldExtractorCache.getInstance().getExtractor( this.clazz,
+//                                                                    this.fieldName,
+//                                                                    this.clazz.getClassLoader() );
+//    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -221,30 +221,22 @@
             this.packageClassLoader.addClassLoader( ((Package) it.next()).getPackageCompilationData().getClassLoader() );
         }
 
-        // Return the rules stored as a byte[]
-        final byte[] bytes = (byte[]) stream.readObject();
+        this.id = (String) stream.readObject();
+        this.processes = (Map) stream.readObject();
+        this.agendaGroupRuleTotals = (Map) stream.readObject();
+        this.factHandleFactory = (FactHandleFactory) stream.readObject();
+        this.globals = (Map) stream.readObject();
 
-        //  Use a custom ObjectInputStream that can resolve against a given classLoader
-        final DroolsObjectInputStream childStream = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ),
-                                                                                 this.packageClassLoader );
-        childStream.setRuleBase( this );
-
-        this.id = (String) childStream.readObject();
-        this.processes = (Map) childStream.readObject();
-        this.agendaGroupRuleTotals = (Map) childStream.readObject();
-        this.factHandleFactory = (FactHandleFactory) childStream.readObject();
-        this.globals = (Map) childStream.readObject();
-
-        this.config = (RuleBaseConfiguration) childStream.readObject();
-        this.config.setClassLoader( childStream.getClassLoader() );
-        this.eventSupport = (RuleBaseEventSupport) childStream.readObject();
+        this.config = (RuleBaseConfiguration) stream.readObject();
+        this.config.setClassLoader(this.packageClassLoader );
+        this.eventSupport = (RuleBaseEventSupport) stream.readObject();
         this.eventSupport.setRuleBase( this );
 
         this.statefulSessions = new ObjectHashSet();
     }
 
 	/**
-	 * Creates Objenesis instance for the RuleBase. 
+	 * Creates Objenesis instance for the RuleBase.
 	 * @return a standart Objenesis instanse with caching turned on.
 	 */
 	protected Objenesis createObjenesis() {
@@ -778,7 +770,7 @@
         // since the event support is thread-safe, no need for locks... right?
         return this.eventSupport.getEventListeners();
     }
-    
+
     public boolean isEvent( Class clazz ) {
         for( Package pkg : this.pkgs.values() ) {
             if( pkg.isEvent( clazz ) ) {

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -1,120 +1,321 @@
-/**
- * 
- */
-package org.drools.common;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectStreamClass;
-import java.util.HashMap;
-
-import org.drools.base.ClassFieldExtractorCache;
-import org.drools.rule.Package;
-
-public class DroolsObjectInputStream extends ObjectInputStream {
-    private final ClassLoader        classLoader;
-    private InternalRuleBase         ruleBase;
-    private InternalWorkingMemory    workingMemory;
-    private Package                  pkg;
-    private ClassFieldExtractorCache extractorFactory;
-
-    /** table mapping primitive type names to corresponding class objects */
-    private static final HashMap     primClasses = new HashMap( 8,
-                                                                1.0F );
-    static {
-        primClasses.put( "boolean",
-                         boolean.class );
-        primClasses.put( "byte",
-                         byte.class );
-        primClasses.put( "char",
-                         char.class );
-        primClasses.put( "short",
-                         short.class );
-        primClasses.put( "int",
-                         int.class );
-        primClasses.put( "long",
-                         long.class );
-        primClasses.put( "float",
-                         float.class );
-        primClasses.put( "double",
-                         double.class );
-        primClasses.put( "void",
-                         void.class );
-    }
-
-    public DroolsObjectInputStream(final InputStream in) throws IOException {
-        this( in,
-              null );
-    }
-
-    public DroolsObjectInputStream(final InputStream in,
-                                   ClassLoader classLoader) throws IOException {
-        super( in );
-        if ( classLoader == null ) {
-            classLoader = Thread.currentThread().getContextClassLoader();
-            if ( classLoader == null ) {
-                classLoader = this.getClass().getClassLoader();
-            }
-        }
-
-        this.classLoader = classLoader;
-        this.extractorFactory = ClassFieldExtractorCache.getInstance();
-        enableResolveObject( true );
-    }
-
-    public ClassLoader getClassLoader() {
-        return this.classLoader;
-    }
-
-    protected Class resolveClass(final ObjectStreamClass desc) throws IOException,
-                                                              ClassNotFoundException {
-        if ( this.classLoader == null ) {
-            return super.resolveClass( desc );
-        } else {
-            final String name = desc.getName();
-            Class clazz = (Class) primClasses.get( name );
-            if ( clazz == null ) {
-                try {
-                    clazz = this.classLoader.loadClass( name );
-                } catch ( final ClassNotFoundException cnf ) {
-                    clazz = super.resolveClass( desc );
-                }
-            }
-            return clazz;
-        }
-    }
-
-    public InternalRuleBase getRuleBase() {
-        return ruleBase;
-    }
-
-    public void setRuleBase(InternalRuleBase ruleBase) {
-        this.ruleBase = ruleBase;
-    }
-
-    public void setWorkingMemory(InternalWorkingMemory workingMemory) {
-        this.workingMemory = workingMemory;
-    }
-
-    public InternalWorkingMemory getWorkingMemory() {
-        return workingMemory;
-    }
-
-    public Package getPackage() {
-        return pkg;
-    }
-
-    public void setPackage(Package pkg) {
-        this.pkg = pkg;
-    }
-
-    public ClassFieldExtractorCache getExtractorFactory() {
-        return extractorFactory;
-    }
-
-    public void setExtractorFactory(ClassFieldExtractorCache extractorFactory) {
-        this.extractorFactory = extractorFactory;
-    }
-
-}
\ No newline at end of file
+package org.drools.common;
+
+import org.drools.base.ClassFieldExtractorCache;
+import static org.drools.common.DroolsObjectStreamConstants.*;
+
+import java.io.DataInputStream;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInput;
+import java.io.StreamCorruptedException;
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+// TODO: Change access protection for calling constructor
+public class DroolsObjectInputStream extends DataInputStream implements ObjectInput {
+    private final Map objectsByHandle = new HashMap();
+    private ClassLoader classLoader;
+    private InternalRuleBase ruleBase;
+    private ClassFieldExtractorCache extractorFactory;
+
+    public DroolsObjectInputStream(InputStream stream) {
+        this(stream, Thread.currentThread().getContextClassLoader());
+    }
+
+    public DroolsObjectInputStream(InputStream stream, ClassLoader classLoader) {
+        super(stream);
+        this.classLoader = classLoader;
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
+    public void setClassLoader(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    public void setRuleBase(InternalRuleBase ruleBase) {
+        this.ruleBase = ruleBase;
+    }
+
+    public InternalRuleBase getRuleBase() {
+        return ruleBase;
+    }
+
+    public ClassFieldExtractorCache getExtractorFactory() {
+        return extractorFactory;
+    }
+
+    public void setExtractorFactory(ClassFieldExtractorCache extractorFactory) {
+        this.extractorFactory = extractorFactory;
+    }
+
+    public Object readObject() throws ClassNotFoundException, IOException {
+        byte type = unmarshalRecordType();
+
+        Object object;
+
+        switch (type) {
+            case NULL:
+                object = unmarshalNull();
+                break;
+            case EMPTY_SET:
+                object = unmarshalEmptySet();
+                break;
+            case EMPTY_LIST:
+                object = unmarshalEmptyList();
+                break;
+            case EMPTY_MAP:
+                object = unmarshalEmptyMap();
+                break;
+            default:
+                object = unmarshalObject(type);
+        }
+
+        return object;
+    }
+
+    private Object unmarshalObject(byte type) throws IOException, ClassNotFoundException {
+        int handle = unmarshalHandle();
+
+        Object object;
+
+        switch (type) {
+            case EXTERNALIZABLE:
+                object = unmarshalExternalizable();
+                break;
+            case REPLACEABLE:
+                object = unmarshalResolvable();
+                break;
+            case STRING:
+                object = unmarshalString();
+                break;
+            case MAP:
+                object = unmarshalMap();
+                break;
+            case COLLECTION:
+                object = unmarshalCollection();
+                break;
+            case ARRAY:
+                object = unmarshalArray();
+                break;
+            case CLASS:
+                object = unmarshalClass();
+                break;
+            case REFERENCE:
+                return unmarshalReference(handle);
+            default:
+                throw new StreamCorruptedException("Unsupported object type: " + type);
+        }
+
+        registerObject(handle, object);
+        return object;
+    }
+
+    private Object unmarshalArray() throws IOException, ClassNotFoundException {
+        Class clazz = (Class) readObject();
+        int length = readInt();
+        Class componentType = clazz.getComponentType();
+        Object array = Array.newInstance(componentType, length);
+        if (componentType.isPrimitive()) {
+            unmarshalPrimitiveArray(array, length, componentType);
+        } else {
+            unmarshalObjectArray((Object[]) array, length);
+        }
+        return array;
+    }
+
+    private void unmarshalPrimitiveArray(Object array, int length, Class clazz) throws IOException {
+        if (clazz == Integer.TYPE) {
+            unmarshalIntArray((int[]) array, length);
+        } else if (clazz == Byte.TYPE) {
+            unmarshalByteArray((byte[]) array, length);
+        } else if (clazz == Long.TYPE) {
+            unmarshalLongArray((long[]) array, length);
+        } else if (clazz == Float.TYPE) {
+            unmarshalFloatArray((float[]) array, length);
+        } else if (clazz == Double.TYPE) {
+            unmarshalDoubleArray((double[]) array, length);
+        } else if (clazz == Short.TYPE) {
+            unmarshalShortArray((short[]) array, length);
+        } else if (clazz == Character.TYPE) {
+            unmarshalCharArray((char[]) array, length);
+        } else if (clazz == Boolean.TYPE) {
+            unmarshalBooleanArray((boolean[]) array, length);
+        } else {
+            throw new StreamCorruptedException("Unsupported array type: " + clazz);
+        }
+    }
+
+    private void unmarshalIntArray(int[] ints, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            ints[i] = readInt();
+        }
+    }
+
+    private void unmarshalByteArray(byte[] bytes, int length) throws IOException {
+        readFully(bytes, 0, length);
+    }
+
+    private void unmarshalLongArray(long[] longs, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            longs[i] = readLong();
+        }
+    }
+
+    private void unmarshalFloatArray(float[] floats, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            floats[i] = readFloat();
+        }
+    }
+
+    private void unmarshalDoubleArray(double[] doubles, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            doubles[i] = readDouble();
+        }
+    }
+
+    private void unmarshalShortArray(short[] shorts, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            shorts[i] = readShort();
+        }
+    }
+
+    private void unmarshalCharArray(char[] chars, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            chars[i] = readChar();
+        }
+    }
+
+    private void unmarshalBooleanArray(boolean[] booleans, int length) throws IOException {
+        for (int i = 0; i < length; ++i) {
+            booleans[i] = readBoolean();
+        }
+    }
+
+    private void unmarshalObjectArray(Object[] objects, int length) throws IOException, ClassNotFoundException {
+        for (int i = 0; i < length; ++i) {
+            objects[i] = readObject();
+        }
+    }
+
+    private Object unmarshalNull() {
+        return null;
+    }
+
+    private Set unmarshalEmptySet() {
+        return Collections.EMPTY_SET;
+    }
+
+    private List unmarshalEmptyList() {
+        return Collections.EMPTY_LIST;
+    }
+
+    private Map unmarshalEmptyMap() {
+        return Collections.EMPTY_MAP;
+    }
+
+    private Object unmarshalResolvable() throws ClassNotFoundException, IOException {
+        Resolvable resolvable = (Resolvable) unmarshalExternalizable();
+        return resolvable.readResolve();
+    }
+
+    private Externalizable unmarshalExternalizable() throws ClassNotFoundException, IOException {
+        Class clazz = (Class) readObject();
+        Externalizable externalizable = createExternalizable(clazz);
+        externalizable.readExternal(this);
+        return externalizable;
+    }
+
+    private Externalizable createExternalizable(Class clazz) {
+        try {
+            Constructor constructor = clazz.getDeclaredConstructor();
+            boolean accessible = constructor.isAccessible();
+            constructor.setAccessible(true);
+            try {
+                return (Externalizable) constructor.newInstance();
+            } catch (IllegalAccessException e) {
+                throw new IllegalStateException(e);
+            } catch (InvocationTargetException e) {
+                throw new IllegalStateException(e);
+            } catch (InstantiationException e) {
+                throw new IllegalStateException(e);
+            } finally {
+                constructor.setAccessible(accessible);
+            }
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private String unmarshalString() throws IOException {
+        return readUTF();
+    }
+
+    private Map unmarshalMap() throws IOException, ClassNotFoundException {
+        Class clazz = (Class) readObject();
+        int size = readInt();
+        Map map = (Map) createCollection(clazz, size);
+        for (int i = 0; i < size; ++i) {
+            Object key = readObject();
+            Object value = readObject();
+            map.put(key, value);
+        }
+        return map;
+    }
+
+    private Collection unmarshalCollection() throws IOException, ClassNotFoundException {
+        Class clazz = (Class) readObject();
+        int size = readInt();
+        Collection collection = (Collection) createCollection(clazz, size);
+        for (int i = 0; i < size; ++i) {
+            collection.add(readObject());
+        }
+        return collection;
+    }
+
+    private Object createCollection(Class clazz, int size) throws ClassNotFoundException, IOException {
+        try {
+            Constructor constructor = clazz.getConstructor(Integer.TYPE);
+            return constructor.newInstance(size);
+        } catch (InstantiationException e) {
+            throw new IllegalStateException(e);
+        } catch (IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        } catch (InvocationTargetException e) {
+            throw new IllegalStateException(e);
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private int unmarshalHandle() throws IOException {
+        return readInt();
+    }
+
+    private Class unmarshalClass() throws IOException, ClassNotFoundException {
+        String className = (String) readObject();
+        return this.classLoader.loadClass(className);
+    }
+
+    private byte unmarshalRecordType() throws IOException {
+        return readByte();
+    }
+
+    private Object unmarshalReference(int handle) {
+        return objectsByHandle.get(handle);
+    }
+
+    private void registerObject(int handle, Object object) {
+        objectsByHandle.put(handle, object);
+    }
+}

Added: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	                        (rev 0)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -0,0 +1,271 @@
+package org.drools.common;
+
+import static org.drools.common.DroolsObjectStreamConstants.*;
+
+import java.io.DataOutputStream;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectOutput;
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class DroolsObjectOutputStream extends DataOutputStream implements ObjectOutput {
+    private static final Class EMPTY_SET_CLASS = Collections.EMPTY_SET.getClass();
+    private static final Class EMPTY_MAP_CLASS = Collections.EMPTY_MAP.getClass();
+    private static final Class EMPTY_LIST_CLASS = Collections.EMPTY_LIST.getClass();
+
+    private final Map handlesByObject = new IdentityHashMap();
+    private int handleCount = 0;
+
+    public DroolsObjectOutputStream(OutputStream stream) {
+        super(stream);
+    }
+
+    public void writeObject(Object object) throws IOException {
+        if (object == null) {
+            marshalNull();
+        } else {
+            Class clazz = object.getClass();
+
+            if (clazz == EMPTY_SET_CLASS) {
+                marshalEmptySet();
+            } else if (clazz == EMPTY_LIST_CLASS) {
+                marshalEmptyList();
+            } else if (clazz == EMPTY_MAP_CLASS) {
+                marshalEmptyMap();
+            } else if (clazz == String.class) {
+                marshalObjectOrReference(((String) object).intern(), clazz);
+            } else {
+                marshalObjectOrReference(object, clazz);
+            }
+        }
+    }
+
+    private void marshalNull() throws IOException {
+        marshalRecordType(NULL);
+    }
+
+    private void marshalObjectOrReference(Object object, Class clazz) throws IOException {
+        int handle = registerObject(object);
+        if (handle < 0) {
+            marshalObject(object, clazz, -handle);
+        } else {
+            marshalReference(handle);
+        }
+    }
+
+    private void marshalObject(Object object, Class clazz, int handle) throws IOException {
+        if (Externalizable.class.isAssignableFrom(clazz)) {
+            marshalExternalizable((Externalizable) object, clazz, handle);
+        } else if (clazz == String.class) {
+            marshalString((String) object, handle);
+        } else if (Map.class.isAssignableFrom(clazz)) {
+            marshalMap((Map) object, clazz, handle);
+        } else if (Collection.class.isAssignableFrom(clazz)) {
+            marshalCollection((Collection) object, clazz, handle);
+        } else if (clazz == Class.class) {
+            marshalClass((Class) object, handle);
+        } else if (clazz.isArray()) {
+            marshalArray(object, clazz, handle);
+        } else {
+            throw new NotSerializableException("Unsupported class: " + clazz);
+        }
+    }
+
+    private void marshalArray(Object array, Class clazz, int handle) throws IOException {
+        marshalRecordType(ARRAY);
+        marshalHandle(handle);
+        writeObject(clazz);
+        Class componentType = clazz.getComponentType();
+        if (componentType.isPrimitive()) {
+            marshalPrimitiveArray(array, componentType);
+        } else {
+            marshalObjectArray((Object[]) array);
+        }
+    }
+
+    private void marshalPrimitiveArray(Object array, Class clazz) throws IOException {
+        if (clazz == Integer.TYPE) {
+            marshalIntArray(array);
+        } else if (clazz == Byte.TYPE) {
+            marshalByteArray(array);
+        } else if (clazz == Long.TYPE) {
+            marshalLongArray(array);
+        } else if (clazz == Float.TYPE) {
+            marshalFloatArray(array);
+        } else if (clazz == Double.TYPE) {
+            marshalDoubleArray(array);
+        } else if (clazz == Short.TYPE) {
+            marshalShortArray(array);
+        } else if (clazz == Character.TYPE) {
+            marshalCharArray(array);
+        } else if (clazz == Boolean.TYPE) {
+            marshalBooleanArray(array);
+        } else {
+            throw new NotSerializableException("Unsupported array type: " + clazz);
+        }
+    }
+
+    private void marshalIntArray(Object array) throws IOException {
+        int[] ints = (int[]) array;
+        int length = ints.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeInt(ints[i]);
+        }
+    }
+
+    private void marshalByteArray(Object array) throws IOException {
+        byte[] bytes = (byte[]) array;
+        int length = bytes.length;
+        writeInt(length);
+        write(bytes, 0, length);
+    }
+
+    private void marshalLongArray(Object array) throws IOException {
+        long[] longs = (long[]) array;
+        int length = longs.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeLong(longs[i]);
+        }
+    }
+
+    private void marshalFloatArray(Object array) throws IOException {
+        float[] floats = (float[]) array;
+        int length = floats.length;
+        writeFloat(length);
+        for (int i = 0; i < length; ++i) {
+            writeFloat(floats[i]);
+        }
+    }
+
+    private void marshalDoubleArray(Object array) throws IOException {
+        double[] doubles = (double[]) array;
+        int length = doubles.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeDouble(doubles[i]);
+        }
+    }
+
+    private void marshalShortArray(Object array) throws IOException {
+        short[] shorts = (short[]) array;
+        int length = shorts.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeShort(shorts[i]);
+        }
+    }
+
+    private void marshalCharArray(Object array) throws IOException {
+        char[] chars = (char[]) array;
+        int length = chars.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeChar(chars[i]);
+        }
+    }
+
+    private void marshalBooleanArray(Object array) throws IOException {
+        boolean[] booleans = (boolean[]) array;
+        int length = booleans.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeBoolean(booleans[i]);
+        }
+    }
+
+    private void marshalObjectArray(Object[] objects) throws IOException {
+        int length = objects.length;
+        writeInt(length);
+        for (int i = 0; i < length; ++i) {
+            writeObject(objects[i]);
+        }
+    }
+
+    private void marshalClass(Class clazz, int handle) throws IOException {
+        marshalRecordType(CLASS);
+        marshalHandle(handle);
+        writeObject(clazz.getName());
+    }
+
+    private void marshalReference(int handle) throws IOException {
+        marshalRecordType(REFERENCE);
+        marshalHandle(handle);
+    }
+
+    private void marshalString(String string, int handle) throws IOException {
+        marshalRecordType(STRING);
+        marshalHandle(handle);
+        writeUTF(string);
+    }
+
+    private void marshalExternalizable(Externalizable marshallable, Class clazz, int handle) throws IOException {
+        if (Resolvable.class.isAssignableFrom(clazz)) {
+            marshalRecordType(REPLACEABLE);
+        } else {
+            marshalRecordType(EXTERNALIZABLE);
+        }
+        marshalHandle(handle);
+        writeObject(clazz);
+        marshallable.writeExternal(this);
+    }
+
+    private void marshalMap(Map map, Class clazz, int handle) throws IOException {
+        marshalRecordType(MAP);
+        marshalHandle(handle);
+        writeObject(clazz);
+        writeInt(map.size());
+        for (Iterator i = map.entrySet().iterator(); i.hasNext();) {
+            Map.Entry entry = (Map.Entry) i.next();
+            writeObject(entry.getKey());
+            writeObject(entry.getValue());
+        }
+    }
+
+    private void marshalCollection(Collection collection, Class clazz, int handle) throws IOException {
+        marshalRecordType(COLLECTION);
+        marshalHandle(handle);
+        writeObject(clazz);
+        writeInt(collection.size());
+        for (Iterator i = collection.iterator(); i.hasNext();) {
+            writeObject(i.next());
+        }
+    }
+
+    private void marshalEmptySet() throws IOException {
+        marshalRecordType(EMPTY_SET);
+    }
+
+    private void marshalEmptyList() throws IOException {
+        marshalRecordType(EMPTY_LIST);
+    }
+
+    private void marshalEmptyMap() throws IOException {
+        marshalRecordType(EMPTY_MAP);
+    }
+
+    private void marshalRecordType(byte type) throws IOException {
+        writeByte(type);
+    }
+
+    private void marshalHandle(int handle) throws IOException {
+        writeInt(handle);
+    }
+
+    private int registerObject(Object object) {
+        Integer handle = (Integer) handlesByObject.get(object);
+        if (handle == null) {
+            handle = ++handleCount;
+            handlesByObject.put(object, handle);
+            handle = -handle;
+        }
+        return handle;
+    }
+}

Added: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectStreamConstants.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectStreamConstants.java	                        (rev 0)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/DroolsObjectStreamConstants.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -0,0 +1,19 @@
+package org.drools.common;
+
+public final class DroolsObjectStreamConstants {
+    public static final byte CLASS = 11;
+    public static final byte EXTERNALIZABLE = 12;
+    public static final byte REFERENCE = 13;
+    public static final byte EMPTY_SET = 14;
+    public static final byte EMPTY_LIST = 15;
+    public static final byte EMPTY_MAP = 16;
+    public static final byte MAP = 17;
+    public static final byte ARRAY = 18;
+    public static final byte STRING = 19;
+    public static final byte NULL = 20;
+    public static final byte COLLECTION = 21;
+    public static final byte REPLACEABLE = 22;
+
+    private DroolsObjectStreamConstants() {
+    }
+}

Added: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/Resolvable.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/Resolvable.java	                        (rev 0)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/common/Resolvable.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -0,0 +1,7 @@
+package org.drools.common;
+
+import java.io.Externalizable;
+
+public interface Resolvable extends Externalizable {
+    public Object readResolve();
+}

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,8 +18,10 @@
 package org.drools.reteoo;
 
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.io.Externalizable;
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -33,8 +35,6 @@
 import org.drools.base.ShadowProxyFactory;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalRuleBase;
-import org.drools.objenesis.Objenesis;
-import org.drools.objenesis.ObjenesisStd;
 import org.drools.objenesis.instantiator.ObjectInstantiator;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.reteoo.builder.PatternBuilder;
@@ -46,9 +46,9 @@
 public class ClassObjectTypeConf
     implements
     ObjectTypeConf,
-    Serializable {
+    Externalizable {
 
-    private final Class                    cls;
+    private Class                    cls;
     private transient InternalRuleBase     ruleBase;
     private ObjectTypeNode[]               objectTypeNodes;
 
@@ -223,12 +223,6 @@
         return ret;
     }
 
-    private void readObject(ObjectInputStream stream) throws IOException,
-                                                     ClassNotFoundException {
-        stream.defaultReadObject();
-        this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
-    }
-
     /**
      *
      */
@@ -300,4 +294,23 @@
     public boolean isEvent() {
         return this.concreteObjectTypeNode.getObjectType().isEvent();
     }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(cls);
+        out.writeObject(objectTypeNodes);
+        out.writeBoolean(shadowEnabled);
+        out.writeObject(shadowClass);
+        out.writeObject(concreteObjectTypeNode);
+        out.writeObject(entryPoint);
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        cls = (Class) in.readObject();
+        objectTypeNodes = (ObjectTypeNode[]) in.readObject();
+        shadowEnabled = in.readBoolean();
+        shadowClass = (Class) in.readObject();
+        concreteObjectTypeNode = (ObjectTypeNode) in.readObject();
+        entryPoint = (EntryPoint) in.readObject();
+        this.ruleBase = ((DroolsObjectInputStream) in).getRuleBase();
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -17,8 +17,9 @@
  */
 
 import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
+import java.io.Externalizable;
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -59,19 +60,14 @@
  */
 public class Rete extends ObjectSource
     implements
-    Serializable,
+    Externalizable,
     ObjectSink {
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
 
-    /**
-     *
-     */
-    private static final long                    serialVersionUID = 400L;
+    private Map<EntryPoint, ObjectHashMap> entryPoints;
 
-    private final Map<EntryPoint, ObjectHashMap> entryPoints;
-
     private transient InternalRuleBase           ruleBase;
 
     // ------------------------------------------------------------
@@ -86,12 +82,6 @@
         this.ruleBase = ruleBase;
     }
 
-    private void readObject(ObjectInputStream stream) throws IOException,
-                                                     ClassNotFoundException {
-        stream.defaultReadObject();
-        this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
-    }
-
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------
@@ -277,4 +267,12 @@
         throw new UnsupportedOperationException( "ORete has no Object memory" );
     }
 
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(entryPoints);
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        entryPoints = (Map<EntryPoint, ObjectHashMap>) in.readObject();
+        this.ruleBase = ((DroolsObjectInputStream) in).getRuleBase();
+    }
 }

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,13 +2,13 @@
 
 /*
  * Copyright 2005 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,8 +17,10 @@
  */
 
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.io.Externalizable;
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -37,30 +39,24 @@
 import org.drools.reteoo.builder.ReteooRuleBuilder;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Rule;
-import org.drools.spi.AgendaGroup;
 import org.drools.spi.Salience;
 
 /**
  * Builds the Rete-OO network for a <code>Package</code>.
- * 
+ *
  * @see org.drools.rule.Package
- * 
+ *
  * @author <a href="mailto:mark.proctor at jboss.com">Mark Proctor</a>
  * @author <a href="mailto:bob at werken.com">Bob McWhirter</a>
- * 
+ *
  */
 public class ReteooBuilder
     implements
-    Serializable {
+        Externalizable {
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
 
-    /**
-     * 
-     */
-    private static final long                 serialVersionUID = 400L;
-
     /** The RuleBase */
     private transient InternalRuleBase          ruleBase;
 
@@ -71,7 +67,7 @@
     private transient ReteooRuleBuilder       ruleBuilder;
 
     private IdGenerator                       idGenerator;
-    
+
     private boolean                           ordered;
 
     // ------------------------------------------------------------
@@ -91,23 +87,16 @@
         this.ruleBuilder = new ReteooRuleBuilder();
     }
 
-    private void readObject(ObjectInputStream stream) throws IOException,
-                                                     ClassNotFoundException {
-        stream.defaultReadObject();
-        this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
-        this.ruleBuilder = new ReteooRuleBuilder();        
-    }
-
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------
 
     /**
      * Add a <code>Rule</code> to the network.
-     * 
+     *
      * @param rule
      *            The rule to add.
-     * 
+     *
      * @throws RuleIntegrationException
      *             if an error prevents complete construction of the network for
      *             the <code>Rule</code>.
@@ -121,18 +110,18 @@
         this.rules.put( rule,
                         terminals.toArray( new BaseNode[terminals.size()] ) );
     }
-    
+
     public IdGenerator getIdGenerator() {
         return this.idGenerator;
     }
-    
+
     public void order() {
         if ( ordered ) {
             // we should only do this on first call, its expected the RuleBase should not change afterwards.
             return;
         }
         Map map = new HashMap();
-        
+
         for ( Iterator it = this.rules.values().iterator(); it.hasNext(); ) {
             BaseNode[] nodes = (BaseNode[]) it.next();
             for ( int i = 0 ; i < nodes.length; i++ ) {
@@ -151,24 +140,35 @@
                 }
             }
         }
-        
+
         for ( Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
             Entry entry = ( Entry ) it.next();
             String agendaGroup = (String) entry.getKey();
             List rules = ( List ) entry.getValue();
             Collections.sort( rules, RuleSequenceComparator.INSTANCE );
-            
+
             int i = 0;
             for ( Iterator listIter = rules.iterator(); listIter.hasNext(); ) {
                 RuleTerminalNode node = ( RuleTerminalNode ) listIter.next();
                 node.setSequence( i++ );
             }
-            
+
             ruleBase.getAgendaGroupRuleTotals().put( agendaGroup, new Integer( i ) );
         }
         ordered = true;
     }
 
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(rules);
+        out.writeObject(idGenerator);
+        out.writeBoolean(ordered);
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        this.ruleBase = ((DroolsObjectInputStream) in).getRuleBase();
+        this.ruleBuilder = new ReteooRuleBuilder();
+    }
+
     public static class RuleSequenceComparator implements Comparator {
         public final static RuleSequenceComparator INSTANCE = new RuleSequenceComparator();
 
@@ -176,7 +176,7 @@
                            Object o2) {
             RuleTerminalNode r1 = (RuleTerminalNode) o1;
             RuleTerminalNode r2 = (RuleTerminalNode) o2;
-            
+
             Salience so1 = r1.getRule().getSalience();
             if (so1 != null && !(so1 instanceof SalienceInteger) ) {
                 throw new RuntimeException(r1.getRule().getName() + "must not have a dynamic salience" );
@@ -185,20 +185,20 @@
             if (so2 != null && !(so2 instanceof SalienceInteger) ) {
                 throw new RuntimeException(r2.getRule().getName() + "must not have a dynamic salience" );
             }
-            
+
             int s1 = so1.getValue( null, null );
             int s2 = so2.getValue( null, null );
-            
-            if ( s1 >  s2) {                        
+
+            if ( s1 >  s2) {
                 return -1;
             } else if ( s1 < s2 ) {
                 return 1;
-            } 
-            
+            }
+
             int id1 =r1.getId();
             int id2 =r2.getId();
-            
-            if ( id1 <  id2) {                        
+
+            if ( id1 <  id2) {
                 return -1;
             } else if ( id1 > id2 ) {
                 return 1;
@@ -206,9 +206,9 @@
                 return 0;
             }
         }
-        
+
     }
-    
+
     public BaseNode[] getTerminalNodes(final Rule rule) {
         return (BaseNode[]) this.rules.get( rule );
     }

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/spi/Extractor.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/spi/Extractor.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/spi/Extractor.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,13 +2,13 @@
 
 /*
  * Copyright 2005 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,15 +16,12 @@
  * limitations under the License.
  */
 
-import java.io.Serializable;
 import java.lang.reflect.Method;
 
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
 
-public interface Extractor
-    extends
-    Serializable {
+public interface Extractor {
 
     public Object getValue(InternalWorkingMemory workingMemory, Object object);
 
@@ -43,9 +40,9 @@
     public double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
-    
+
     public boolean isNullValue(InternalWorkingMemory workingMemory, Object object);
-    
+
     public boolean isGlobal();
 
     public ValueType getValueType();

Modified: labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/util/BinaryRuleBaseLoader.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/util/BinaryRuleBaseLoader.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/main/java/org/drools/util/BinaryRuleBaseLoader.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,7 +2,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.ObjectInputStream;
 
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
@@ -14,7 +13,7 @@
  * This loads up rulebases from binary packages.
  * Can work with an existing or a new rulebase.
  * This is useful for deployment.
- * 
+ *
  * @author Michael Neale
  */
 public class BinaryRuleBaseLoader {
@@ -29,7 +28,7 @@
      */
     public BinaryRuleBaseLoader() {
         this( RuleBaseFactory.newRuleBase(), null );
-    }    
+    }
 
     /**
      * This will add any binary packages to the rulebase.
@@ -52,17 +51,17 @@
             if ( classLoader == null ) {
                 classLoader = this.getClass().getClassLoader();
             }
-        }        
+        }
         this.ruleBase = rb;
         this.classLoader = classLoader;
     }
-    
+
     /**
      * This will add the BINARY package to the rulebase.
      * Uses the member ClassLoader as the Package's internal parent classLoader
      * which is Thread.currentThread.getContextClassLoader if not user specified
      * @param in An input stream to the serialized package.
-     */    
+     */
     public void addPackage(InputStream in) {
         addPackage(in, this.classLoader);
     }
@@ -70,15 +69,15 @@
     /**
      * This will add the BINARY package to the rulebase.
      * @param in An input stream to the serialized package.
-     * @param optional classLoader used as the parent ClassLoader for the Package's internal ClassLaoder  
-     */    
+     * @param optional classLoader used as the parent ClassLoader for the Package's internal ClassLaoder
+     */
     public void addPackage(InputStream in, ClassLoader classLoader) {
         if ( classLoader == null ) {
             classLoader = this.classLoader;
         }
-        
+
         try {
-            ObjectInputStream oin = new DroolsObjectInputStream( in, classLoader);
+            DroolsObjectInputStream oin = new DroolsObjectInputStream( in, classLoader);
             Object opkg = oin.readObject();
             if ( !(opkg instanceof Package) ) {
                 throw new IllegalArgumentException( "Can only add instances of org.drools.rule.Package to a rulebase instance." );

Modified: labs/jbossrules/branches/serialization/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -2,56 +2,52 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
 
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.common.DroolsObjectInputStream;
+import org.drools.common.DroolsObjectOutputStream;
 import org.drools.rule.Package;
 
 import junit.framework.TestCase;
 
 public class RuleBaseAssemblerTest extends TestCase {
 
-    
+
     public void testAssemblePackages() throws Exception {
         RuleBase rb = RuleBaseFactory.newRuleBase();
         rb.addPackage( new Package("goober") );
-        
+
         Package p1 = new Package("p1");
-        
+
         File f = getTempDirectory();
-        
+
         File p1file = new File(f, "p1.pkg");
-        
+
         writePackage( p1, p1file );
-        
+
         Package p1_ = readPackage( p1file );
-        
+
         rb = RuleBaseFactory.newRuleBase();
         rb.addPackage( p1_ );
-        
-        
+
+
     }
 
     public static Package readPackage(File p1file) throws IOException,
-                                            FileNotFoundException,
                                             ClassNotFoundException {
-        ObjectInputStream in = new DroolsObjectInputStream(new FileInputStream(p1file));
+        DroolsObjectInputStream in = new DroolsObjectInputStream(new FileInputStream(p1file));
         Package p1_ = (Package) in.readObject();
         in.close();
         return p1_;
     }
 
-    public static void writePackage(Package pkg, File p1file) throws IOException,
-                                                      FileNotFoundException {
-        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(p1file));
+    public static void writePackage(Package pkg, File p1file) throws IOException {
+        DroolsObjectOutputStream out = new DroolsObjectOutputStream(new FileOutputStream(p1file));
         out.writeObject( pkg );
-        out.flush(); out.close();
+        out.close();
     }
 
     public static File getTempDirectory() {
@@ -70,12 +66,12 @@
 
     private static File tempDir() {
         File tmp = new File(System.getProperty( "java.io.tmpdir" ));
-        
+
         return new File(tmp, "__temp_test_drools_packages");
     }
-    
+
     public static boolean deleteDir(File dir) {
-        
+
         if (dir.isDirectory()) {
             String[] children = dir.list();
             for (int i=0; i<children.length; i++) {
@@ -86,14 +82,14 @@
                 }
             }
         }
-    
+
         // The directory is now empty so delete it
         return dir.delete();
     }
 
     public static void clearTempDirectory() {
         deleteDir( tempDir() );
-        
-    }      
-    
+
+    }
+
 }

Modified: labs/jbossrules/branches/serialization/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/branches/serialization/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-12-23 06:21:21 UTC (rev 17376)
+++ labs/jbossrules/branches/serialization/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-12-23 06:22:55 UTC (rev 17377)
@@ -854,7 +854,7 @@
 		assertNotNull(binPackage);
 
 		ByteArrayInputStream bin = new ByteArrayInputStream(binPackage);
-		ObjectInputStream in = new DroolsObjectInputStream(bin);
+		DroolsObjectInputStream in = new DroolsObjectInputStream(bin);
 		Package binPkg = (Package) in.readObject();
 
 		assertNotNull(binPkg);
@@ -950,7 +950,7 @@
 		assertNotNull(binPackage);
 
 		ByteArrayInputStream bin = new ByteArrayInputStream(binPackage);
-		ObjectInputStream in = new DroolsObjectInputStream(bin);
+		DroolsObjectInputStream in = new DroolsObjectInputStream(bin);
 		Package binPkg = (Package) in.readObject();
 
 		assertNotNull(binPkg);




More information about the jboss-svn-commits mailing list