[jboss-svn-commits] JBL Code SVN: r33677 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/audit and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jun 28 17:10:11 EDT 2010


Author: KrisVerlaenen
Date: 2010-06-28 17:10:10 -0400 (Mon, 28 Jun 2010)
New Revision: 33677

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/RuleFlowVariableLogEvent.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/VariableInstanceLog.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/ruleflow3.rf
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEventListenerTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/LogEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowVariableChangeEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAProcessInstanceDbLog.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAWorkingMemoryDbLogger.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/NodeInstanceLog.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/test/java/org/drools/process/audit/JPAWorkingMemoryDbLoggerTest.java
   labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/META-INF/persistence.xml
Log:
JBRULES-2560: Variable information in history log
 - adding VariableInstanceLog


Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEventListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEventListenerTest.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEventListenerTest.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -1,5 +1,4 @@
 /*
- *  Copyright 2009 salaboy.
  * 
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -42,8 +41,6 @@
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.rule.Package;
 
-
-
 /**
  *
  * @author salaboy
@@ -177,9 +174,9 @@
         assertEquals( 26, processEventList.size() );
         assertEquals( "org.drools.event", ((RuleFlowStartedEvent) processEventList.get(0)).getProcessInstance().getProcessId());
 
-        assertEquals("MyVar",((RuleFlowVariableChangeEvent) processEventList.get(4)).getName());
+        assertEquals("MyVar",((RuleFlowVariableChangeEvent) processEventList.get(4)).getVariableId());
         assertEquals("SomeText",((RuleFlowVariableChangeEvent) processEventList.get(4)).getValue());
-        assertEquals("MyVar",((RuleFlowVariableChangeEvent) processEventList.get(5)).getName());
+        assertEquals("MyVar",((RuleFlowVariableChangeEvent) processEventList.get(5)).getVariableId());
         assertEquals("MyValue",((RuleFlowVariableChangeEvent) processEventList.get(5)).getValue());
     }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryLogger.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -35,6 +35,7 @@
 import org.drools.audit.event.RuleFlowGroupLogEvent;
 import org.drools.audit.event.RuleFlowLogEvent;
 import org.drools.audit.event.RuleFlowNodeLogEvent;
+import org.drools.audit.event.RuleFlowVariableLogEvent;
 import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
 import org.drools.command.impl.KnowledgeCommandContext;
 import org.drools.common.InternalFactHandle;
@@ -69,10 +70,12 @@
 import org.drools.event.RuleBaseEventListener;
 import org.drools.event.RuleFlowCompletedEvent;
 import org.drools.event.RuleFlowEventListener;
+import org.drools.event.RuleFlowEventListenerExtension;
 import org.drools.event.RuleFlowGroupActivatedEvent;
 import org.drools.event.RuleFlowGroupDeactivatedEvent;
 import org.drools.event.RuleFlowNodeTriggeredEvent;
 import org.drools.event.RuleFlowStartedEvent;
+import org.drools.event.RuleFlowVariableChangeEvent;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.impl.StatelessKnowledgeSessionImpl;
@@ -103,7 +106,7 @@
     implements
     WorkingMemoryEventListener,
     AgendaEventListener,
-    RuleFlowEventListener,
+    RuleFlowEventListenerExtension,
     RuleBaseEventListener {
 
     private List<ILogEventFilter>    filters = new ArrayList<ILogEventFilter>();
@@ -458,6 +461,28 @@
                 event.getProcessInstance().getId()) );
     }
     
+    public void beforeVariableChange(RuleFlowVariableChangeEvent event,
+                                     WorkingMemory workingMemory) {
+		filterLogEvent(new RuleFlowVariableLogEvent(LogEvent.BEFORE_VARIABLE_INSTANCE_CHANGED,
+			event.getVariableId(),
+			event.getVariableInstanceId(),
+			event.getProcessInstance().getProcessId(),
+			event.getProcessInstance().getProcessName(),
+			event.getProcessInstance().getId(),
+			event.getValue() == null ? "null" : event.getValue().toString() ));
+    }
+
+    public void afterVariableChange(RuleFlowVariableChangeEvent event,
+                                    WorkingMemory workingMemory) {
+		filterLogEvent(new RuleFlowVariableLogEvent(LogEvent.AFTER_VARIABLE_INSTANCE_CHANGED,
+			event.getVariableId(),
+			event.getVariableInstanceId(),
+			event.getProcessInstance().getProcessId(),
+			event.getProcessInstance().getProcessName(),
+			event.getProcessInstance().getId(),
+			event.getValue() == null ? "null" : event.getValue().toString() ));
+    }
+
     private String createNodeId(NodeInstance nodeInstance) {
     	Node node = ((org.drools.workflow.instance.NodeInstance) nodeInstance).getNode();
     	if (node == null) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/LogEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/LogEvent.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/LogEvent.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -28,7 +28,7 @@
  */
 public class LogEvent { // implements Externalizable { This breaks XStream serialization !
 
-public static final int INSERTED                                = 1;
+	public static final int INSERTED                            = 1;
     public static final int UPDATED                             = 2;
     public static final int RETRACTED                           = 3;
 
@@ -65,6 +65,9 @@
     public static final int BEFORE_TASK_INSTANCE_COMPLETED      = 30;
     public static final int AFTER_TASK_INSTANCE_COMPLETED       = 31;
     
+    public static final int BEFORE_VARIABLE_INSTANCE_CHANGED    = 32;
+    public static final int AFTER_VARIABLE_INSTANCE_CHANGED     = 33;
+    
     private int             type;
 
     public LogEvent() {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/RuleFlowVariableLogEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/RuleFlowVariableLogEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/event/RuleFlowVariableLogEvent.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -0,0 +1,70 @@
+package org.drools.audit.event;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+public class RuleFlowVariableLogEvent extends RuleFlowLogEvent {
+    
+    private String variableId;
+    private String variableInstanceId;
+    private String objectToString;
+
+    /**
+     * Create a new ruleflow variable log event.
+     */
+    public RuleFlowVariableLogEvent(final int type,
+                                    final String variableId,
+                                    final String variableInstanceId,
+                                    final String processId,
+                                    final String processName,
+                                    final long processInstanceId,
+                                    final String objectToString) {
+        super( type, processId, processName, processInstanceId );
+        this.variableId = variableId;
+        this.variableInstanceId = variableInstanceId;
+        this.objectToString = objectToString;
+    }
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal(in);
+        variableId = (String) in.readObject();
+        variableInstanceId = (String) in.readObject();
+        objectToString = (String) in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal(out);
+        out.writeObject(variableId);
+        out.writeObject(variableInstanceId);
+        out.writeObject(objectToString);
+    }
+
+    public String getVariableId() {
+		return variableId;
+	}
+
+	public String getVariableInstanceId() {
+		return variableInstanceId;
+	}
+
+	public String getObjectToString() {
+		return objectToString;
+	}
+
+	public String toString() {
+        String msg = null;
+        switch ( this.getType() ) {
+            case BEFORE_VARIABLE_INSTANCE_CHANGED :
+                msg = "BEFORE RULEFLOW VARIABLE CHANGED";
+                break;
+            case AFTER_VARIABLE_INSTANCE_CHANGED :
+                msg = "AFTER RULEFLOW VARIABLE CHANGED";
+                break;
+            default:
+                return super.toString();
+        }
+        return msg + " " + variableId + "=" + objectToString + " process:" + getProcessName() + "[id=" + getProcessId() + "]";
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -189,13 +189,15 @@
     }
 
     public void fireBeforeVariableChange(final ProcessInstance instance,
-                                         final String name,
+                                         final String variableId,
+                                         final String variableInstanceId,
                                          final Object value,
                                          WorkingMemory workingMemory) {
         final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
 
         if (iter.hasNext()) {
-            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value);
+            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(
+        		instance, variableId, variableInstanceId, value);
 
             do{
                 RuleFlowEventListener listener = iter.next();
@@ -207,13 +209,15 @@
     }
 
     public void fireAfterVariableChange(final ProcessInstance instance,
-                                        final String name,
+                                        final String variableId,
+                                        final String variableInstanceId,
                                         final Object value,
                                         WorkingMemory workingMemory) {
         final Iterator<RuleFlowEventListener> iter = getEventListenersIterator();
 
         if (iter.hasNext()) {
-            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(instance, name, value);
+            final RuleFlowVariableChangeEvent event = new RuleFlowVariableChangeEvent(
+        		instance, variableId, variableInstanceId, value);
 
             do{
                 RuleFlowEventListener listener = iter.next();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowVariableChangeEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowVariableChangeEvent.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowVariableChangeEvent.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -1,6 +1,4 @@
 /*
- *  Copyright 2009 salaboy.
- * 
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  You may obtain a copy of the License at
@@ -20,38 +18,50 @@
 import org.drools.runtime.process.ProcessInstance;
 
 /**
- *
+ * @author krisv
  * @author salaboy
  */
 public class RuleFlowVariableChangeEvent extends ProcessEvent {
 
-    private String name;
+	private static final long serialVersionUID = 4L;
+	
+	private String variableId;
+	private String variableInstanceId;
+    private Object value;
 
-    public String getName() {
-        return name;
+    public String getVariableId() {
+        return variableId;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setVariableId(String variableId) {
+        this.variableId = variableId;
     }
 
-    public Object getValue() {
+    public String getVariableInstanceId() {
+		return variableInstanceId;
+	}
+
+	public void setVariableInstanceId(String variableInstanceId) {
+		this.variableInstanceId = variableInstanceId;
+	}
+
+	public Object getValue() {
         return value;
     }
 
     public void setValue(Object value) {
         this.value = value;
     }
-    private Object value;
-    public RuleFlowVariableChangeEvent(ProcessInstance instance,String name, Object value) {
+    
+    public RuleFlowVariableChangeEvent(ProcessInstance instance, String variableId, String variableInstanceId, Object value) {
         super(instance);
-        this.name = name;
+        this.variableId = variableId;
+        this.variableInstanceId = variableInstanceId;
         this.value = value;
-
     }
 
     public String toString() {
-        return "==>[VariableChangeEvent(name=" + getName() + "; value=" + getValue()
+        return "==>[VariableChangeEvent(variableId=" + getVariableId() + "; variableInstanceId=" + getVariableInstanceId() + "; value=" + getValue()
             + "; processName=" + getProcessInstance().getProcessName() + "; processId=" + getProcessInstance().getProcessId() + ")]";
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -9,6 +9,8 @@
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.ContextInstanceContainer;
 import org.drools.process.instance.context.AbstractContextInstance;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
 
 /**
  * 
@@ -19,6 +21,8 @@
     private static final long serialVersionUID = 400L;
     
     private Map<String, Object> variables = new HashMap<String, Object>();
+    private transient String variableIdPrefix = null;
+    private transient String variableInstanceIdPrefix = null;
 
     public String getContextType() {
         return VariableScope.VARIABLE_SCOPE;
@@ -37,12 +41,24 @@
             throw new IllegalArgumentException(
                 "The name of a variable may not be null!");
         }
-        if(getProcessInstance() != null){
-            ((EventSupport) getProcessInstance().getWorkingMemory()).getRuleFlowEventSupport().fireBeforeVariableChange(getProcessInstance(),name, variables.get(name), getProcessInstance().getWorkingMemory());
+        if (getProcessInstance() != null) {
+            ((EventSupport) getProcessInstance().getWorkingMemory()).getRuleFlowEventSupport()
+            	.fireBeforeVariableChange(
+        			getProcessInstance(),
+        			(variableIdPrefix == null ? "" : variableIdPrefix + ":") + name,
+        			(variableInstanceIdPrefix == null? "" : variableInstanceIdPrefix + ":") + name,
+        			variables.get(name),
+        			getProcessInstance().getWorkingMemory());
         }
         variables.put(name, value);
-        if(getProcessInstance() != null){
-            ((EventSupport) getProcessInstance().getWorkingMemory()).getRuleFlowEventSupport().fireAfterVariableChange(getProcessInstance(),name, value, getProcessInstance().getWorkingMemory());
+        if (getProcessInstance() != null) {
+            ((EventSupport) getProcessInstance().getWorkingMemory()).getRuleFlowEventSupport()
+            	.fireAfterVariableChange(
+        			getProcessInstance(),
+        			(variableIdPrefix == null ? "" : variableIdPrefix + ":") + name,
+        			(variableInstanceIdPrefix == null? "" : variableInstanceIdPrefix + ":") + name,
+        			variables.get(name),
+        			getProcessInstance().getWorkingMemory());
         }
     }
     
@@ -55,6 +71,10 @@
     	for (Variable variable : getVariableScope().getVariables()) {
             setVariable(variable.getName(), variable.getValue());
         }
+    	if (contextInstanceContainer instanceof CompositeContextNodeInstance) {
+    		this.variableIdPrefix = ((Node) ((CompositeContextNodeInstance) contextInstanceContainer).getNode()).getUniqueId();
+    		this.variableInstanceIdPrefix = ((CompositeContextNodeInstance) contextInstanceContainer).getUniqueId();
+    	}
     }
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAProcessInstanceDbLog.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAProcessInstanceDbLog.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAProcessInstanceDbLog.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -52,12 +52,29 @@
     @SuppressWarnings("unchecked")
 	public List<NodeInstanceLog> findNodeInstances(long processInstanceId, String nodeId) {
     	List<NodeInstanceLog> result = getEntityManager()
-			.createQuery("FROM NodeInstanceLog n WHERE WHERE n.processInstanceId = :processInstanceId AND n.nodeId = :nodeId ORDER BY date")
+			.createQuery("FROM NodeInstanceLog n WHERE n.processInstanceId = :processInstanceId AND n.nodeId = :nodeId ORDER BY date")
 				.setParameter("processInstanceId", processInstanceId)
 				.setParameter("nodeId", nodeId).getResultList();
     	return result;
     }
 
+    @SuppressWarnings("unchecked")
+	public List<VariableInstanceLog> findVariableInstances(long processInstanceId) {
+    	List<VariableInstanceLog> result = getEntityManager()
+			.createQuery("FROM VariableInstanceLog v WHERE v.processInstanceId = :processInstanceId ORDER BY date")
+				.setParameter("processInstanceId", processInstanceId).getResultList();
+		return result;
+    }
+
+    @SuppressWarnings("unchecked")
+	public List<VariableInstanceLog> findVariableInstances(long processInstanceId, String variableId) {
+    	List<VariableInstanceLog> result = getEntityManager()
+			.createQuery("FROM VariableInstanceLog v WHERE v.processInstanceId = :processInstanceId AND v.variableId = :variableId ORDER BY date")
+				.setParameter("processInstanceId", processInstanceId)
+				.setParameter("variableId", variableId).getResultList();
+    	return result;
+    }
+
 	@SuppressWarnings("unchecked")
 	public void clear() {
 	    try {

Modified: labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAWorkingMemoryDbLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAWorkingMemoryDbLogger.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/JPAWorkingMemoryDbLogger.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -10,6 +10,7 @@
 import org.drools.audit.event.LogEvent;
 import org.drools.audit.event.RuleFlowLogEvent;
 import org.drools.audit.event.RuleFlowNodeLogEvent;
+import org.drools.audit.event.RuleFlowVariableLogEvent;
 import org.drools.event.KnowledgeRuntimeEventManager;
 import org.drools.impl.StatelessKnowledgeSessionImpl;
 import org.drools.runtime.Environment;
@@ -62,6 +63,10 @@
             	nodeEvent = (RuleFlowNodeLogEvent) logEvent;
             	addNodeExitLog(nodeEvent.getProcessInstanceId(), nodeEvent.getProcessId(), nodeEvent.getNodeInstanceId(), nodeEvent.getNodeId());
                 break;
+            case LogEvent.AFTER_VARIABLE_INSTANCE_CHANGED:
+            	RuleFlowVariableLogEvent variableEvent = (RuleFlowVariableLogEvent) logEvent;
+            	addVariableLog(variableEvent.getProcessInstanceId(), variableEvent.getProcessId(), variableEvent.getVariableInstanceId(), variableEvent.getVariableId(), variableEvent.getObjectToString());
+                break;
             default:
                 // ignore all other events
         }
@@ -97,6 +102,12 @@
         getEntityManager().persist(log);
     }
 
+    private void addVariableLog(long processInstanceId, String processId, String variableInstanceId, String variableId, String objectToString) {
+    	VariableInstanceLog log = new VariableInstanceLog(
+    		processInstanceId, processId, variableInstanceId, variableId, objectToString);
+        getEntityManager().persist(log);
+    }
+
     public void dispose() {
     }
 

Modified: labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/NodeInstanceLog.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/NodeInstanceLog.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/NodeInstanceLog.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -8,21 +8,10 @@
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
 @Entity
- at NamedQueries( {
-        @NamedQuery(name = "NodeInstanceLog.findByProcessId", query = "FROM NodeInstanceLog n "
-                + "WHERE n.processId = :processId ORDER BY date"),
-        @NamedQuery(name = "NodeInstanceLog.findByProcessIdAndNodeId", query = "FROM NodeInstanceLog n "
-                + "WHERE n.processId = :processId AND n.nodeId = :nodeId ORDER BY date"),
-        @NamedQuery(name = "NodeInstanceLog.findByProcessInstance", query = "FROM NodeInstanceLog n "
-                + "WHERE n.processId = :processId AND n.processInstanceId = :processInstanceId ORDER BY date"),
-        @NamedQuery(name = "NodeInstanceLog.findByProcessInstanceAndNodeId", query = "FROM NodeInstanceLog n "
-                + "WHERE n.processId = :processId AND n.processInstanceId = :processInstanceId AND n.nodeId = :nodeId ORDER BY date") })
 public class NodeInstanceLog implements Serializable {
     
 	public static final int TYPE_ENTER = 0;

Added: labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/VariableInstanceLog.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/VariableInstanceLog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/main/java/org/drools/process/audit/VariableInstanceLog.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -0,0 +1,105 @@
+package org.drools.process.audit;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+ at Entity
+public class VariableInstanceLog implements Serializable {
+    
+	private static final long serialVersionUID = 4L;
+	
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+	private long id;
+    private long processInstanceId;
+    private String processId;
+    private String variableInstanceId;
+    private String variableId;
+    private String value;
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "log_date")
+    private Date date;
+    
+    VariableInstanceLog() {
+    }
+    
+	public VariableInstanceLog(long processInstanceId, String processId,
+			               	   String variableInstanceId, String variableId, String value) {
+        this.processInstanceId = processInstanceId;
+        this.processId = processId;
+		this.variableInstanceId = variableInstanceId;
+		this.variableId = variableId;
+		this.value = value;
+        this.date = new Date();
+    }
+	
+    public long getId() {
+    	return id;
+    }
+    
+    void setId(long id) {
+		this.id = id;
+	}
+
+    public long getProcessInstanceId() {
+        return processInstanceId;
+    }
+    
+	void setProcessInstanceId(long processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+    public String getProcessId() {
+        return processId;
+    }
+    
+	void setProcessId(String processId) {
+		this.processId = processId;
+	}
+
+	public String getVariableInstanceId() {
+		return variableInstanceId;
+	}
+
+	public void setVariableInstanceId(String variableInstanceId) {
+		this.variableInstanceId = variableInstanceId;
+	}
+
+	public String getVariableId() {
+		return variableId;
+	}
+
+	public void setVariableId(String variableId) {
+		this.variableId = variableId;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public Date getDate() {
+        return date;
+    }
+    
+	void setDate(Date date) {
+		this.date = date;
+	}
+
+    public String toString() {
+        return "Change variable '" + 
+        	processId + "#" + variableId + "' to '" + value + "' [" + processInstanceId + "#" + variableInstanceId + "]";
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bam/src/test/java/org/drools/process/audit/JPAWorkingMemoryDbLoggerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/test/java/org/drools/process/audit/JPAWorkingMemoryDbLoggerTest.java	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/test/java/org/drools/process/audit/JPAWorkingMemoryDbLoggerTest.java	2010-06-28 21:10:10 UTC (rev 33677)
@@ -1,6 +1,9 @@
 package org.drools.process.audit;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
@@ -18,6 +21,9 @@
 import org.drools.runtime.Environment;
 import org.drools.runtime.EnvironmentName;
 import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
 
 import bitronix.tm.TransactionManagerServices;
 import bitronix.tm.resource.jdbc.PoolingDataSource;
@@ -170,10 +176,68 @@
         log.dispose();
 	}
 	
+	public void testLogger4() throws Exception {
+        // load the process
+        KnowledgeBase kbase = createKnowledgeBase();
+        // create a new session
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( EnvironmentName.TRANSACTION_MANAGER,
+                 TransactionManagerServices.getTransactionManager() );
+        StatefulKnowledgeSession session = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
+        new JPAWorkingMemoryDbLogger(session);
+        JPAProcessInstanceDbLog log = new JPAProcessInstanceDbLog();
+        session.getWorkItemManager().registerWorkItemHandler("Human Task", new WorkItemHandler() {
+			public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+				Map<String, Object> results = new HashMap<String, Object>();
+				results.put("Result", "ResultValue");
+				manager.completeWorkItem(workItem.getId(), results);
+			}
+			public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+			}
+		});
+        
+        // start process instance
+		Map<String, Object> params = new HashMap<String, Object>();
+		List<String> list = new ArrayList<String>();
+		list.add("One");
+		list.add("Two");
+		list.add("Three");
+		params.put("list", list);
+		long processInstanceId = session.startProcess("com.sample.ruleflow3", params).getId();
+        
+        System.out.println("Checking process instances for process 'com.sample.ruleflow3'");
+        List<ProcessInstanceLog> processInstances =
+        	log.findProcessInstances("com.sample.ruleflow3");
+        assertEquals(1, processInstances.size());
+        ProcessInstanceLog processInstance = processInstances.get(0);
+        System.out.print(processInstance);
+        System.out.println(" -> " + processInstance.getStart() + " - " + processInstance.getEnd());
+        assertNotNull(processInstance.getStart());
+        assertNotNull(processInstance.getEnd());
+        assertEquals(processInstanceId, processInstance.getProcessInstanceId());
+        assertEquals("com.sample.ruleflow3", processInstance.getProcessId());
+        List<VariableInstanceLog> variableInstances = log.findVariableInstances(processInstanceId);
+        assertEquals(6, variableInstances.size());
+        for (VariableInstanceLog variableInstance: variableInstances) {
+        	System.out.println(variableInstance);
+            assertEquals(processInstanceId, processInstance.getProcessInstanceId());
+            assertEquals("com.sample.ruleflow3", processInstance.getProcessId());
+            assertNotNull(variableInstance.getDate());
+        }
+        log.clear();
+        processInstances = log.findProcessInstances("com.sample.ruleflow3");
+        assertEquals(0, processInstances.size());
+        log.dispose();
+	}
+	
     private KnowledgeBase createKnowledgeBase() {
     	KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
     	kbuilder.add(new ClassPathResource("ruleflow.rf"), ResourceType.DRF);
     	kbuilder.add(new ClassPathResource("ruleflow2.rf"), ResourceType.DRF);
+    	kbuilder.add(new ClassPathResource("ruleflow3.rf"), ResourceType.DRF);
     	KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
     	kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
         return kbase;

Modified: labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/META-INF/persistence.xml	2010-06-28 21:08:31 UTC (rev 33676)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/META-INF/persistence.xml	2010-06-28 21:10:10 UTC (rev 33677)
@@ -13,6 +13,7 @@
         <class>org.drools.persistence.processinstance.ProcessInstanceInfo</class>
         <class>org.drools.process.audit.ProcessInstanceLog</class>
         <class>org.drools.process.audit.NodeInstanceLog</class>
+        <class>org.drools.process.audit.VariableInstanceLog</class>
         <class>org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable</class>
         <class>org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo</class>
         <class>org.drools.persistence.processinstance.variabletypes.SerializablePersistedVariable</class>

Added: labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/ruleflow3.rf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/ruleflow3.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bam/src/test/resources/ruleflow3.rf	2010-06-28 21:10:10 UTC (rev 33677)
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-5.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+         type="RuleFlow" name="ruleflow" id="com.sample.ruleflow3" package-name="org.drools.process.workflow" >
+
+  <header>
+    <imports>
+      <import name="java.util.List" />
+    </imports>
+    <variables>
+      <variable name="list" >
+        <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="java.util.List" />
+      </variable>
+      <variable name="s" >
+        <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        <value>InitialValue</value>
+      </variable>
+    </variables>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" x="16" y="67" width="48" height="48" />
+    <end id="3" name="End" x="328" y="67" width="48" height="48" />
+    <forEach id="4" name="Multiple Instances" x="96" y="16" width="200" height="150" variableName="item" collectionExpression="list" >
+      <nodes>
+    <humanTask id="1" name="User Task" x="63" y="61" width="100" height="48" >
+      <work name="Human Task" >
+        <parameter name="ActorId" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+        <parameter name="Comment" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+        <parameter name="Content" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+        <parameter name="Priority" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+        <parameter name="Skippable" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+        <parameter name="TaskName" >
+          <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        </parameter>
+      </work>
+      <mapping type="out" from="Result" to="s" />
+    </humanTask>
+      </nodes>
+      <connections>
+      </connections>
+      <in-ports>
+        <in-port type="DROOLS_DEFAULT" nodeId="1" nodeInType="DROOLS_DEFAULT" />
+      </in-ports>
+      <out-ports>
+        <out-port type="DROOLS_DEFAULT" nodeId="1" nodeOutType="DROOLS_DEFAULT" />
+      </out-ports>
+    </forEach>
+  </nodes>
+
+  <connections>
+    <connection from="4" to="3" />
+    <connection from="1" to="4" />
+  </connections>
+
+</process>
\ No newline at end of file



More information about the jboss-svn-commits mailing list