[jboss-svn-commits] JBL Code SVN: r29096 - in labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src: test/java/org/drools/persistence/session and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Aug 27 22:45:10 EDT 2009


Author: KrisVerlaenen
Date: 2009-08-27 22:45:09 -0400 (Thu, 27 Aug 2009)
New Revision: 29096

Added:
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/VariablePersistenceStrategyProcess.rf
Modified:
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyEntity.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableSerializable.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
Log:
 - updated some tests

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-08-27 21:36:39 UTC (rev 29095)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-08-28 02:45:09 UTC (rev 29096)
@@ -136,6 +136,7 @@
             try {
                 ByteArrayInputStream bais = new ByteArrayInputStream(
                         processInstanceByteArray);
+                System.out.println("length = " + processInstanceByteArray.length);
                 MarshallerReaderContext context = new MarshallerReaderContext(
                         bais, (InternalRuleBase) workingMemory.getRuleBase(), null, null);
                 context.wm = (InternalWorkingMemory) workingMemory;
@@ -156,13 +157,11 @@
     private void restoreVariables() {
 
         VariableScopeInstance variableScopeInstance = (VariableScopeInstance) ((RuleFlowProcessInstance) this.processInstance).getContextInstance(VariableScope.VARIABLE_SCOPE);
-        Set<String> keySet = this.getVariables().keySet();
-        Iterator<String> keyIt = keySet.iterator();
-        while(keyIt.hasNext()){
-
+        for (String variable: variables.keySet()){
+        	System.out.println("Restoring " + variable + " " + variables.get(variable));
             VariablePersistenceStrategy persistenceStrategy =
                     VariablePersistenceStrategyFactory.getVariablePersistenceStrategyFactory();
-            VariableInstanceInfo variableInfo = this.getVariables().get(keyIt.next());
+            VariableInstanceInfo variableInfo = variables.get(variable);
 
             variableScopeInstance.setVariable(variableInfo.getName(), persistenceStrategy.getVariable(variableInfo, this.env));
         }
@@ -189,6 +188,7 @@
     @PrePersist
     public void update() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        boolean variablesChanged = false;
         try {
             MarshallerWriteContext context = new MarshallerWriteContext(baos,
                     null, null, null, null);
@@ -197,14 +197,14 @@
             ProcessInstanceMarshaller marshaller = ProcessMarshallerRegistry.INSTANCE.getMarshaller(processType);
             marshaller.writeProcessInstance(
                     context, processInstance, false);
-            persistVariables();
+            variablesChanged = persistVariables();
             context.close();
         } catch (IOException e) {
             throw new IllegalArgumentException(
                     "IOException while storing process instance " + processInstance.getId() + ": " + e.getMessage());
         }
         byte[] newByteArray = baos.toByteArray();
-        if (!Arrays.equals(newByteArray, processInstanceByteArray)) {
+        if (variablesChanged || !Arrays.equals(newByteArray, processInstanceByteArray)) {
             this.state = processInstance.getState();
             this.lastModificationDate = new Date();
             this.processInstanceByteArray = newByteArray;
@@ -213,9 +213,13 @@
                 eventTypes.add(type);
             }
         }
+        for (String variable: variables.keySet()){
+        	System.out.println("Saving " + variable + " " + variables.get(variable));
+        }
     }
 
-    private void persistVariables() {
+    private boolean persistVariables() {
+    	boolean changed = false;
         // VariableScopeInstance variableScopeInstance =
         //             (VariableScopeInstance)
         //                 ((RuleFlowProcessInstance)getProcessInstance(processInstanceInfo.getId()))
@@ -233,19 +237,21 @@
      //   this.clearVariables();
        
         for (String key : keys) {
-                 VariableInstanceInfo variable =        
-                         persistenceStrategy.persistVariable(key, processVariables.get(key), this.env);
-                if (variable != null) {
-                    variable.setProcessInstanceInfo(this);
-                    this.addVariable(variable.getName(),variable);
-                }
-
+        	Object value =  processVariables.get(key);
+        	if (value != null) {
+				VariableInstanceInfo variable = persistenceStrategy.persistVariable(key, value, this.env);
+				if (variable != null) {
+				    variable.setProcessInstanceInfo(this);
+				    changed = addVariable(variable.getName(),variable);
+				}
+        	}
         }
         //If we wont find any VariableInstanceInfo that mactches with the persistence strategy,
         //we just serialize the variables inside the blob
 //        if (this.getVariables().size() == 0) {
 //            this.setSerializeVariables(true);
 //        }
+        return changed;
     }
 
     /**
@@ -262,8 +268,9 @@
         this.variables = variables;
     }
 
-    public void addVariable(String name, VariableInstanceInfo variable) {
-        variables.put(name, variable);
+    public boolean addVariable(String name, VariableInstanceInfo variable) {
+    	Object oldValue = variables.put(name, variable);
+    	return !variable.equals(oldValue);
     }
 
 //    public void clearVariables() {

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyEntity.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyEntity.java	2009-08-27 21:36:39 UTC (rev 29095)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyEntity.java	2009-08-28 02:45:09 UTC (rev 29096)
@@ -34,9 +34,9 @@
     private Long id;
     private String test;
 
-    MyEntity(){}
+    public MyEntity(){}
 
-    MyEntity(String string) {
+    public MyEntity(String string) {
         this.test= string;
     }
 

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableSerializable.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableSerializable.java	2009-08-27 21:36:39 UTC (rev 29095)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableSerializable.java	2009-08-28 02:45:09 UTC (rev 29096)
@@ -23,7 +23,7 @@
  *
  * @author salaboy
  */
-class MyVariableSerializable implements Serializable{
+public class MyVariableSerializable implements Serializable {
 
     private String text = "";
 

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-08-27 21:36:39 UTC (rev 29095)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-08-28 02:45:09 UTC (rev 29096)
@@ -64,26 +64,26 @@
     protected void setUp() {
         ds1 = new PoolingDataSource();
         ds1.setUniqueName( "jdbc/testDS1" );
-//        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+
+//        ds1.setClassName( "org.postgresql.xa.PGXADataSource" );
 //        ds1.setMaxPoolSize( 3 );
 //        ds1.setAllowLocalTransactions( true );
 //        ds1.getDriverProperties().put( "user",
-//                                       "sa" );
+//                                       "salaboy" );
 //        ds1.getDriverProperties().put( "password",
-//                                       "sasa" );
-//        ds1.getDriverProperties().put( "URL",
-//                                       "jdbc:h2:mem:mydb" );
+//                                       "salaboy" );
+//        ds1.getDriverProperties().put( "serverName",
+//                                       "localhost:5432/droolsPersistence" );
 
-        ds1.setClassName( "org.postgresql.xa.PGXADataSource" );
-        ds1.setMaxPoolSize( 3 );
-        ds1.setAllowLocalTransactions( true );
-        ds1.getDriverProperties().put( "user",
-                                       "salaboy" );
-        ds1.getDriverProperties().put( "password",
-                                       "salaboy" );
-        ds1.getDriverProperties().put( "serverName",
-                                       "localhost:5432/droolsPersistence" );
-
         ds1.init();
 
         emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java	2009-08-28 02:45:09 UTC (rev 29096)
@@ -0,0 +1,103 @@
+package org.drools.persistence.session;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.base.MapGlobalResolver;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.impl.ClassPathResource;
+import org.drools.persistence.jpa.JPAKnowledgeService;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+
+import bitronix.tm.resource.jdbc.PoolingDataSource;
+
+public class VariablePersistenceStrategyTest extends TestCase {
+
+    PoolingDataSource ds1;
+
+    @Override
+    protected void setUp() throws Exception {
+        ds1 = new PoolingDataSource();
+        ds1.setUniqueName( "jdbc/testDS1" );
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+        ds1.init();
+
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        ds1.close();
+    }
+
+    public void testPersistenceVariables() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( new ClassPathResource( "VariablePersistenceStrategyProcess.rf" ), ResourceType.DRF );
+        for (KnowledgeBuilderError error: kbuilder.getErrors()) {
+        	System.out.println(error);
+        }
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+
+        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+        int id = ksession.getId();
+
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("x", "SomeString");
+        parameters.put("y", new MyEntity("This is a test Entity"));
+        parameters.put("z", new MyVariableSerializable("This is a test SerializableObject"));
+        ProcessInstance processInstance = ksession.startProcess( "com.sample.ruleflow", parameters );
+
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+        ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
+
+        workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+        
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+        ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
+
+        workItem = handler.getWorkItem();
+        assertNull( workItem );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNull( processInstance );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/VariablePersistenceStrategyProcess.rf
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/VariablePersistenceStrategyProcess.rf	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/VariablePersistenceStrategyProcess.rf	2009-08-28 02:45:09 UTC (rev 29096)
@@ -0,0 +1,118 @@
+<?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.ruleflow" package-name="com.sample" >
+
+  <header>
+    <imports>
+      <import name="org.drools.persistence.session.MyEntity" />
+      <import name="org.drools.persistence.session.MyVariableSerializable" />
+    </imports>
+    <variables>
+      <variable name="x" >
+        <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        <value></value>
+      </variable>
+      <variable name="y" >
+        <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyEntity" />
+      </variable>
+      <variable name="z" >
+        <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyVariableSerializable" />
+      </variable>
+      <variable name="a" >
+        <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+        <value></value>
+      </variable>
+      <variable name="b" >
+        <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyEntity" />
+      </variable>
+      <variable name="c" >
+        <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyVariableSerializable" />
+      </variable>
+    </variables>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" x="16" y="16" width="48" height="48" />
+    <end id="3" name="End" x="669" y="16" width="48" height="48" />
+    <humanTask id="4" name="Human Task" x="208" y="16" width="93" 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>
+    </humanTask>
+    <actionNode id="5" name="Action" x="96" y="20" width="80" height="40" >
+        <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);</action>
+    </actionNode>
+    <actionNode id="6" name="Action" x="333" y="20" width="80" height="40" >
+        <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);
+kcontext.setVariable("a", "Some new String");
+kcontext.setVariable("b", new MyEntity("This is a new test Entity"));
+kcontext.setVariable("c", new MyVariableSerializable("This is a new test SerializableObject"));</action>
+    </actionNode>
+    <humanTask id="7" name="Human Task" x="445" y="20" width="80" height="40" >
+      <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>
+    </humanTask>
+    <actionNode id="8" name="Action" x="557" y="20" width="80" height="40" >
+        <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);
+System.out.println("a = " + a);
+System.out.println("b = " + b);
+System.out.println("c = " + c);
+kcontext.setVariable("a", "Some changed String");
+kcontext.setVariable("b", new MyEntity("This is a changed test Entity"));
+kcontext.setVariable("c", new MyVariableSerializable("This is a changed test SerializableObject"));</action>
+    </actionNode>
+  </nodes>
+
+  <connections>
+    <connection from="8" to="3" />
+    <connection from="5" to="4" />
+    <connection from="1" to="5" />
+    <connection from="4" to="6" />
+    <connection from="6" to="7" />
+    <connection from="7" to="8" />
+  </connections>
+
+</process>
\ No newline at end of file



More information about the jboss-svn-commits mailing list