[jboss-svn-commits] JBL Code SVN: r33405 - in labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence: drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jun 8 13:47:07 EDT 2010


Author: salaboy21
Date: 2010-06-08 13:47:07 -0400 (Tue, 08 Jun 2010)
New Revision: 33405

Modified:
   labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
   labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
   labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
   labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
   labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java
Log:
JBRULES-2345: Work items should also support pluggable parameter persistence
  - Adding support for variable persistence strategies inside work items

Modified: labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
===================================================================
--- labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java	2010-06-08 16:43:21 UTC (rev 33404)
+++ labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java	2010-06-08 17:47:07 UTC (rev 33405)
@@ -737,6 +737,10 @@
     }
 
     public static WorkItem readWorkItem(MarshallerReaderContext context) throws IOException {
+       return readWorkItem(context, true);
+    }
+
+    public static WorkItem readWorkItem(MarshallerReaderContext context, boolean includeVariables) throws IOException {
         ObjectInputStream stream = context.stream;
 
         WorkItemImpl workItem = new WorkItemImpl();
@@ -745,16 +749,18 @@
         workItem.setName( stream.readUTF() );
         workItem.setState( stream.readInt() );
 
-        int nbParameters = stream.readInt();
+        if(includeVariables){
+            int nbParameters = stream.readInt();
 
-        for ( int i = 0; i < nbParameters; i++ ) {
-            String name = stream.readUTF();
-            try {
-                Object value = stream.readObject();
-                workItem.setParameter( name,
-                                       value );
-            } catch ( ClassNotFoundException e ) {
-                throw new IllegalArgumentException( "Could not reload parameter " + name );
+            for ( int i = 0; i < nbParameters; i++ ) {
+                String name = stream.readUTF();
+                try {
+                    Object value = stream.readObject();
+                    workItem.setParameter( name,
+                                           value );
+                } catch ( ClassNotFoundException e ) {
+                    throw new IllegalArgumentException( "Could not reload parameter " + name );
+                }
             }
         }
 

Modified: labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
===================================================================
--- labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	2010-06-08 16:43:21 UTC (rev 33404)
+++ labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	2010-06-08 17:47:07 UTC (rev 33405)
@@ -733,19 +733,26 @@
         }
         stream.writeShort( PersisterEnums.END );
     }
+    public static void writeWorkItem(MarshallerWriteContext context,
+                                     WorkItem workItem) throws IOException {
+         writeWorkItem(context, workItem, true);
+    }
 
     public static void writeWorkItem(MarshallerWriteContext context,
-                                     WorkItem workItem) throws IOException {
+                                     WorkItem workItem, boolean includeVariables) throws IOException {
         ObjectOutputStream stream = context.stream;
         stream.writeLong( workItem.getId() );
         stream.writeLong( workItem.getProcessInstanceId() );
         stream.writeUTF( workItem.getName() );
         stream.writeInt( workItem.getState() );
-        Map<String, Object> parameters = workItem.getParameters();
-        stream.writeInt( parameters.size() );
-        for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
-            stream.writeUTF( entry.getKey() );
-            stream.writeObject( entry.getValue() );
+
+        if(includeVariables){
+            Map<String, Object> parameters = workItem.getParameters();
+            stream.writeInt( parameters.size() );
+            for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
+                stream.writeUTF( entry.getKey() );
+                stream.writeObject( entry.getValue() );
+            }
         }
     }
 

