[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