[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