Modified: labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2010-06-08 16:43:21 UTC (rev 33404)
+++ labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2010-06-08 17:47:07 UTC (rev 33405)
@@ -12,48 +12,50 @@
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.runtime.Environment;
 import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.process.WorkItemHandler;
 
 public class JPAWorkItemManager implements WorkItemManager {
 
     private WorkingMemory workingMemory;
-	private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
+    private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
     private transient Map<Long, WorkItemInfo> workItems;
-    
+
     public JPAWorkItemManager(WorkingMemory workingMemory) {
-    	this.workingMemory = workingMemory;
+        this.workingMemory = workingMemory;
     }
-    
 
-	public void internalExecuteWorkItem(WorkItem workItem) {
-	    EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
-	    
-		WorkItemInfo workItemInfo = new WorkItemInfo(workItem);
+    public void internalExecuteWorkItem(WorkItem workItem) {
+        Environment env = this.workingMemory.getEnvironment();
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
+        WorkItemInfo workItemInfo = new WorkItemInfo(workItem, env);
         em.persist(workItemInfo);
         ((WorkItemImpl) workItem).setId(workItemInfo.getId());
         workItemInfo.update();
-        
-		if (this.workItems == null) {
-        	this.workItems = new HashMap<Long, WorkItemInfo>();
+
+        if (this.workItems == null) {
+            this.workItems = new HashMap<Long, WorkItemInfo>();
         }
-		workItems.put(workItem.getId(), workItemInfo);
-        
+        workItems.put(workItem.getId(), workItemInfo);
+
         WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
-	    if (handler != null) {
-	        handler.executeWorkItem(workItem, this);
-	    } else {
-	        System.err.println("Could not find work item handler for " + workItem.getName());
-	    }
-	}
+        if (handler != null) {
+            handler.executeWorkItem(workItem, this);
+        } else {
+            System.err.println("Could not find work item handler for " + workItem.getName());
+        }
+    }
 
-	public void internalAbortWorkItem(long id) {
-	    EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
-	    
+    public void internalAbortWorkItem(long id) {
+        Environment env = this.workingMemory.getEnvironment();
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
         WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
         // work item may have been aborted
         if (workItemInfo != null) {
-        	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
             WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
             if (handler != null) {
                 handler.abortWorkItem(workItem, this);
@@ -61,33 +63,34 @@
                 System.err.println("Could not find work item handler for " + workItem.getName());
             }
             if (workItems != null) {
-            	workItems.remove(id);
+                workItems.remove(id);
             }
             em.remove(workItemInfo);
         }
-	}
+    }
 
-	public void internalAddWorkItem(WorkItem workItem) {
-	}
+    public void internalAddWorkItem(WorkItem workItem) {
+    }
 
     public void completeWorkItem(long id, Map<String, Object> results) {
-        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
-        
+        Environment env = this.workingMemory.getEnvironment();
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
         WorkItemInfo workItemInfo = null;
         if (this.workItems != null) {
-	    	workItemInfo = this.workItems.get(id);
-	    	if (workItemInfo != null) {
-	    		workItemInfo = em.merge(workItemInfo);
-	    	}
-    	}
-        
+            workItemInfo = this.workItems.get(id);
+            if (workItemInfo != null) {
+                workItemInfo = em.merge(workItemInfo);
+            }
+        }
+
         if (workItemInfo == null) {
-        	workItemInfo = em.find(WorkItemInfo.class, id);
+            workItemInfo = em.find(WorkItemInfo.class, id);
         }
-        
-    	// work item may have been aborted
+
+        // work item may have been aborted
         if (workItemInfo != null) {
-    		WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
             workItem.setResults(results);
             ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
             workItem.setState(WorkItem.COMPLETED);
@@ -97,28 +100,29 @@
             }
             em.remove(workItemInfo);
             if (workItems != null) {
-            	this.workItems.remove(workItem.getId());
+                this.workItems.remove(workItem.getId());
             }
             workingMemory.fireAllRules();
-    	}
+        }
     }
 
     public void abortWorkItem(long id) {
-        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
-        
+        Environment env = this.workingMemory.getEnvironment();
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
         WorkItemInfo workItemInfo = null;
         if (this.workItems != null) {
-	    	workItemInfo = this.workItems.get(id);
-	    	em.merge(workItemInfo);
-    	}
-        
+            workItemInfo = this.workItems.get(id);
+            em.merge(workItemInfo);
+        }
+
         if (workItemInfo == null) {
-        	workItemInfo = em.find(WorkItemInfo.class, id);
+            workItemInfo = em.find(WorkItemInfo.class, id);
         }
-        
-    	// work item may have been aborted
+
+        // work item may have been aborted
         if (workItemInfo != null) {
-    		WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
             ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
             workItem.setState(WorkItem.ABORTED);
             // process instance may have finished already
@@ -127,41 +131,43 @@
             }
             em.remove(workItemInfo);
             if (workItems != null) {
-            	workItems.remove(workItem.getId());
+                workItems.remove(workItem.getId());
             }
             workingMemory.fireAllRules();
         }
     }
 
