[jboss-svn-commits] JBL Code SVN: r20008 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun May 18 18:07:09 EDT 2008


Author: KrisVerlaenen
Date: 2008-05-18 18:07:09 -0400 (Sun, 18 May 2008)
New Revision: 20008

Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
Log:
JBRULES-1610: Binary serialization for processes
 - core implementation

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-05-18 22:07:02 UTC (rev 20007)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-05-18 22:07:09 UTC (rev 20008)
@@ -1,10 +1,7 @@
 package org.drools.marshalling;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.Queue;
 
@@ -24,6 +21,9 @@
 import org.drools.common.RuleFlowGroupImpl;
 import org.drools.common.TruthMaintenanceSystem;
 import org.drools.concurrent.ExecutorService;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.impl.WorkItemImpl;
 import org.drools.reteoo.BetaMemory;
 import org.drools.reteoo.BetaNode;
 import org.drools.reteoo.EntryPointNode;
@@ -32,14 +32,10 @@
 import org.drools.reteoo.InitialFactHandle;
 import org.drools.reteoo.InitialFactHandleDummyObject;
 import org.drools.reteoo.JoinNode;
-import org.drools.reteoo.LeftInputAdapterNode;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleSink;
-import org.drools.reteoo.LeftTupleSource;
 import org.drools.reteoo.NotNode;
-import org.drools.reteoo.ObjectSink;
 import org.drools.reteoo.ObjectTypeNode;
-import org.drools.reteoo.ReteooFactHandleFactory;
 import org.drools.reteoo.ReteooStatefulSession;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.reteoo.RightTuple;
@@ -51,17 +47,22 @@
 import org.drools.rule.GroupElement;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.spi.Activation;
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.spi.RuleFlowGroup;
-import org.drools.util.BinaryHeapQueue;
-import org.drools.util.Iterator;
-import org.drools.util.ObjectHashMap;
 import org.drools.util.ObjectHashSet;
-import org.drools.util.ObjectHashSet.ObjectEntry;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.node.EventNodeInstance;
+import org.drools.workflow.instance.node.MilestoneNodeInstance;
+import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
 
 public class InputMarshaller {
     public static ReteooStatefulSession readSession(MarshallerReaderContext context,
@@ -102,7 +103,11 @@
         if ( context.readBoolean() ) {
             readTruthMaintenanceSystem( context );
         }
+        
+        readProcessInstances( context );
 
+        readWorkItems( context );
+
         return session;
     }
     
@@ -510,4 +515,95 @@
         context.propagationContexts.put( propagationNumber,
                                          pc );
     }
