[jboss-svn-commits] JBL Code SVN: r35430 - in labs/jbossrules/trunk: drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Oct 5 08:25:26 EDT 2010


Author: diegoll
Date: 2010-10-05 08:25:25 -0400 (Tue, 05 Oct 2010)
New Revision: 35430

Added:
   labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableExtendingSerializable.java
Modified:
   labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java
Log:
[JBRULES-2722] recursive look for interface implementation (by Nicolas Loriente)
cleaning up corresponding test

Added: labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableExtendingSerializable.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableExtendingSerializable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableExtendingSerializable.java	2010-10-05 12:25:25 UTC (rev 35430)
@@ -0,0 +1,14 @@
+package org.drools.persistence.session;
+
+public class MyVariableExtendingSerializable extends MyVariableSerializable {
+
+    public MyVariableExtendingSerializable(String string) {
+        super( string );
+    }
+    
+    @Override
+    public String toString() {
+        return "Extended " + super.toString();
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java	2010-10-05 12:25:06 UTC (rev 35429)
+++ labs/jbossrules/trunk/drools-flow-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java	2010-10-05 12:25:25 UTC (rev 35430)
@@ -1,6 +1,12 @@
 package org.drools.persistence.session;
 
-import bitronix.tm.TransactionManagerServices;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -8,36 +14,62 @@
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 
-import junit.framework.TestCase;
+import junit.framework.Assert;
 
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.base.MapGlobalResolver;
 import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
 import org.drools.builder.KnowledgeBuilderError;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
+import org.drools.common.AbstractRuleBase;
+import org.drools.impl.InternalKnowledgeBase;
 import org.drools.io.impl.ClassPathResource;
 import org.drools.persistence.jpa.JPAKnowledgeService;
 import org.drools.persistence.processinstance.VariablePersistenceStrategyFactory;
 import org.drools.persistence.processinstance.persisters.JPAVariablePersister;
 import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
+import org.drools.process.core.Work;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.instance.impl.Action;
+import org.drools.ruleflow.core.RuleFlowProcess;
 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 org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.spi.ProcessContext;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import bitronix.tm.TransactionManagerServices;
 import bitronix.tm.resource.jdbc.PoolingDataSource;
-import org.drools.builder.KnowledgeBuilderConfiguration;
 
-public class VariablePersistenceStrategyTest extends TestCase {
+public class VariablePersistenceStrategyTest {
 
-    PoolingDataSource ds1;
+    private static Logger logger = LoggerFactory.getLogger( VariablePersistenceStrategyTest.class );
+    
+    private PoolingDataSource ds1;
+    private EntityManagerFactory emf;
 
-    @Override
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         ds1 = new PoolingDataSource();
         ds1.setUniqueName( "jdbc/testDS1" );
         ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
@@ -50,46 +82,111 @@
         ds1.getDriverProperties().put( "URL",
                                        "jdbc:h2:mem:mydb" );
         ds1.init();
+        
         VariablePersistenceStrategyFactory.getVariablePersistenceStrategy()
         	.setPersister("javax.persistence.Entity",
 				"org.drools.persistence.processinstance.persisters.JPAVariablePersister");
         VariablePersistenceStrategyFactory.getVariablePersistenceStrategy()
 	    	.setPersister("java.io.Serializable",
 				"org.drools.persistence.processinstance.persisters.SerializableVariablePersister");
+        
+        emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
+        emf.close();
         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() );
+    @Test
+    public void testExtendingInterfaceVariablePersistence(){
+        String processId = "extendingInterfaceVariablePersistence";
+        String variableText = "my extending serializable variable text";
+        KnowledgeBase kbase = getKnowledgeBaseForExtendingInterfaceVariablePersistence(processId,
+                                                                                       variableText);
+        StatefulKnowledgeSession ksession = createSession( kbase );
+        Map<String, Object> initialParams = new HashMap<String, Object>();
+        initialParams.put( "x", new MyVariableExtendingSerializable( variableText ) );
+        long processInstanceId = ksession.startProcess( processId, initialParams ).getId();
+        ksession = reloadSession( ksession, kbase );
+        
+        List<?> variables = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
+        Assert.assertEquals( 1, variables.size() );
+        
+        long workItemId = TestWorkItemHandler.getInstance().getWorkItem().getId();
+        ksession.getWorkItemManager().completeWorkItem( workItemId, null );
+        
+        Assert.assertNull( ksession.getProcessInstance( processInstanceId ) );
+    }
 
-        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());
+    private KnowledgeBase getKnowledgeBaseForExtendingInterfaceVariablePersistence(String processId, final String variableText) {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( processId );
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("x");
+        ObjectDataType extendingSerializableDataType = new ObjectDataType();
+        extendingSerializableDataType.setClassName(MyVariableExtendingSerializable.class.getName());
+        variable.setType(extendingSerializableDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
 
-        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
-        int id = ksession.getId();
+        StartNode startNode = new StartNode();
+        startNode.setName( "Start" );
+        startNode.setId(1);
 
-        System.out.println("### Starting process ###");
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setName( "workItemNode" );
+        workItemNode.setId( 2 );
+        Work work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode.setWork( work );
+        
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName( "Print" );
+        DroolsAction action = new DroolsConsequenceAction( "java" , null);
+        action.setMetaData( "Action" , new Action() {
+            public void execute(ProcessContext context) throws Exception {
+                Assert.assertEquals( variableText , ((MyVariableExtendingSerializable) context.getVariable( "x" )).getText()); ;
+            }
+        });
+        actionNode.setAction(action);
+        actionNode.setId( 3 );
+        
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(4);
+        
+        connect( startNode, workItemNode );
+        connect( workItemNode, actionNode );
+        connect( actionNode, endNode );
+
+        process.addNode( startNode );
+        process.addNode( workItemNode );
+        process.addNode( actionNode );
+        process.addNode( endNode );
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess(process);
+        return kbase;
+    }
+    
+    @Test
+    public void testPersistenceVariables() {
+        KnowledgeBase kbase = createKnowledgeBase( "VariablePersistenceStrategyProcess.rf" );
+        StatefulKnowledgeSession ksession = createSession( kbase );
+
+        logger.info("### Starting process ###");
         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("x", "SomeString");
         parameters.put("y", new MyEntity("This is a test Entity with annotation in fields"));
         parameters.put("m", new MyEntityMethods("This is a test Entity with annotations in methods"));
         parameters.put("f", new MyEntityOnlyFields("This is a test Entity with annotations in fields and without accesors methods"));
         parameters.put("z", new MyVariableSerializable("This is a test SerializableObject"));
-        WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
-        	ksession.startProcess( "com.sample.ruleflow", parameters );
+        long processInstanceId = ksession.startProcess( "com.sample.ruleflow", parameters ).getId();
 
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
@@ -98,10 +195,10 @@
         List<?> result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
         assertEquals(5, result.size());
 
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
-        processInstance = (WorkflowProcessInstance) 
-        	ksession.getProcessInstance( processInstance.getId() );
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance) 
+        	ksession.getProcessInstance( processInstanceId );
         assertNotNull( processInstance );
         assertEquals("SomeString", processInstance.getVariable("x"));
         assertEquals("This is a test Entity with annotation in fields", ((MyEntity) processInstance.getVariable("y")).getTest());
@@ -111,24 +208,24 @@
         assertNull(processInstance.getVariable("a"));
         assertNull(processInstance.getVariable("b"));
         assertNull(processInstance.getVariable("c"));
-        System.out.println("### Completing first work item ###");
+        logger.info("### Completing first work item ###");
         ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
 
         workItem = handler.getWorkItem();
         assertNotNull( workItem );
         
-        System.out.println("### Retrieving variable instance infos ###");
+        logger.info("### Retrieving variable instance infos ###");
         result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
         assertEquals(8, result.size());
         for (Object o: result) {
         	assertTrue(VariableInstanceInfo.class.isAssignableFrom(o.getClass()));
-        	System.out.println(o);
+        	logger.info(o.toString());
         }
         
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
 		processInstance = (WorkflowProcessInstance)
-			ksession.getProcessInstance(processInstance.getId());
+			ksession.getProcessInstance(processInstanceId);
 		assertNotNull(processInstance);
         assertEquals("SomeString", processInstance.getVariable("x"));
         assertEquals("This is a test Entity with annotation in fields", ((MyEntity) processInstance.getVariable("y")).getTest());
@@ -138,7 +235,7 @@
         assertEquals("Some new String", processInstance.getVariable("a"));
         assertEquals("This is a new test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
         assertEquals("This is a new test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
-        System.out.println("### Completing second work item ###");
+        logger.info("### Completing second work item ###");
 		ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
 
         workItem = handler.getWorkItem();
@@ -147,10 +244,10 @@
         result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
         assertEquals(8, result.size());
         
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
         processInstance = (WorkflowProcessInstance)
-        	ksession.getProcessInstance(processInstance.getId());
+        	ksession.getProcessInstance(processInstanceId);
         assertNotNull(processInstance);
         assertEquals("SomeString", processInstance.getVariable("x"));
         assertEquals("This is a test Entity with annotation in fields", ((MyEntity) processInstance.getVariable("y")).getTest());
@@ -160,7 +257,7 @@
         assertEquals("Some changed String", processInstance.getVariable("a"));
         assertEquals("This is a changed test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
         assertEquals("This is a changed test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
-        System.out.println("### Completing third work item ###");
+        logger.info("### Completing third work item ###");
         ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
 
         workItem = handler.getWorkItem();
@@ -171,154 +268,107 @@
         //we need to change that to leave the variables there??? 
         assertEquals(0, result.size());
 
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        ksession = reloadSession( ksession, kbase );
         processInstance = (WorkflowProcessInstance)
-			ksession.getProcessInstance(processInstance.getId());
+			ksession.getProcessInstance(processInstanceId);
         assertNull(processInstance);
     }
     
+    @Test
     public void testPersistenceVariablesWithTypeChange() {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( new ClassPathResource( "VariablePersistenceStrategyProcessTypeChange.rf" ), ResourceType.DRF );
-        for (KnowledgeBuilderError error: kbuilder.getErrors()) {
-        	System.out.println(error);
-        }
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        KnowledgeBase kbase = createKnowledgeBase( "VariablePersistenceStrategyProcessTypeChange.rf" );
+        StatefulKnowledgeSession ksession = createSession( kbase );
 
-        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 with annotation in fields"));
         parameters.put("m", new MyEntityMethods("This is a test Entity with annotations in methods"));
         parameters.put("f", new MyEntityOnlyFields("This is a test Entity with annotations in fields and without accesors methods"));
         parameters.put("z", new MyVariableSerializable("This is a test SerializableObject"));
-        ProcessInstance processInstance = ksession.startProcess( "com.sample.ruleflow", parameters );
+        long processInstanceId = ksession.startProcess( "com.sample.ruleflow", parameters ).getId();
 
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
         assertNotNull( workItem );
 
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
-        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        ksession = reloadSession( ksession, kbase );
+        ProcessInstance processInstance = ksession.getProcessInstance( processInstanceId );
         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() );
+        ksession = reloadSession( ksession, kbase );
+        processInstance = ksession.getProcessInstance( processInstanceId );
         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() );
+        ksession = reloadSession( ksession, kbase );
+        processInstance = ksession.getProcessInstance( processInstanceId );
         assertNull( processInstance );
     }
     
+    @Test
     public void testPersistenceVariablesSubProcess() {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( new ClassPathResource( "VariablePersistenceStrategySubProcess.rf" ), ResourceType.DRF );
-        for (KnowledgeBuilderError error: kbuilder.getErrors()) {
-        	System.out.println(error);
-        }
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        KnowledgeBase kbase = createKnowledgeBase( "VariablePersistenceStrategySubProcess.rf" );
+        StatefulKnowledgeSession ksession = createSession( kbase );
 
-        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 with annotation in fields"));
         parameters.put("m", new MyEntityMethods("This is a test Entity with annotations in methods"));
         parameters.put("f", new MyEntityOnlyFields("This is a test Entity with annotations in fields and without accesors methods"));
         parameters.put("z", new MyVariableSerializable("This is a test SerializableObject"));
-        ProcessInstance processInstance = ksession.startProcess( "com.sample.ruleflow", parameters );
+        long processInstanceId = ksession.startProcess( "com.sample.ruleflow", parameters ).getId();
 
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
         assertNotNull( workItem );
 
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
-        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        ksession = reloadSession( ksession, kbase );
+        ProcessInstance processInstance = ksession.getProcessInstance( processInstanceId );
         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() );
+        ksession = reloadSession( ksession, kbase );
+        processInstance = ksession.getProcessInstance( processInstanceId );
         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() );
+        ksession = reloadSession( ksession, kbase );
+        processInstance = ksession.getProcessInstance( processInstanceId );
         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() );
+        ksession = reloadSession( ksession, kbase );
+        processInstance = ksession.getProcessInstance( processInstanceId );
         assertNull( processInstance );
     }
     
+    @Test
     public void testWorkItemWithVariablePersistence() throws Exception{
-       KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
-        conf.setProperty("drools.dialect.java.compiler", "JANINO");
+        KnowledgeBase kbase = createKnowledgeBase( "VPSProcessWithWorkItems.rf" );
+        StatefulKnowledgeSession ksession = createSession( kbase );
 
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(conf);
-        kbuilder.add( new ClassPathResource( "VPSProcessWithWorkItems.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());
-                env.set( EnvironmentName.TRANSACTION_MANAGER,
-         TransactionManagerServices.getTransactionManager() );
-
-
-        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
-        int id = ksession.getId();
-
-
-        System.out.println("### Starting process ###");
+        logger.info("### Starting process ###");
         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"));
-        WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
-        	ksession.startProcess( "com.sample.ruleflow", parameters );
+        long processInstanceId = ksession.startProcess( "com.sample.ruleflow", parameters ).getId();
 
         TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
         WorkItem workItem = handler.getWorkItem();
@@ -328,10 +378,10 @@
 
         assertEquals(5, result.size());
 
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
-        processInstance = (WorkflowProcessInstance)
-        	ksession.getProcessInstance( processInstance.getId() );
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
+        	ksession.getProcessInstance( processInstanceId );
         assertNotNull( processInstance );
         assertEquals("SomeString", processInstance.getVariable("x"));
         assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
@@ -340,7 +390,7 @@
         assertNull(processInstance.getVariable("b"));
         assertNull(processInstance.getVariable("c"));
 
-        System.out.println("### Completing first work item ###");
+        logger.info("### Completing first work item ###");
         Map<String, Object> results = new HashMap<String, Object>();
         results.put("zeta", processInstance.getVariable("z"));
         results.put("equis", processInstance.getVariable("x")+"->modifiedResult");
@@ -350,27 +400,27 @@
         workItem = handler.getWorkItem();
         assertNotNull( workItem );
 
-        System.out.println("### Retrieving variable instance infos ###");
+        logger.info("### Retrieving variable instance infos ###");
         result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
         //6 Variables from the process and 2 variables from the workitems
         assertEquals(8, result.size());
         for (Object o: result) {
-        	System.out.println(((VariableInstanceInfo) o));
+        	logger.info(((VariableInstanceInfo) o).toString());
         }
 
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
 		processInstance = (WorkflowProcessInstance)
-			ksession.getProcessInstance(processInstance.getId());
+			ksession.getProcessInstance(processInstanceId);
 		assertNotNull(processInstance);
-        System.out.println("######## Getting the already Persisted Variables #########");
+        logger.info("######## Getting the already Persisted Variables #########");
         assertEquals("SomeString->modifiedResult", processInstance.getVariable("x"));
         assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
         assertEquals("This is a test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("z")).getText());
         assertEquals("Some new String", processInstance.getVariable("a"));
         assertEquals("This is a new test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
         assertEquals("This is a new test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
-        System.out.println("### Completing second work item ###");
+        logger.info("### Completing second work item ###");
         results = new HashMap<String, Object>();
         results.put("zeta", processInstance.getVariable("z"));
         results.put("equis", processInstance.getVariable("x"));
@@ -383,10 +433,10 @@
         result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
         assertEquals(8, result.size());
 
-        System.out.println("### Retrieving process instance ###");
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        logger.info("### Retrieving process instance ###");
+        ksession = reloadSession( ksession, kbase );
         processInstance = (WorkflowProcessInstance)
-        	ksession.getProcessInstance(processInstance.getId());
+        	ksession.getProcessInstance(processInstanceId);
         assertNotNull(processInstance);
         assertEquals("SomeString->modifiedResult", processInstance.getVariable("x"));
         assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
@@ -394,7 +444,7 @@
         assertEquals("Some changed String", processInstance.getVariable("a"));
         assertEquals("This is a changed test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
         assertEquals("This is a changed test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
-        System.out.println("### Completing third work item ###");
+        logger.info("### Completing third work item ###");
         results = new HashMap<String, Object>();
         results.put("zeta", processInstance.getVariable("z"));
         results.put("equis", processInstance.getVariable("x"));
@@ -407,22 +457,68 @@
 
         assertEquals(0, result.size());
 
-        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+        ksession = reloadSession( ksession, kbase );
         processInstance = (WorkflowProcessInstance)
-			ksession.getProcessInstance(processInstance.getId());
+			ksession.getProcessInstance(processInstanceId);
         assertNull(processInstance);
     }
 
+    @Test
     public void testEntityWithSuperClassAnnotationField() throws Exception {
     	MySubEntity subEntity = new MySubEntity();
     	subEntity.setId(3L);
     	assertEquals(3L, JPAVariablePersister.getClassIdValue(subEntity));
     }
     
+    @Test
     public void testEntityWithSuperClassAnnotationMethod() throws Exception {
     	MySubEntityMethods subEntity = new MySubEntityMethods();
     	subEntity.setId(3L);
     	assertEquals(3L, JPAVariablePersister.getClassIdValue(subEntity));
     }
     
+    private StatefulKnowledgeSession createSession(KnowledgeBase kbase){
+        return JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, createEnvironment() );
+    }
+    
+    private StatefulKnowledgeSession reloadSession(StatefulKnowledgeSession ksession, KnowledgeBase kbase){
+        int sessionId = ksession.getId();
+        ksession.dispose();
+        return JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, null, createEnvironment() );
+    }
+
+    private KnowledgeBase createKnowledgeBase(String flowFile) {
+        KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
+        conf.setProperty("drools.dialect.java.compiler", "JANINO");
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(conf);
+        kbuilder.add( new ClassPathResource( flowFile ), ResourceType.DRF );
+        if(kbuilder.hasErrors()){
+            StringBuilder errorMessage = new StringBuilder();
+            for (KnowledgeBuilderError error: kbuilder.getErrors()) {
+                errorMessage.append( error.getMessage() );
+                errorMessage.append( System.getProperty( "line.separator" ) );
+            }
+            fail( errorMessage.toString());
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        return kbase;
+    }
+
+    private Environment createEnvironment() {
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+        env.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+                env.set( EnvironmentName.TRANSACTION_MANAGER,
+         TransactionManagerServices.getTransactionManager() );
+        return env;
+    }
+    
+    private void connect(Node sourceNode,
+                         Node targetNode) {
+        new ConnectionImpl (sourceNode, Node.CONNECTION_DEFAULT_TYPE,
+                            targetNode, Node.CONNECTION_DEFAULT_TYPE);
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java	2010-10-05 12:25:06 UTC (rev 35429)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java	2010-10-05 12:25:25 UTC (rev 35430)
@@ -136,16 +136,20 @@
                 }
             }
         }
-        // at last for interfaces
-        Class<?>[] interfaces = o.getClass().getInterfaces();
-        if (interfaces != null) {
-            for (Class<?> clazz : interfaces) {
-                persisterFQN = types.get(clazz.getName());
+
+        //finally look for interface to the root
+        Class<?> clazz = o.getClass();
+		do {
+			Class<?>[] interfaces = clazz.getInterfaces();
+			for(Class<?> interfaze : interfaces) {
+				persisterFQN = types.get(interfaze.getName());
                 if (persisterFQN != null && !persisterFQN.equals("")) {
+                	System.out.println("Persistence strategy returns: " + persisterFQN);
                     return persisterFQN;
                 }
             }
-        }
+		} while ( (clazz = clazz.getSuperclass() ) != null);
+		
         return null;
     }
 }



More information about the jboss-svn-commits mailing list