-	public WorkItem getWorkItem(long id) {
+    public WorkItem getWorkItem(long id) {
+        Environment env = this.workingMemory.getEnvironment();
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
         WorkItemInfo workItemInfo = null;
         if (this.workItems != null) {
-	    	workItemInfo = this.workItems.get(id);
-    	}
-        
-        if (workItemInfo == null) {
-            EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
-        	workItemInfo = em.find(WorkItemInfo.class, id);
+            workItemInfo = this.workItems.get(id);
         }
 
+        if (workItemInfo == null && em != null) {
+
+            workItemInfo = em.find(WorkItemInfo.class, id);
+        }
+
         if (workItemInfo == null) {
             return null;
         }
-        return workItemInfo.getWorkItem();
-	}
+        return workItemInfo.getWorkItem(env);
+    }
 
-	public Set<WorkItem> getWorkItems() {
-		return new HashSet<WorkItem>();
-	}
+    public Set<WorkItem> getWorkItems() {
+        return new HashSet<WorkItem>();
+    }
 
-	public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+    public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
         this.workItemHandlers.put(workItemName, handler);
-	}
+    }
 
     public void clearWorkItems() {
-    	if (workItems != null) {
-    		workItems.clear();
-    	}
+        if (workItems != null) {
+            workItems.clear();
+        }
     }
-
 }

Modified: labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2010-06-08 16:43:21 UTC (rev 33404)
+++ labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2010-06-08 17:47:07 UTC (rev 33405)
@@ -3,14 +3,22 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.persistence.CascadeType;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.JoinColumn;
 import javax.persistence.Lob;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
 import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
 import javax.persistence.Version;
@@ -19,11 +27,15 @@
 import org.drools.marshalling.impl.MarshallerReaderContext;
 import org.drools.marshalling.impl.MarshallerWriteContext;
 import org.drools.marshalling.impl.OutputMarshaller;
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
 import org.drools.process.instance.WorkItem;
