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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 14 16:16:14 EDT 2009


Author: tirelli
Date: 2009-09-14 16:16:14 -0400 (Mon, 14 Sep 2009)
New Revision: 29340

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
Log:
JBRULES-1946: fixing serialization using non-drools streams

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2009-09-14 17:03:55 UTC (rev 29339)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2009-09-14 20:16:14 UTC (rev 29340)
@@ -8,6 +8,7 @@
 import java.io.InputStreamReader;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.OptionalDataException;
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -54,6 +55,7 @@
 import org.drools.marshalling.MarshallerFactory;
 import org.drools.marshalling.ObjectMarshallingStrategy;
 import org.drools.marshalling.ObjectMarshallingStrategyAcceptor;
+import org.drools.marshalling.impl.OutputMarshaller;
 import org.drools.marshalling.impl.RuleBaseNodes;
 import org.drools.reteoo.ObjectTypeNode;
 import org.drools.reteoo.ReteooStatefulSession;
@@ -2308,7 +2310,112 @@
             fail(e.getMessage());
         }
     }
+    
+    public void testJBRULES_1946() {
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "Sample.drl" ) ),
+                      ResourceType.DRL );
+        
+        assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+        
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = new ObjectOutputStream(baos);
+            
+            oos.writeObject(kbase);
+            oos.flush();
+            oos.close();
+            baos.flush();
+            baos.close();
+            
+            byte[] serializedKb = baos.toByteArray();
+            
+            ByteArrayInputStream bais = new ByteArrayInputStream(serializedKb);
+            ObjectInputStream ois = new ObjectInputStream(bais);
+            
+            KnowledgeBase kb2 = (KnowledgeBase) ois.readObject();
+        } catch (OptionalDataException ode) {
+            ode.printStackTrace();
+            fail("EOF? "+ode.eof);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Unexpected exception: "+e.getMessage());
+        }
+    }
 
+    public void testJBRULES_1946_2() {
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "Sample.drl" ) ),
+                      ResourceType.DRL );
+        
+        assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+        
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            DroolsObjectOutputStream oos = new DroolsObjectOutputStream(baos);
+            
+            oos.writeObject(kbase);
+            oos.flush();
+            oos.close();
+            baos.flush();
+            baos.close();
+            
+            byte[] serializedKb = baos.toByteArray();
+            
+            ByteArrayInputStream bais = new ByteArrayInputStream(serializedKb);
+            DroolsObjectInputStream ois = new DroolsObjectInputStream(bais);
+            
+            KnowledgeBase kb2 = (KnowledgeBase) ois.readObject();
+        } catch (OptionalDataException ode) {
+            ode.printStackTrace();
+            fail("EOF? "+ode.eof);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Unexpected exception: "+e.getMessage());
+        }
+    }
+
+    public void testJBRULES_1946_3() {
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "Sample.drl" ) ),
+                      ResourceType.DRL );
+        
+        assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+        
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            DroolsObjectOutputStream oos = new DroolsObjectOutputStream(baos);
+            
+            oos.writeObject(kbase);
+            oos.flush();
+            oos.close();
+            baos.flush();
+            baos.close();
+            
+            byte[] serializedKb = baos.toByteArray();
+            
+            ByteArrayInputStream bais = new ByteArrayInputStream(serializedKb);
+            ObjectInputStream ois = new ObjectInputStream(bais);
+            
+            KnowledgeBase kb2 = (KnowledgeBase) ois.readObject();
+            fail("Should have raised an IllegalArgumentException since the kbase was serialized with a Drools Stream but deserialized with a regular stream");
+        } catch (IllegalArgumentException ode) {
+            // success
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Unexpected exception: "+e.getMessage());
+        }
+    }
+
     private Marshaller createSerializableMarshaller(KnowledgeBase knowledgeBase) {
         ObjectMarshallingStrategyAcceptor acceptor = MarshallerFactory.newClassFilterAcceptor( new String[]{"*.*"} );
         ObjectMarshallingStrategy strategy = MarshallerFactory.newSerializeMarshallingStrategy( acceptor );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-09-14 17:03:55 UTC (rev 29339)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2009-09-14 20:16:14 UTC (rev 29340)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.Externalizable;
 import java.io.IOException;
@@ -216,6 +217,8 @@
         this.eventSupport.removeEventListener( RuleBaseEventListener.class );
         droolsStream.writeObject( this.eventSupport );
         if ( !isDrools ) {
+            droolsStream.flush();
+            droolsStream.close();
             bytes.close();
             out.writeObject( bytes.toByteArray() );
         }
@@ -239,13 +242,14 @@
                                                   ClassNotFoundException {
         // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
         DroolsObjectInput droolsStream;
-        boolean isDrools = in instanceof DroolsObjectInput;
+        boolean isDrools = in instanceof DroolsObjectInputStream;
+        ByteArrayInputStream bytes = null;
 
         if ( isDrools ) {
             droolsStream = (DroolsObjectInput) in;
         } else {
-            droolsStream = new DroolsObjectInputStream( (ObjectInputStream) in );
-
+            bytes = new ByteArrayInputStream( (byte[]) in.readObject() );
+            droolsStream = new DroolsObjectInputStream( bytes );
         }
 
         this.rootClassLoader = new CompositeClassLoader( droolsStream.getParentClassLoader() );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2009-09-14 17:03:55 UTC (rev 29339)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2009-09-14 20:16:14 UTC (rev 29340)
@@ -305,7 +305,10 @@
         droolsStream.writeObject( idGenerator );
         droolsStream.writeBoolean( ordered );
         if ( !isDrools ) {
+            droolsStream.flush();
+            droolsStream.close();
             bytes.close();
+            out.writeInt( bytes.size() );
             out.writeObject( bytes.toByteArray() );
         }
     }
@@ -323,15 +326,20 @@
             bytes = new ByteArrayInputStream( (byte[]) in.readObject() );
             droolsStream = new DroolsObjectInputStream( bytes );
         }
