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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 6 13:21:56 EDT 2009


Author: salaboy21
Date: 2009-05-06 13:21:56 -0400 (Wed, 06 May 2009)
New Revision: 26401

Added:
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategyFactory.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/JPAVariablePersister.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/SerializableVariablePersister.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/VariablePersister.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/JPAPersistedVariable.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/SerializablePersistedVariable.java
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.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/resources/META-INF/PersistenceStrategies.conf
Modified:
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/pom.xml
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
   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/resources/META-INF/orm.xml
   labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/persistence.xml
   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/resources/META-INF/drools.session.conf
Log:
Persister and variable types added, test working

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/pom.xml	2009-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/pom.xml	2009-05-06 17:21:56 UTC (rev 26401)
@@ -11,7 +11,18 @@
   <artifactId>drools-persistence-jpa</artifactId>
   <packaging>jar</packaging>
   <name>Drools :: Persistence :: JPA</name> 
-    
+    <!--build>
+     <plugins>
+         <plugin>
+             <groupId>org.apache.maven.plugins</groupId>
+             <artifactId>maven-surefire-plugin</artifactId>
+             <version>2.3</version>
+             <configuration>
+               <argLine>-Xdebug -Djava.compiler=none -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address}</argLine>
+             </configuration>
+         </plugin>
+     </plugins>
+ </build-->
       <dependencies> 	       
     	<dependency>
     		<groupId>org.drools</groupId>

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -1,8 +1,12 @@
 package org.drools.persistence.processinstance;
 
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.persistence.EntityManager;
@@ -11,9 +15,12 @@
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.process.core.Process;
+import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.ProcessInstanceManager;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.runtime.EnvironmentName;
 
 public class JPAProcessInstanceManager
@@ -32,10 +39,62 @@
         EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
         em.persist( processInstanceInfo );
         ((ProcessInstance) processInstance).setId( processInstanceInfo.getId() );
+        persistVariables(processInstanceInfo);
         processInstanceInfo.updateLastReadDate();
         internalAddProcessInstance(processInstance);
     }