+import org.drools.runtime.Environment;
 
 @Entity
 public class WorkItemInfo {
 
+    private static final String               VARIABLE_SEPARATOR = ":";
+
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private long   workItemId;
@@ -41,14 +53,25 @@
     private @Transient
     WorkItem       workItem;
 
+    private @Transient
+    Environment                               env;
+    @OneToMany(cascade = CascadeType.ALL)
+    @JoinColumn(name = "workItemId")
+    @MapKey(name = "name")
+    private Map<String, VariableInstanceInfo> variables          = new HashMap<String, VariableInstanceInfo>();
+    private boolean                           externalVariables  = false;
+
+
+
     protected WorkItemInfo() {
     }
 
-    public WorkItemInfo(WorkItem workItem) {
+    public WorkItemInfo(WorkItem workItem, Environment env) {
         this.workItem = workItem;
         this.name = workItem.getName();
         this.creationDate = new Date();
         this.processInstanceId = workItem.getProcessInstanceId();
+        this.env = env;
     }
 
     public long getId() {
@@ -75,7 +98,8 @@
         return state;
     }
 
-    public WorkItem getWorkItem() {
+    public WorkItem getWorkItem(Environment env) {
+        this.env = env;
         if ( workItem == null ) {
             try {
                 ByteArrayInputStream bais = new ByteArrayInputStream( workItemByteArray );
@@ -83,7 +107,10 @@
                                                                                null,
                                                                                null,
                                                                                null );
-                workItem = InputMarshaller.readWorkItem( context );
+                workItem = InputMarshaller.readWorkItem( context, !externalVariables );
+                 if ( externalVariables ) {
+                    restoreVariables();
+                }
                 context.close();
             } catch ( IOException e ) {
                 e.printStackTrace();
@@ -93,18 +120,59 @@
         return workItem;
     }
 
+     private void restoreVariables() {
+
+         System.out.println("########### Restoring Variables #################");
+         System.out.println("EntrySet = "+ variables.entrySet());
+        for ( Map.Entry<String, VariableInstanceInfo> entry : variables.entrySet() ) {
+            String[] variableHierarchy = entry.getKey().split( VARIABLE_SEPARATOR );
+            // last one is variable name
+            String variableName = variableHierarchy[variableHierarchy.length - 1];
+            // other ones are parent ids
+            List<Long> parentIds = new ArrayList<Long>();
+            for ( int i = 0; i < variableHierarchy.length - 1; i++ ) {
+                parentIds.add( Long.valueOf( variableHierarchy[i] ) );
+            }
+            restoreVariable( entry.getValue(),
+                             parentIds,
+                             variableName,
+                             workItem );
+        }
+    }
+
+    private void restoreVariable(VariableInstanceInfo variableInfo,
+                                 List<Long> parentIds,
+                                 String variableName,
+                                 WorkItem workItem) throws NumberFormatException {
+
+            VariablePersistenceStrategy persistenceStrategy = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy();
+            Object value = persistenceStrategy.getVariable( variableInfo,
+                                                            this.env );
+            System.out.println( ">>>>> Restoring variable inside workitem " + variableName + " = " + value );
+            workItem.setParameter( variableName, value );
+
+    }
+
+
     @PreUpdate
     public void update() {
         this.state = workItem.getState();
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        boolean variablesChanged = false;
         try {
             MarshallerWriteContext context = new MarshallerWriteContext( baos,
                                                                          null,
                                                                          null,
                                                                          null,
                                                                          null );
+            externalVariables = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy().isEnabled();
             OutputMarshaller.writeWorkItem( context,
-                                            workItem );
+                                            workItem, !externalVariables );
+
+
+            if ( externalVariables ) {
+                variablesChanged = persistVariables();
+            }
             context.close();
             this.workItemByteArray = baos.toByteArray();
         } catch ( IOException e ) {
@@ -112,4 +180,50 @@
         }
     }
 
+    private boolean persistVariables() {
+        // Get Process Variables
+
+        Map<String, Object> processVariables = workItem.getParameters();
+        Map<String, VariableInstanceInfo> newVariables = new HashMap<String, VariableInstanceInfo>();
+        // persist process variables
+        persist( processVariables,
+                 "workItem.",
+                 newVariables );
+        // persist variables in nested variable scopes
+
+        if ( newVariables.size() > 0 || this.variables.size() > 0 ) {
+            // clear variables so unnecessary values are removed
+            this.variables.clear();
+            this.variables.putAll( newVariables );
+            // TODO: how can I know that no variables were changed?
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private void persist(Map<String, Object> variables,
+                         String prefix,
+                         Map<String, VariableInstanceInfo> newVariables) {
+        VariablePersistenceStrategy persistenceStrategy = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy();
+        for ( Map.Entry<String, Object> entries : variables.entrySet() ) {
+            String variableName = prefix + entries.getKey();
+            Object value = entries.getValue();
+            VariableInstanceInfo oldValue = this.variables.get( variableName );
+            VariableInstanceInfo variable = persistenceStrategy.persistVariable( variableName,
+                                                                                 value,
+                                                                                 oldValue,
+                                                                                 this.env );
+
+            if ( variable != null ) {
+                System.out.println( "<<<<< Persisting variable inside workitem " + variableName + " = " + value );
+                newVariables.put( variableName,
+                                  variable );
+            } else {
+                System.out.println( "<<<<< Variable inside workitem " + variableName + " not persisted (value null)" );
+            }
+        }
+    }
+
+
 }

Modified: labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java
===================================================================
--- labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java	2010-06-08 16:43:21 UTC (rev 33404)
+++ labs/jbossrules/branches/salaboy_diega_workitem_variablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java	2010-06-08 17:47:07 UTC (rev 33405)
@@ -34,6 +34,7 @@
     private String persister;
 
     private  Long processInstanceId;
+    private  Long workItemId;
     public Long getId() {
 		return id;
 	}
@@ -62,10 +63,21 @@
         this.processInstanceId = processInstanceId;
     }
 
+    public Long getWorkItemId() {
+        return workItemId;
+    }
+
+    public void setWorkItemId(Long workItemId) {
+        this.workItemId = workItemId;
+    }
+
     
     
     public String toString() {
-    	return getClass().getName() + " id=" + id + " name=" + name + " persister=" + persister;
+    	return getClass().getName() + " id=" + id + " name=" + name + " "
+                + "persister=" + persister + ""
+                + " processInstanceId=" + processInstanceId
+                + " workItemId=" + workItemId;
     }
 
     @Override



More information about the jboss-svn-commits mailing list