-        this.rules = (Map<Rule, BaseNode[]>) in.readObject();
-        this.idGenerator = (IdGenerator) in.readObject();
-        this.ordered = in.readBoolean();
-        this.ruleBase = droolsStream.getRuleBase();
+        
+        this.rules = (Map<Rule, BaseNode[]>) droolsStream.readObject();
+        this.idGenerator = (IdGenerator) droolsStream.readObject();
+        this.ordered = droolsStream.readBoolean();
         if ( !isDrools ) {
+            droolsStream.close();
             bytes.close();
         }
 
         this.ruleBuilder = new ReteooRuleBuilder();
     }
 
+    public void setRuleBase(ReteooRuleBase reteooRuleBase) {
+        this.ruleBase = reteooRuleBase;
+    }
+
 }

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	2009-09-14 17:03:55 UTC (rev 29339)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-09-14 20:16:14 UTC (rev 29340)
@@ -17,6 +17,7 @@
  */
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectInputStream;
@@ -35,6 +36,9 @@
 import org.drools.StatelessSession;
 import org.drools.common.AbstractRuleBase;
 import org.drools.common.DefaultFactHandle;
+import org.drools.common.DroolsObjectInput;
+import org.drools.common.DroolsObjectInputStream;
+import org.drools.common.DroolsObjectOutputStream;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.RuleBasePartitionId;
@@ -167,9 +171,28 @@
      *
      */
     public void writeExternal(final ObjectOutput stream) throws IOException {
-        super.writeExternal( stream );
-        stream.writeObject( this.reteooBuilder );
-        stream.writeObject( this.rete );
+        DroolsObjectOutputStream droolsStream = null;
+        boolean isDrools = stream instanceof DroolsObjectOutputStream; 
+        ByteArrayOutputStream bytes = null;
+        
+        stream.writeBoolean( isDrools );
+        if ( isDrools ) {
+            droolsStream = (DroolsObjectOutputStream) stream;
+        } else {
+            bytes = new ByteArrayOutputStream();
+            droolsStream = new DroolsObjectOutputStream( bytes );
+        }
+        
+        super.writeExternal( droolsStream );
+        droolsStream.writeObject( this.reteooBuilder );
+        droolsStream.writeObject( this.rete );
+        
+        if ( !isDrools ) {
+            droolsStream.flush();
+            droolsStream.close();
+            bytes.close();
+            stream.writeObject( bytes.toByteArray() );
+        }
     }
 
     /**
@@ -180,9 +203,30 @@
      */
     public void readExternal(final ObjectInput stream) throws IOException,
                                                       ClassNotFoundException {
-        super.readExternal( stream );
-        this.reteooBuilder = (ReteooBuilder) stream.readObject();
-        this.rete = (Rete) stream.readObject();
+        DroolsObjectInput droolsStream = null;
+        boolean isDrools = stream instanceof DroolsObjectInputStream;
+        ByteArrayInputStream bytes = null;
+
+        boolean wasDrools = stream.readBoolean();
+        if( wasDrools && !isDrools) {
+            throw new IllegalArgumentException("The knowledge base was serialized using a DroolsObjectOutputStream. A DroolsObjectInputStream is required for deserialization.");
+        }
+        
+        if ( wasDrools ) {
+            droolsStream = (DroolsObjectInput) stream;
+        } else {
+            bytes = new ByteArrayInputStream( (byte[]) stream.readObject() );
+            droolsStream = new DroolsObjectInputStream( bytes );
+        }
+        
+        super.readExternal( droolsStream );
+        this.reteooBuilder = (ReteooBuilder) droolsStream.readObject();
+        this.reteooBuilder.setRuleBase( this );
+        this.rete = (Rete) droolsStream.readObject();
+        
+        if( !wasDrools ) {
+            droolsStream.close();
+        }
     }
 
     // ------------------------------------------------------------

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2009-09-14 17:03:55 UTC (rev 29339)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2009-09-14 20:16:14 UTC (rev 29340)
@@ -143,7 +143,6 @@
         } else {
             out.writeObject(this.consequence);   
         } 
-        
         out.writeObject(duration);
         out.writeLong(loadOrder);
         out.writeBoolean(noLoop);



More information about the jboss-svn-commits mailing list