+     private void persistVariables(ProcessInstanceInfo processInstanceInfo) {
+       // VariableScopeInstance variableScopeInstance =
+       //             (VariableScopeInstance)
+       //                 ((RuleFlowProcessInstance)getProcessInstance(processInstanceInfo.getId()))
+       //                     .getContextInstance( VariableScope.VARIABLE_SCOPE );
+        VariableScopeInstance variableScopeInstance =  (VariableScopeInstance) 
+                                                            ((RuleFlowProcessInstance)
+                                                                processInstanceInfo
+                                                                    .getProcessInstance(this.workingMemory))
+                                                                        .getContextInstance( VariableScope.VARIABLE_SCOPE );
+        Map<String, Object> processVariables = variableScopeInstance.getVariables();
+        List<String> keys = new ArrayList<String>(processVariables.keySet());
+        Collections.sort(keys, new Comparator<String>() {
 
+            public int compare(String o1, String o2) {
+                return o1.compareTo(o2);
+            }
+        });
+        VariablePersistenceStrategy persistenceStrategy = VariablePersistenceStrategyFactory.getVariablePersistenceStrategyFactory("PersistenceStrategies.conf");
+        processInstanceInfo.clearVariables();
+        for (String key : keys) {
+            VariableInstanceInfo variable = persistenceStrategy.persistVariable(key, processVariables.get(key),this.workingMemory.getEnvironment());
+            if(variable != null){
+                variable.setProcessInstanceInfo(processInstanceInfo);
+                processInstanceInfo.addVariables(variable);
+            }
+        }
+        //If we wont find any VariableInstanceInfo that mactches with the persistence strategy,
+        //we just serialize the variables inside the blob
+        if(processInstanceInfo.getVariables().size() == 0){
+            processInstanceInfo.setSerializeVariables(true);
+        }
+    }
+     private ProcessInstance restoreVariables(long id, ProcessInstance processInstance) {
+
+        VariableScopeInstance variableScopeInstance = (VariableScopeInstance)processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);
+        EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+        List<VariableInstanceInfo> variablesInfo = (List<VariableInstanceInfo>)em.createNamedQuery("VariableInstancesInfoByProcessId")
+                    .setParameter("processId", id)
+                    .getResultList();
+        for(VariableInstanceInfo variableInfo : variablesInfo){
+            VariablePersistenceStrategy persistenceStrategy =
+                        VariablePersistenceStrategyFactory.getVariablePersistenceStrategyFactory();
+            variableScopeInstance.setVariable(variableInfo.getName(), persistenceStrategy.getVariable(variableInfo,this.workingMemory.getEnvironment()));
+        }
+        variableScopeInstance.setProcessInstance(processInstance);
+       
+
+        return processInstance;
+    }
+
+
     public void internalAddProcessInstance(ProcessInstance processInstance) {
     	if (this.processInstances == null) {
         	this.processInstances = new HashMap<Long, ProcessInstance>();
@@ -66,8 +125,12 @@
             throw new IllegalArgumentException( "Could not find process " + processInstance.getProcessId() );
         }
         processInstance.setProcess( process );
+       if(!processInstanceInfo.isSerializeVariables()){
+                processInstance = restoreVariables(id,processInstance);
+            }
         if ( processInstance.getWorkingMemory() == null ) {
             processInstance.setWorkingMemory( (InternalWorkingMemory) workingMemory );
+            
             ((ProcessInstanceImpl) processInstance).reconnect();
         }
         return processInstance;

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-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -1,21 +1,26 @@
 package org.drools.persistence.processinstance;
 
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
+import javax.persistence.OneToMany;
 import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
 import javax.persistence.Version;
@@ -57,6 +62,11 @@
     private @Transient
     ProcessInstance processInstance;
 
+    private boolean serializeVariables=false;
+
+    @OneToMany(cascade=CascadeType.ALL, mappedBy="processInstanceInfo")
+    private List<VariableInstanceInfo> variables = new ArrayList<VariableInstanceInfo>();
+
     ProcessInstanceInfo() {
     }
 
@@ -103,7 +113,7 @@
                         bais, (InternalRuleBase) workingMemory.getRuleBase(), null, null);
                 context.wm = (InternalWorkingMemory) workingMemory;
                 ProcessInstanceMarshaller marshaller = getMarshallerFromContext(context);
-                processInstance = marshaller.readProcessInstance(context);
+                processInstance = marshaller.readProcessInstance(context,false);
                 context.close();
             } catch (IOException e) {
                 e.printStackTrace();
@@ -142,7 +152,8 @@
             saveProcessInstanceType(context, processInstance, processType);
             ProcessInstanceMarshaller marshaller = ProcessMarshallerRegistry.INSTANCE.getMarshaller(processType);
             marshaller.writeProcessInstance(
-                    context, processInstance);
+                    context, processInstance,false);
+
             context.close();
         } catch (IOException e) {
             throw new IllegalArgumentException(
@@ -160,4 +171,38 @@
             }
         }
     }