+
+    public static void readProcessInstances(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        while ( stream.readInt() == PersisterEnums.PROCESS_INSTANCE ) {
+            readProcessInstance( context );
+        }
+    }
+
+    public static ProcessInstance readProcessInstance(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        InternalRuleBase ruleBase = context.ruleBase;
+        InternalWorkingMemory wm = context.wm;
+        
+        RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
+        processInstance.setId(stream.readLong());
+        processInstance.setProcess(ruleBase.getProcess(stream.readUTF()));
+        processInstance.setState(stream.readInt());
+        long nodeInstanceCounter = stream.readLong();
+        processInstance.setWorkingMemory(wm);
+        
+        while ( stream.readInt() == PersisterEnums.NODE_INSTANCE ) {
+            readNodeInstance( context, processInstance );
+        }
+        
+        processInstance.internalSetNodeInstanceCounter(nodeInstanceCounter);
+        wm.addProcessInstance(processInstance);
+        return processInstance;
+    }
+    
+    public static NodeInstance readNodeInstance(MarshallerReaderContext context,
+                                                RuleFlowProcessInstance processInstance) throws IOException {
+        ObjectInputStream stream = context.stream;
+        NodeInstanceImpl nodeInstance = null;
+        long id = stream.readLong();
+        long nodeId = stream.readLong();
+        int nodeType = stream.readInt();
+        switch (nodeType) {
+            case PersisterEnums.RULE_SET_NODE_INSTANCE:
+                nodeInstance = new RuleSetNodeInstance();
+                break;
+            case PersisterEnums.WORK_ITEM_NODE_INSTANCE:
+                nodeInstance = new WorkItemNodeInstance();
+                ((WorkItemNodeInstance) nodeInstance)
+                    .internalSetWorkItemId(stream.readLong());
+                break;
+            case PersisterEnums.SUB_PROCESS_NODE_INSTANCE:
+                nodeInstance = new SubProcessNodeInstance();
+                ((SubProcessNodeInstance) nodeInstance)
+                    .internalSetProcessInstanceId(stream.readLong());
+                break;
+            case PersisterEnums.MILESTONE_NODE_INSTANCE:
+                nodeInstance = new MilestoneNodeInstance();
+                break;
+            case PersisterEnums.TIMER_NODE_INSTANCE:
+                nodeInstance = new TimerNodeInstance();
+                ((TimerNodeInstance) nodeInstance)
+                    .internalSetTimerId(stream.readLong());
+                break;
+            default:
+                throw new IllegalArgumentException(
+                    "Unknown node type: " + nodeType);
+        }
+        nodeInstance.setNodeId(nodeId);
+        nodeInstance.setNodeInstanceContainer(processInstance);
+        nodeInstance.setProcessInstance(processInstance);
+        nodeInstance.setId(id);
+        ((EventNodeInstance) nodeInstance).addEventListeners();
+        return nodeInstance;
+    }
+
+    public static void readWorkItems(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        while ( stream.readInt() == PersisterEnums.WORK_ITEM ) {
+            readWorkItem( context );
+        }
+    }
+
+    public static WorkItem readWorkItem(MarshallerReaderContext context) throws IOException {
+        ObjectInputStream stream = context.stream;
+        InternalWorkingMemory wm = context.wm;
+        
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setId(stream.readLong());
+        workItem.setProcessInstanceId(stream.readLong());
+        workItem.setName(stream.readUTF());
+        workItem.setState(stream.readInt());
+        
+        wm.getWorkItemManager().internalAddWorkItem(workItem);
+        return workItem;
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-05-18 22:07:02 UTC (rev 20007)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java	2008-05-18 22:07:09 UTC (rev 20008)
@@ -1,26 +1,21 @@
 package org.drools.marshalling;
 
 import java.io.IOException;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.io.OutputStream;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
 import java.util.Map;
+import java.util.Set;
 import java.util.Map.Entry;
 
 import org.drools.InitialFact;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ShadowProxy;
-import org.drools.common.AbstractFactHandleFactory;
 import org.drools.common.AgendaItem;
-import org.drools.common.BinaryHeapQueueAgendaGroup;
 import org.drools.common.DefaultAgenda;
 import org.drools.common.EqualityKey;
 import org.drools.common.InternalFactHandle;
@@ -28,37 +23,35 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.LogicalDependency;
 import org.drools.common.ObjectStore;
-import org.drools.common.PropagationContextImpl;
 import org.drools.common.RuleFlowGroupImpl;
 import org.drools.common.WorkingMemoryAction;
-import org.drools.marshalling.Placeholders.PlaceholderEntry;
-import org.drools.reteoo.BetaMemory;
-import org.drools.reteoo.BetaNode;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
 import org.drools.reteoo.EvalConditionNode;
 import org.drools.reteoo.ExistsNode;
 import org.drools.reteoo.JoinNode;
-import org.drools.reteoo.LeftInputAdapterNode;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleSink;
 import org.drools.reteoo.NotNode;
 import org.drools.reteoo.ObjectTypeNode;
-import org.drools.reteoo.ReteooFactHandleFactory;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.reteoo.RightTuple;
-import org.drools.reteoo.RightTupleSink;
 import org.drools.reteoo.RuleTerminalNode;
-import org.drools.reteoo.EvalConditionNode.EvalMemory;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
-import org.drools.spi.Activation;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.spi.ActivationGroup;
 import org.drools.spi.AgendaGroup;
-import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;
 import org.drools.spi.RuleFlowGroup;
 import org.drools.util.ObjectHashMap;
 import org.drools.util.ObjectHashSet;
-import org.drools.util.ObjectHashSet.ObjectEntry;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.MilestoneNodeInstance;
+import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.drools.workflow.instance.node.TimerNodeInstance;
+import org.drools.workflow.instance.node.WorkItemNodeInstance;
 
 public class OutputMarshaller {
     public static void writeSession(MarshallerWriteContext context) throws IOException {
@@ -88,6 +81,10 @@
         } else {
             context.writeBoolean( false );
         }
+        
+        writeProcessInstances( context );
+        
+        writeWorkItems( context );
     }
 
     public static void writeAgenda(MarshallerWriteContext context) throws IOException {
@@ -584,4 +581,74 @@
         stream.writeUTF( pc.getEntryPoint().getEntryPointId() );
     }
 
+    public static void writeProcessInstances(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        Collection<ProcessInstance> processInstances = context.wm.getProcessInstances();
+        for (ProcessInstance processInstance: processInstances) {
+            stream.writeInt( PersisterEnums.PROCESS_INSTANCE );
+            writeProcessInstance( context, (RuleFlowProcessInstance) processInstance );
+        }
+        stream.writeInt( PersisterEnums.END );
+    }
+    
+    public static void writeProcessInstance(MarshallerWriteContext context,
+                                            RuleFlowProcessInstance processInstance) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong(processInstance.getId());
+        stream.writeUTF(processInstance.getProcessId());
+        stream.writeInt(processInstance.getState());
+        stream.writeLong(processInstance.getNodeInstanceCounter());
+        
+        for (NodeInstance nodeInstance: processInstance.getNodeInstances()) {
+            stream.writeInt( PersisterEnums.NODE_INSTANCE );
+            writeNodeInstance( context, nodeInstance );
+        }
+        stream.writeInt( PersisterEnums.END );
+    }
+    
+    public static void writeNodeInstance(MarshallerWriteContext context,
+                                         NodeInstance nodeInstance) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong(nodeInstance.getId());
+        stream.writeLong(nodeInstance.getNodeId());
+        if (nodeInstance instanceof RuleSetNodeInstance) {
+            stream.writeInt(PersisterEnums.RULE_SET_NODE_INSTANCE);
+        } else if (nodeInstance instanceof WorkItemNodeInstance) {
+            stream.writeInt(PersisterEnums.WORK_ITEM_NODE_INSTANCE);
+            stream.writeLong(((WorkItemNodeInstance) nodeInstance).getWorkItem().getId());
+        } else if (nodeInstance instanceof SubProcessNodeInstance) {
+            stream.writeInt(PersisterEnums.SUB_PROCESS_NODE_INSTANCE);
+            stream.writeLong(((SubProcessNodeInstance) nodeInstance).getProcessInstanceId());
+        } else if (nodeInstance instanceof MilestoneNodeInstance) {
+            stream.writeInt(PersisterEnums.MILESTONE_NODE_INSTANCE);
+        } else if (nodeInstance instanceof TimerNodeInstance) {
+            stream.writeInt(PersisterEnums.TIMER_NODE_INSTANCE);
+            stream.writeLong(((TimerNodeInstance) nodeInstance).getTimerId());
+        } else {
+            throw new IllegalArgumentException(
+                "Unknown node instance type: " + nodeInstance);
+        }
+    }
+
+    public static void writeWorkItems(MarshallerWriteContext context) throws IOException {
+        ObjectOutputStream stream = context.stream;
+
+        Set<WorkItem> workItems = context.wm.getWorkItemManager().getWorkItems();
+        for (WorkItem workItem: workItems) {
+            stream.writeInt( PersisterEnums.WORK_ITEM );
+            writeWorkItem( context, workItem );
+        }
+        stream.writeInt( PersisterEnums.END );
+    }
+    
+    public static void writeWorkItem(MarshallerWriteContext context,
+                                     WorkItem workItem) throws IOException {
+        ObjectOutputStream stream = context.stream;
+        stream.writeLong(workItem.getId());
+        stream.writeLong(workItem.getProcessInstanceId());
+        stream.writeUTF(workItem.getName());
+        stream.writeInt(workItem.getState());
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java	2008-05-18 22:07:02 UTC (rev 20007)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java	2008-05-18 22:07:09 UTC (rev 20008)
@@ -25,4 +25,14 @@
     
     public static final int RULE_FLOW_GROUP        = 15;
     public static final int RULE_FLOW_NODE         = 16;
+    
+    public static final int PROCESS_INSTANCE          = 17;
+    public static final int NODE_INSTANCE             = 18;
+    public static final int WORK_ITEM                 = 19;
+    public static final int RULE_SET_NODE_INSTANCE    = 20;
+    public static final int WORK_ITEM_NODE_INSTANCE   = 21;
+    public static final int SUB_PROCESS_NODE_INSTANCE = 22;
+    public static final int MILESTONE_NODE_INSTANCE   = 23;
+    public static final int TIMER_NODE_INSTANCE       = 24;
+
 }




More information about the jboss-svn-commits mailing list