### Eclipse Workspace Patch 1.0 #P trunk Index: drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java =================================================================== --- drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java (revision 25929) +++ drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java (working copy) @@ -7,8 +7,10 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; +import java.io.OutputStream; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; @@ -41,6 +43,8 @@ import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.common.BaseNode; +import org.drools.common.DroolsObjectInputStream; +import org.drools.common.DroolsObjectOutputStream; import org.drools.common.InternalFactHandle; import org.drools.common.InternalRuleBase; import org.drools.compiler.PackageBuilder; @@ -51,6 +55,8 @@ import org.drools.io.ResourceFactory; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; +import org.drools.marshalling.ObjectMarshallingStrategy; +import org.drools.marshalling.ObjectMarshallingStrategyAcceptor; import org.drools.marshalling.impl.DefaultMarshaller; import org.drools.marshalling.impl.RuleBaseNodes; import org.drools.reteoo.ObjectTypeNode; @@ -2074,6 +2080,65 @@ session.getAgenda().getActivations().length ); } + /** + * test that creates a new knowledge base, new stateful session, inserts new + * fact, serializes the knowledge base and session and fact using one output + * stream then deserializes and verifies that fact in the session is the + * same as fact that was deserialized, + * + * from the ObjectOutputStream API: "Multiple references to a single object + * are encoded using a reference sharing mechanism so that graphs of objects + * can be restored to the same shape as when the original was written." + * + * @throws Exception + */ + public void testDroolsObjectOutputInputStream() throws Exception { + Person bob = new Person(); + + KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory + .newKnowledgeBuilder(); + knowledgeBuilder.add(ResourceFactory.newClassPathResource("org/drools/integrationtests/test_Serializable.drl"), + ResourceType.DRL); + + KnowledgeBase knowledgeBase = KnowledgeBaseFactory + .newKnowledgeBase(); + knowledgeBase.addKnowledgePackages(knowledgeBuilder + .getKnowledgePackages()); + + StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession(); + session.insert(bob); + + assertSame("these two object references should be same", bob, session.getObjects().iterator().next()); + + Marshaller marshaller = createSerializableMarshaller(knowledgeBase); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream out = new DroolsObjectOutputStream(baos); + out.writeObject(bob); + out.writeObject(knowledgeBase); + marshaller.marshall(out, session); + out.flush(); + out.close(); + + ObjectInputStream in = new DroolsObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); + Person deserializedBob = (Person) in.readObject(); + knowledgeBase = (KnowledgeBase) in.readObject(); + marshaller = createSerializableMarshaller(knowledgeBase); + session = marshaller.unmarshall(in); + assertSame("these two object references should be same", deserializedBob, session.getObjects().iterator().next()); + in.close(); + } + + private Marshaller createSerializableMarshaller(KnowledgeBase knowledgeBase) { + ObjectMarshallingStrategyAcceptor acceptor = MarshallerFactory + .newClassFilterAcceptor(new String[] { "*.*" }); + ObjectMarshallingStrategy strategy = MarshallerFactory + .newSerializeMarshallingStrategy(acceptor); + Marshaller marshaller = MarshallerFactory.newMarshaller(knowledgeBase, + new ObjectMarshallingStrategy[] { strategy }); + return marshaller; + } + protected RuleBase getRuleBase() throws Exception { return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,