+    
+    /**
+     * @return the variables
+     */
+    public List<VariableInstanceInfo> getVariables() {
+        return variables;
+    }
+
+    /**
+     * @param variables the variables to set
+     */
+    public void setVariables(List<VariableInstanceInfo> variables) {
+        this.variables = variables;
+    }
+     public void addVariables(VariableInstanceInfo variable){
+        this.getVariables().add(variable);
+    }
+    public void clearVariables(){
+        this.getVariables().clear();
+    }
+
+    /**
+     * @return the serializeVariables
+     */
+    public boolean isSerializeVariables() {
+        return serializeVariables;
+    }
+
+    /**
+     * @param serializeVariables the serializeVariables to set
+     */
+    public void setSerializeVariables(boolean serializeVariables) {
+        this.serializeVariables = serializeVariables;
+    }
 }

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategy.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,137 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+package org.drools.persistence.processinstance;
+
+import org.drools.persistence.processinstance.persisters.VariablePersister;
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.runtime.Environment;
+import org.drools.util.ChainedProperties;
+
+/**
+ *
+ * @author salaboy
+ */
+public class VariablePersistenceStrategy {
+
+    private Properties types;
+
+    @SuppressWarnings("unchecked")
+    public VariableInstanceInfo persistVariable(String name, Object o, Environment env) {
+
+        VariablePersister persister = null;
+        //Here i should foreach an Array of types for multiple variable persistence
+        String persisterFQN = getVariablePersistenceType(o);
+        if (persisterFQN != null && !persisterFQN.equals("")) {
+            Class persisterClass = null;
+            try {
+                persisterClass = Class.forName(persisterFQN);
+                Constructor constructor;
+                constructor = persisterClass.getConstructor(null);
+                persister = (VariablePersister) constructor.newInstance(null);
+
+            } catch (ClassNotFoundException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (NoSuchMethodException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (SecurityException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (InstantiationException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (IllegalAccessException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (IllegalArgumentException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (InvocationTargetException ex) {
+                Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+            }
+
+
+            return persister.persistExternalVariable(name, o, env);
+
+        }
+        return null;
+    }
+
+    public Object getVariable(VariableInstanceInfo variableInfo, Environment env) {
+        try {
+            String variablePersister = variableInfo.getPersister();
+            VariablePersister persister = null;
+            Class clazz = Class.forName(variablePersister);
+            Constructor constructor = clazz.getDeclaredConstructor(null);
+            persister = (VariablePersister) constructor.newInstance(null);
+            return persister.getExternalPersistedVariable(variableInfo, env);
+        } catch (InstantiationException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (IllegalAccessException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (IllegalArgumentException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (InvocationTargetException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (NoSuchMethodException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (SecurityException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (ClassNotFoundException ex) {
+            Logger.getLogger(VariablePersistenceStrategy.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return null;
+    }
+
+
+    //this method should return an Array of types if multiple variable persistece is enabled
+    private String getVariablePersistenceType(Object o) {
+
+        Annotation[] annotations = o.getClass().getDeclaredAnnotations();
+        //First annotations, because annotations have more precedence (??)
+        for (Annotation annotation : annotations) {
+            String persisterFQN = getTypes().getProperty(annotation.annotationType().getName());
+            if (persisterFQN != null && !persisterFQN.equals("")) {
+                return persisterFQN;
+            }
+        }
+        //Then interfaces
+        Class[] interfaces = o.getClass().getInterfaces();
+        for (Class clazz : interfaces) {
+            String persisterFQN = getTypes().getProperty(clazz.getName());
+            if (persisterFQN != null && !persisterFQN.equals("")) {
+                return persisterFQN;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return the types
+     */
+    public Properties getTypes() {
+        return types;
+    }
+
+    /**
+     * @param types the types to set
+     */
+    public void setTypes(Properties types) {
+        this.types = types;
+    }
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategyFactory.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategyFactory.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/VariablePersistenceStrategyFactory.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,76 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.processinstance;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.util.ChainedProperties;
+
+
+/**
+ *
+ * @author salaboy
+ */
+
+public class VariablePersistenceStrategyFactory{
+    private static VariablePersistenceStrategy vPRS;
+
+    public VariablePersistenceStrategyFactory(){
+
+    }
+    public static VariablePersistenceStrategy getVariablePersistenceStrategyFactory(String propsFile){
+        Properties props = new Properties();
+        try {
+            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/"+propsFile);
+            if (is != null){
+                props.load(is);
+            }
+        } catch (IOException ex) {
+            Logger.getLogger(VariablePersistenceStrategyFactory.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        if(vPRS == null) {
+            vPRS = new VariablePersistenceStrategy();
+        }
+        vPRS.setTypes(props);
+        return vPRS;
+
+        //types.put("javax.persistence.Entity", "org.drools.persistence.processinstance.JPAVariablePersister");
+        //types.put("java.io.Serializable", "org.drools.persistence.processinstance.SerializableVariablePersister");
+        
+        
+    }
+    public static VariablePersistenceStrategy getVariablePersistenceStrategyFactory(){
+
+        if(vPRS == null) {
+            vPRS = new VariablePersistenceStrategy();
+        }
+        return vPRS;
+
+        //types.put("javax.persistence.Entity", "org.drools.persistence.processinstance.JPAVariablePersister");
+        //types.put("java.io.Serializable", "org.drools.persistence.processinstance.SerializableVariablePersister");
+
+
+    }
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/JPAVariablePersister.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/JPAVariablePersister.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/JPAVariablePersister.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,154 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+package org.drools.persistence.processinstance.persisters;
+
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
+import org.drools.persistence.processinstance.*;
+import org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Id;
+import javax.persistence.Persistence;
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.util.StringUtils;
+
+/**
+ *
+ * @author salaboy
+ */
+public class JPAVariablePersister implements VariablePersister {
+
+    public JPAVariablePersister() {
+    }
+
+    public VariableInstanceInfo persistExternalVariable(String name, Object o, Environment env) {
+        boolean localTransaction = false;
+        UserTransaction ut = null;
+        EntityManagerFactory emf = (EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY);
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+        VariableInstanceInfo variable = null;
+        try {
+            ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
+
+            if (ut.getStatus() == Status.STATUS_NO_TRANSACTION) {
+                // If there is no transaction then start one, we will commit within the same Command
+                ut.begin();
+                localTransaction = true;
+            }
+
+            EntityManager localEm = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+            if (localEm == null || !localEm.isOpen()) {
+                localEm = emf.createEntityManager(); // no need to call joinTransaction as it will do so if one already exists
+                env.set(EnvironmentName.ENTITY_MANAGER, localEm);
+            }
+
+            if (em == null) {
+                // there must have been a rollback to lazily re-initialise the state
+                em = emf.createEntityManager();
+
+            }
+
+            em.joinTransaction();
+
+            em.persist(o);
+
+            variable = new JPAPersistedVariable();
+
+            variable.setPersister(this.getClass().getName());
+            variable.setName(name);
+
+            ((JPAPersistedVariable) variable).setRealVariable(o);
+            Field[] fields = o.getClass().getDeclaredFields();
+            Number idValue = null;
+            for(int i=0; i< fields.length; i++){
+                Id id = fields[i].getAnnotation(Id.class);
+                if(id != null){
+                    idValue = (Long) o.getClass().getMethod("get"+Character.toUpperCase(fields[i].getName().charAt(0))+fields[i].getName().substring(1), new Class<?>[]{}).invoke(o, new Object[]{});
+                    break;
+                }
+            }
+
+            ((JPAPersistedVariable) variable).setVarid(idValue.longValue());
+            ((JPAPersistedVariable) variable).setVartype(o.getClass().getCanonicalName());
+
+            em.persist(variable);
+            
+
+            if (localTransaction) {
+                // it's a locally created transaction so commit
+                ut.commit();
+
+                // cleanup local entity manager
+                if (localEm.isOpen()) {
+                    localEm.close();
+                }
+                env.set(EnvironmentName.ENTITY_MANAGER, null);
+
+            // clean up cached process and work item instances
+
+            }
+
+
+
+        } catch (Throwable t1) {
+            t1.printStackTrace();
+            if (localTransaction) {
+                try {
+                    if (ut != null) {
+                        ut.rollback();
+                    }
+                    throw new RuntimeException("Could not execute command",
+                            t1);
+                } catch (Throwable t2) {
+                    throw new RuntimeException("Could not rollback transaction",
+                            t2);
+                }
+            } else {
+                throw new RuntimeException("Could not execute command",
+                        t1);
+            }
+        }
+        return variable;
+    }
+
+    public Object getExternalPersistedVariable(VariableInstanceInfo variableInstanceInfo, Environment env) {
+        EntityManagerFactory emf = (EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY);
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+        try {
+            String varType = ((JPAPersistedVariable) variableInstanceInfo).getVartype();
+            return em.find(Class.forName(varType), ((JPAPersistedVariable) variableInstanceInfo).getVarid());
+        } catch (ClassNotFoundException ex) {
+            Logger.getLogger(JPAVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return null;
+    }
+
+    public List<VariableInstanceInfo> getExternalPersistedVariables(Long processInstanceId) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/SerializableVariablePersister.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/SerializableVariablePersister.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/SerializableVariablePersister.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,174 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+package org.drools.persistence.processinstance.persisters;
+
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
+import org.drools.persistence.processinstance.*;
+import org.drools.persistence.processinstance.variabletypes.SerializablePersistedVariable;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.naming.InitialContext;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+
+/**
+ *
+ * @author salaboy
+ */
+public class SerializableVariablePersister implements VariablePersister {
+
+    public SerializableVariablePersister() {
+    }
+
+    public VariableInstanceInfo persistExternalVariable(String name, Object o, Environment env) {
+        boolean localTransaction = false;
+        UserTransaction ut = null;
+        EntityManagerFactory emf = (EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY);
+        EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+        SerializablePersistedVariable variable = null;
+        try {
+            ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
+
+            if (ut.getStatus() == Status.STATUS_NO_TRANSACTION) {
+                // If there is no transaction then start one, we will commit within the same Command
+                ut.begin();
+                localTransaction = true;
+            }
+
+            EntityManager localEm = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+            if (localEm == null || !localEm.isOpen()) {
+                localEm = emf.createEntityManager(); // no need to call joinTransaction as it will do so if one already exists
+                env.set(EnvironmentName.ENTITY_MANAGER, localEm);
+            }
+
+            if (em == null) {
+                // there must have been a rollback to lazily re-initialise the state
+                em = emf.createEntityManager();
+
+            }
+
+            em.joinTransaction();
+
+
+
+            variable = new SerializablePersistedVariable();
+            variable.setName(name);
+            variable.setPersister(this.getClass().getName());
+            variable.setContent(getBytes(o));
+
+            em.persist(variable);
+
+            if (localTransaction) {
+                // it's a locally created transaction so commit
+                ut.commit();
+
+                // cleanup local entity manager
+                if (localEm.isOpen()) {
+                    localEm.close();
+                }
+                env.set(EnvironmentName.ENTITY_MANAGER, null);
+
+            // clean up cached process and work item instances
+
+            }
+
+
+
+        } catch (Throwable t1) {
+            t1.printStackTrace();
+            if (localTransaction) {
+                try {
+                    if (ut != null) {
+                        ut.rollback();
+                    }
+                    throw new RuntimeException("Could not execute command",
+                            t1);
+                } catch (Throwable t2) {
+                    throw new RuntimeException("Could not rollback transaction",
+                            t2);
+                }
+            } else {
+                throw new RuntimeException("Could not execute command",
+                        t1);
+            }
+        }
+
+        return variable;
+
+
+    }
+
+    public Object getExternalPersistedVariable(VariableInstanceInfo variableInstanceInfo, Environment env) {
+        ObjectInputStream ois = null;
+        byte[] binaryArray = null;
+        try {
+            binaryArray = ((SerializablePersistedVariable) variableInstanceInfo).getContent();
+            ByteArrayInputStream strmBytes = new ByteArrayInputStream(binaryArray);
+            ois = new ObjectInputStream(strmBytes);
+            return ois.readObject();
+
+        } catch (IOException ex) {
+            Logger.getLogger(SerializableVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (ClassNotFoundException ex) {
+            Logger.getLogger(JPAVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                ois.close();
+            } catch (IOException ex) {
+                Logger.getLogger(SerializableVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+
+
+        return null;
+    }
+
+    private byte[] getBytes(Object o) {
+        ObjectOutputStream oos = null;
+        try {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            oos = new ObjectOutputStream(bos);
+            oos.writeObject(o);
+            oos.flush();
+            oos.close();
+            bos.close();
+            byte[] data = bos.toByteArray();
+            return data;
+        } catch (IOException ex) {
+            Logger.getLogger(SerializableVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                oos.close();
+            } catch (IOException ex) {
+                Logger.getLogger(SerializableVariablePersister.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        return null;
+    }
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/VariablePersister.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/VariablePersister.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/persisters/VariablePersister.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,38 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.processinstance.persisters;
+
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
+import org.drools.runtime.Environment;
+
+/**
+ *
+ * @author salaboy
+ */
+
+public interface VariablePersister {
+    
+    public VariableInstanceInfo persistExternalVariable(String name, Object o, Environment env);
+
+    public Object getExternalPersistedVariable(VariableInstanceInfo variableInstanceInfo, Environment env);
+
+   
+
+    
+
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/JPAPersistedVariable.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/JPAPersistedVariable.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/JPAPersistedVariable.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,80 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.processinstance.variabletypes;
+
+import org.drools.persistence.processinstance.*;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+
+
+/**
+ *
+ * @author salaboy
+ */
+
+ at Entity
+public class JPAPersistedVariable extends VariableInstanceInfo {
+     @Transient
+     private Object realVariable;
+     private String vartype;
+     private Long varid;
+
+      /**
+     * @return the vartype
+     */
+    public String getVartype() {
+        return vartype;
+    }
+
+    /**
+     * @param vartype the vartype to set
+     */
+    public void setVartype(String vartype) {
+        this.vartype = vartype;
+    }
+
+    /**
+     * @return the varid
+     */
+    public Long getVarid() {
+        return varid;
+    }
+
+    /**
+     * @param varid the varid to set
+     */
+    public void setVarid(Long varid) {
+        this.varid = varid;
+    }
+
+    /**
+     * @return the realVariable
+     */
+    public Object getRealVariable() {
+        return realVariable;
+    }
+
+    /**
+     * @param realVariable the realVariable to set
+     */
+    public void setRealVariable(Object realVariable) {
+        this.realVariable = realVariable;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/SerializablePersistedVariable.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/SerializablePersistedVariable.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/SerializablePersistedVariable.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,47 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.processinstance.variabletypes;
+
+import org.drools.persistence.processinstance.*;
+import javax.persistence.Entity;
+import javax.persistence.Lob;
+
+/**
+ *
+ * @author salaboy
+ */
+ at Entity
+public class SerializablePersistedVariable extends VariableInstanceInfo{
+    @Lob
+    private byte[] content;
+
+    /**
+     * @return the content
+     */
+    public byte[] getContent() {
+        return content;
+    }
+
+    /**
+     * @param content the content to set
+     */
+    public void setContent(byte[] content) {
+        this.content = content;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,105 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.processinstance.variabletypes;
+
+import org.drools.persistence.processinstance.*;
+import java.io.Serializable;
+
+
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+
+
+/**
+ *
+ * @author salaboy
+ */
+ at Entity
+ at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING,length=50)
+ at DiscriminatorValue("GEN")
+public class VariableInstanceInfo implements Serializable {
+    @Id @GeneratedValue(strategy=GenerationType.AUTO)
+    private Long id;
+    private String name;
+    @ManyToOne()
+    @JoinColumn(name="processInstanceInfoId")
+    private ProcessInstanceInfo processInstanceInfo;
+    private String persister;
+   
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the processInstanceInfo
+     */
+    public ProcessInstanceInfo getProcessInstanceInfo() {
+        return processInstanceInfo;
+    }
+
+    /**
+     * @param processInstanceInfo the processInstanceInfo to set
+     */
+    public void setProcessInstanceInfo(ProcessInstanceInfo processInstanceInfo) {
+        this.processInstanceInfo = processInstanceInfo;
+    }
+
+    /**
+     * @return the persister
+     */
+    public String getPersister() {
+        return persister;
+    }
+
+    /**
+     * @param persister the persister to set
+     */
+    public void setPersister(String persister) {
+        this.persister = persister;
+    }
+}

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/orm.xml	2009-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/orm.xml	2009-05-06 17:21:56 UTC (rev 26401)
@@ -13,4 +13,14 @@
     :type in elements(processInstanceInfo.eventTypes)
           </query>
       </named-query>
+       <named-query name="VariableInstancesInfoByProcessId">
+          <query>
+select
+    v
+from
+    VariableInstanceInfo v
+where
+    v.processInstanceInfo.id = :processId
+          </query>
+      </named-query>
 </entity-mappings>

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/persistence.xml	2009-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/main/resources/META-INF/persistence.xml	2009-05-06 17:21:56 UTC (rev 26401)
@@ -1,34 +1,26 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<persistence
-    version="1.0"
-    xsi:schemaLocation=
-    	"http://java.sun.com/xml/ns/persistence
-    	 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
-		 http://java.sun.com/xml/ns/persistence/orm 
-		 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
-    xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns="http://java.sun.com/xml/ns/persistence">
-
- <!--persistence-unit name="ProcessService">
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd    http://java.sun.com/xml/ns/persistence/orm     http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
+  <!--persistence-unit name="ProcessService">
   <jta-data-source>java:/DefaultDS</jta-data-source>
   <properties>
    <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
   </properties>
  </persistence-unit-->
-
-    <persistence-unit name="org.drools.persistence.jpa" transaction-type="JTA">
-        <provider>org.hibernate.ejb.HibernatePersistence</provider>
-        <jta-data-source>jdbc/testDS1</jta-data-source>        
-        <class>org.drools.persistence.session.SessionInfo</class>
-
-	    <properties>
-	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>	        
-	        <property name="hibernate.max_fetch_depth" value="3"/>
-		    <property name="hibernate.hbm2ddl.auto" value="update" />
-            <property name="hibernate.show_sql" value="true" />	
-            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
-	    </properties>        
-    </persistence-unit>
-    
-</persistence>
\ No newline at end of file
+  <persistence-unit name="org.drools.persistence.jpa" transaction-type="JTA">
+    <provider>org.hibernate.ejb.HibernatePersistence</provider>
+    <jta-data-source>jdbc/testDS1</jta-data-source>
+    <class>org.drools.persistence.session.SessionInfo</class>
+    <class>org.drools.persistence.processinstance.ProcessInstanceInfo</class>
+    <class>org.drools.persistence.session.MyEntity</class>
+    <class>org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable</class>
+    <class>org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo</class>
+    <properties>
+      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
+      <property name="hibernate.max_fetch_depth" value="3"/>
+      <property name="hibernate.hbm2ddl.auto" value="update"/>
+      <property name="hibernate.show_sql" value="true"/>
+      <property name="hibernate.connection.autocommit" value="false"/>
+      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup"/>
+    </properties>
+  </persistence-unit>
+</persistence>

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyEntity.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,70 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.session;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ *
+ * @author salaboy
+ */
+ at Entity
+public class MyEntity implements Serializable {
+    @Id @GeneratedValue(strategy=GenerationType.AUTO)
+    private Long id;
+    private String test;
+
+    MyEntity(){}
+
+    MyEntity(String string) {
+        this.test= string;
+    }
+
+    /**
+     * @return the id
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * @param id the id to set
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * @return the test
+     */
+    public String getTest() {
+        return test;
+    }
+
+    /**
+     * @param test the test to set
+     */
+    public void setTest(String test) {
+        this.test = test;
+    }
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/MyVariableSerializable.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,48 @@
+/*
+ *  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
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.drools.persistence.session;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author salaboy
+ */
+class MyVariableSerializable implements Serializable{
+
+    private String text = "";
+
+    public MyVariableSerializable(String string) {
+        this.text = string;
+    }
+
+    /**
+     * @return the text
+     */
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * @param text the text to set
+     */
+    public void setText(String text) {
+        this.text = 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-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-05-06 17:21:56 UTC (rev 26401)
@@ -51,6 +51,10 @@
 
 import bitronix.tm.TransactionManagerServices;
 import bitronix.tm.resource.jdbc.PoolingDataSource;
+import java.util.HashMap;
+import java.util.Map;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
 
 public class SingleSessionCommandServiceTest extends TestCase {
 
@@ -763,5 +767,61 @@
         list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
         return list;
     }
+    public void testPersistenceVariables() {
+          Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( EnvironmentName.TRANSACTION_MANAGER,
+                 TransactionManagerServices.getTransactionManager() );
 
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
+
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                "org.drools.persistence.session.SingleSessionCommandService" );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                "org.drools.persistence.processinstance.JPASignalManagerFactory" );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        SingleSessionCommandService service = new SingleSessionCommandService( kbase,
+                                                                               config,
+                                                                               env );
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId("org.drools.test.TestProcess");
+        Map<String,Object> parameters = new HashMap<String,Object>();
+
+        parameters.put("var1", new MyEntity("This is a test Entity"));
+        parameters.put("var2", new MyVariableSerializable("This is a test SerializableObject"));
+
+        startProcessCommand.setParameters(parameters);
+        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
+        System.out.println("Started process instance " + processInstance.getId());
+
+        service = new SingleSessionCommandService(kbase, config,env);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+
+        VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+                ((RuleFlowProcessInstance)processInstance).getContextInstance(VariableScope.VARIABLE_SCOPE);
+        Map<String, Object> variables = variableScopeInstance.getVariables();
+
+        MyEntity var1 = (MyEntity)variables.get("var1");
+        MyVariableSerializable var2 = (MyVariableSerializable)variables.get("var2");
+
+        assertNotNull(var1);
+        assertEquals("This is a test Entity", var1.getTest());
+        assertNotNull(var2);
+        assertEquals("This is a test SerializableObject", var2.getText());
+
+
+
+    }
 }

Added: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/PersistenceStrategies.conf
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/PersistenceStrategies.conf	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/PersistenceStrategies.conf	2009-05-06 17:21:56 UTC (rev 26401)
@@ -0,0 +1,2 @@
+javax.persistence.Entity = org.drools.persistence.processinstance.persisters.JPAVariablePersister
+java.io.Serializable = org.drools.persistence.processinstance.persisters.SerializableVariablePersister
\ No newline at end of file

Modified: labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/drools.session.conf
===================================================================
--- labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/drools.session.conf	2009-05-06 17:16:05 UTC (rev 26400)
+++ labs/jbossrules/branches/salaboy_RelationalVariablePersistence/drools-persistence-jpa/src/test/resources/META-INF/drools.session.conf	2009-05-06 17:21:56 UTC (rev 26401)
@@ -2,4 +2,5 @@
 #drools.commandService = org.drools.persistence.session.SingleSessionCommandService
 #drools.processInstanceManagerFactory = org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory
 #drools.workItemManagerFactory = org.drools.persistence.processinstance.JPAWorkItemManagerFactory
-#drools.processSignalManagerFactory = org.drools.persistence.processinstance.JPASignalManagerFactory
\ No newline at end of file
+#drools.processSignalManagerFactory = org.drools.persistence.processinstance.JPASignalManagerFactory
+drools.persistence.strategies = PersistenceStrategies.conf
\ No newline at end of file




More information about the jboss-svn-commits mailing list