[jbpm-commits] JBoss JBPM SVN: r2554 - in jbpm3/branches/tbaeyens/modules/core/src: main/java/org/jbpm/graph/exe and 5 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 16 09:32:13 EDT 2008


Author: tom.baeyens at jboss.com
Date: 2008-10-16 09:32:12 -0400 (Thu, 16 Oct 2008)
New Revision: 2554

Modified:
   jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
   jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/GraphSession.java
   jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java
   jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
   jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/logging/log/ProcessLog.java
   jbpm3/branches/tbaeyens/modules/core/src/main/resources/hibernate.common.xml
   jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
   jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/ActionLog.hbm.xml
   jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/SignalLog.hbm.xml
   jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/TransitionLog.hbm.xml
   jbpm3/branches/tbaeyens/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java
Log:
process instance deletion fixes

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -21,12 +21,16 @@
  */
 package org.jbpm.db;
 
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
 import org.hibernate.tool.hbm2ddl.SchemaExport;
 import org.jbpm.AbstractJbpmTestCase;
 import org.jbpm.JbpmConfiguration;
@@ -37,6 +41,8 @@
 import org.jbpm.job.Job;
 import org.jbpm.job.executor.JobExecutor;
 import org.jbpm.logging.log.ProcessLog;
+import org.jbpm.persistence.db.DbPersistenceService;
+import org.jbpm.persistence.db.DbPersistenceServiceFactory;
 import org.jbpm.taskmgmt.exe.TaskInstance;
 
 public abstract class AbstractDbTestCase extends AbstractJbpmTestCase
@@ -68,55 +74,37 @@
   {
     resetMembers();
     closeJbpmContext();
+    ensureCleanDatabase();
     
-    if (hasLeftOverRecords())
-    {
-      dropSchema();
-      // Failing here, will probably hide a potential previous failure.
-      // Is there a better way to fail without hiding a potential cause?
-      fail("Test failed to cleanup database records");
-    }
-    
     super.tearDown();
   }
 
-  private boolean hasLeftOverRecords()
+  private void ensureCleanDatabase()
   {
-    boolean foundLeftOvers = false;
-    JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext();
-    Session session = jbpmContext.getSession();
-    try
-    {
-      if (session.createQuery("from " + ProcessDefinition.class.getName()).list().size() > 0)
-      {
-        System.err.println("FIXME: left over ProcessDefinition after: " + getShortName());
-        foundLeftOvers = true;
+    boolean hasLeftOvers = false;
+    
+    DbPersistenceServiceFactory dbPersistenceServiceFactory = (DbPersistenceServiceFactory) getJbpmConfiguration().getServiceFactory("persistence");
+    Configuration configuration = dbPersistenceServiceFactory.getConfiguration();
+    JbpmSchema jbpmSchema = new JbpmSchema(configuration);
+    
+    Map jbpmTablesRecordCount = jbpmSchema.getJbpmTablesRecordCount();
+    Iterator iter = jbpmTablesRecordCount.entrySet().iterator();
+    while (iter.hasNext()) {
+      Map.Entry entry = (Map.Entry) iter.next();
+      String tableName = (String) entry.getKey();
+      Integer count = (Integer) entry.getValue();
+      
+      if ( (count==null)
+           || (count != 0)
+         ) {
+        hasLeftOvers = true;
+        System.err.println("FIXME: "+count+" left over records in " + tableName);
       }
-      if (session.createQuery("from " + ProcessInstance.class.getName()).list().size() > 0)
-      {
-        System.err.println("FIXME: left over ProcessInstance after: " + getShortName());
-        foundLeftOvers = true;
-      }
-      if (session.createQuery("from " + ProcessLog.class.getName()).list().size() > 0)
-      {
-        System.err.println("FIXME: left over ProcessLog after: " + getShortName());
-        foundLeftOvers = true;
-      }
-      if (session.createQuery("from " + Token.class.getName()).list().size() > 0)
-      {
-        System.err.println("FIXME: left over Token after: " + getShortName());
-        foundLeftOvers = true;
-      }
     }
-    catch (Exception ex)
-    {
-      System.err.println("FIXME: cannot query left overs: " + ex);
+    
+    if (hasLeftOvers) {
+      jbpmSchema.cleanSchema();
     }
-    finally
-    {
-      jbpmContext.close();
-    }
-    return foundLeftOvers;
   }
 
   public void beginSessionTransaction()

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/GraphSession.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/GraphSession.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/GraphSession.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -29,6 +29,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.hibernate.Hibernate;
 import org.hibernate.HibernateException;
 import org.hibernate.LockMode;
 import org.hibernate.Query;
@@ -38,6 +39,7 @@
 import org.jbpm.graph.exe.ProcessInstance;
 import org.jbpm.graph.exe.Token;
 import org.jbpm.graph.node.ProcessState;
+import org.jbpm.logging.log.ProcessLog;
 
 /**
  * are the graph related database operations.
@@ -379,52 +381,45 @@
 
   public void deleteProcessInstance(ProcessInstance processInstance, boolean includeTasks, boolean includeJobs) {
     if (processInstance==null) throw new JbpmException("processInstance is null in JbpmSession.deleteProcessInstance()");
+    log.debug("deleting process instance "+processInstance.getId());
+    session.flush();
     try {
-      // find the tokens
-      Query query = session.getNamedQuery("GraphSession.findTokensForProcessInstance");
-      query.setEntity("processInstance", processInstance);
-      List tokens = query.list();
-
-      if (!tokens.isEmpty()) {
-        // deleteSubProcesses
-        Iterator iter = tokens.iterator();
-        while (iter.hasNext()) {
-          Token token = (Token) iter.next();
-          deleteSubProcesses(token);
-        }
-      }
-
       // jobs
       if (includeJobs) {
-        query = session.getNamedQuery("GraphSession.deleteJobsForProcessInstance");
+        log.debug("deleting jobs for process instance "+processInstance.getId());
+        Query query = session.getNamedQuery("GraphSession.deleteJobsForProcessInstance");
         query.setEntity("processInstance", processInstance);
         query.executeUpdate();
+        session.flush();
       }
       
       // tasks
       if (includeTasks) {
-        query = session.getNamedQuery("GraphSession.findTaskInstanceIdsForProcessInstance");
+        Query query = session.getNamedQuery("GraphSession.findTaskInstanceIdsForProcessInstance");
         query.setEntity("processInstance", processInstance);
         List taskInstanceIds = query.list();
         
-        query = session.getNamedQuery("GraphSession.deleteTaskInstancesById");
-        query.setParameterList("taskInstanceIds", taskInstanceIds);
-      }
-       
-      if (!tokens.isEmpty()) {
-        // delete the logs for all the process instance's tokens
-        query = session.getNamedQuery("GraphSession.selectLogsForTokens");
-        query.setParameterList("tokens", tokens);
-        List logs = query.list();
-        Iterator iter = logs.iterator();
-        while (iter.hasNext()) {
-          session.delete(iter.next());
+        if ( (taskInstanceIds!=null)
+             && (!taskInstanceIds.isEmpty())
+           ) {
+          log.debug("deleting tasks "+taskInstanceIds+" for process instance "+processInstance.getId());
+          query = session.getNamedQuery("GraphSession.deleteTaskInstancesById");
+          query.setParameterList("taskInstanceIds", taskInstanceIds);
         }
+        session.flush();
       }
 
-      // then delete the process instance
+      // delete the logs
+      deleteLogs(processInstance);
+
+      // delete the tokens and subprocess instances
+      deleteSubProcesses(processInstance.getRootToken());
+
+      // add the process instance
+      log.debug("deleting process instance "+processInstance.getId());
       session.delete(processInstance);
-      
+      session.flush();
+
     } catch (Exception e) {
       log.error(e);
       jbpmSession.handleException();
@@ -432,33 +427,40 @@
     } 
   }
 
-  void deleteSubProcesses(Token token) {
-    Query query = session.getNamedQuery("GraphSession.findSubProcessInstances");
-    query.setEntity("processInstance", token.getProcessInstance());
-    List processInstances = query.list();
-
-    if (processInstances == null || processInstances.isEmpty()) {
-      return; 
-    }
-    
-    Iterator iter = processInstances.iterator();
+  void deleteLogs(ProcessInstance processInstance) {
+    Query query = session.getNamedQuery("GraphSession.findLogsForProcessInstance");
+    query.setEntity("processInstance", processInstance);
+    List logs = query.list();
+    Iterator iter = logs.iterator();
     while (iter.hasNext()) {
-      ProcessInstance subProcessInstance = (ProcessInstance) iter.next();
-      subProcessInstance.setSuperProcessToken(null);
-      token.setSubProcessInstance(null);
-      deleteProcessInstance(subProcessInstance);
-      session.flush();
+      ProcessLog processLog = (ProcessLog) iter.next();
+      session.delete(processLog);
     }
-    
-    if (token.getChildren()!=null) {
-      iter = token.getChildren().values().iterator();
+  }
+
+  void deleteSubProcesses(Token token) {
+    if (token!=null) {
+      Query query = session.getNamedQuery("GraphSession.findSubProcessInstances");
+      query.setEntity("processInstance", token.getProcessInstance());
+      List processInstances = query.list();
+      
+      if (processInstances == null || processInstances.isEmpty()) {
+        log.debug("no subprocesses to delete for token "+token.getId());
+        return; 
+      }
+  
+      Iterator iter = processInstances.iterator();
       while (iter.hasNext()) {
-        Token child = (Token) iter.next();
-        deleteSubProcesses(child);
+        ProcessInstance subProcessInstance = (ProcessInstance) iter.next();
+        subProcessInstance.setSuperProcessToken(null);
+        token.setSubProcessInstance(null);
+        log.debug("deleting sub process "+subProcessInstance.getId());
+        deleteProcessInstance(subProcessInstance);
       }
     }
   }
 
+
   public static class AverageNodeTimeEntry {
     private long nodeId;
     private String nodeName;

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/db/JbpmSchema.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -35,8 +35,10 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.logging.Log;
@@ -210,7 +212,41 @@
     }
     return jbpmTableNames;
   }
+  
+  public Map getJbpmTablesRecordCount() {
+    Map recordCounts = new HashMap();
+    
+    String sql = null;
+    
+    try
+    {
+      Iterator iter = getJbpmTables().iterator();
 
+      createConnection();
+      while (iter.hasNext()) {
+        statement = connection.createStatement();
+        String tableName = (String) iter.next();
+        sql = "SELECT COUNT(*) FROM "+tableName;
+        ResultSet resultSet = statement.executeQuery(sql);
+        resultSet.next();
+        int count = resultSet.getInt(1);
+        resultSet.close();
+        statement.close();
+        recordCounts.put(tableName, count);
+      }
+    }
+    catch (SQLException e)
+    {
+      throw new JbpmException("couldn't execute sql '" + sql + "'", e);
+    }
+    finally
+    {
+      closeConnection();
+    }
+
+    return recordCounts;
+  }
+
   public void dropSchema()
   {
     execute(getDropSql());

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/graph/exe/Token.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/graph/exe/Token.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -663,7 +663,7 @@
   public boolean isLocked() {
     return lock!=null;
   }
-
+  
   // getters and setters //////////////////////////////////////////////////////
 
   public long getId() {

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/logging/log/ProcessLog.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/logging/log/ProcessLog.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/java/org/jbpm/logging/log/ProcessLog.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -82,4 +82,7 @@
   public int getIndex() {
     return index;
   }
+  public List getChildren() {
+    return null;
+  }
 }

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/resources/hibernate.common.xml
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/resources/hibernate.common.xml	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/resources/hibernate.common.xml	2008-10-16 13:32:12 UTC (rev 2554)
@@ -25,7 +25,7 @@
     <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
 
     <!-- logging properties --> 
-    <property name="hibernate.format_sql">true</property>
+    <property name="hibernate.format_sql">false</property>
     <property name="hibernate.use_sql_comments">true</property>
 
     <!-- ############################################ -->

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2008-10-16 13:32:12 UTC (rev 2554)
@@ -133,14 +133,6 @@
     ]]>
   </query>
   
-  <query name="GraphSession.findTokensForProcessInstance">
-    <![CDATA[
-      select token
-      from org.jbpm.graph.exe.Token token
-      where token.processInstance = :processInstance
-    ]]>
-  </query>
-  
   <query name="GraphSession.findTokensForProcessInNode">
     <![CDATA[
       select token
@@ -158,15 +150,16 @@
       and  processInstance.key = :key
     ]]>
   </query>
-
-  <query name="GraphSession.selectLogsForTokens">
+  
+  <query name="GraphSession.findLogsForProcessInstance">
     <![CDATA[
       select pl
       from org.jbpm.logging.log.ProcessLog as pl
-      where pl.token in (:tokens)
+      where pl.token.processInstance = :processInstance
     ]]>
   </query>
   
+  
   <query name="GraphSession.findTaskInstanceIdsForProcessInstance">
     <![CDATA[
       select t 

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/ActionLog.hbm.xml
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/ActionLog.hbm.xml	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/ActionLog.hbm.xml	2008-10-16 13:32:12 UTC (rev 2554)
@@ -7,7 +7,7 @@
 <hibernate-mapping auto-import="false" default-access="field">
 
   <subclass name="org.jbpm.graph.log.ActionLog" 
-            extends="org.jbpm.logging.log.ProcessLog"
+            extends="org.jbpm.logging.log.CompositeLog"
             discriminator-value="A">
             
     <property name="exception" column="EXCEPTION_" type="text"/>

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/SignalLog.hbm.xml
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/SignalLog.hbm.xml	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/SignalLog.hbm.xml	2008-10-16 13:32:12 UTC (rev 2554)
@@ -7,7 +7,7 @@
 <hibernate-mapping auto-import="false" default-access="field">
 
   <subclass name="org.jbpm.graph.log.SignalLog" 
-            extends="org.jbpm.logging.log.ProcessLog"
+            extends="org.jbpm.logging.log.CompositeLog"
             discriminator-value="S">
     <many-to-one name="transition" column="TRANSITION_" class="org.jbpm.graph.def.Transition" foreign-key="FK_LOG_TRANSITION" />
   </subclass>

Modified: jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/TransitionLog.hbm.xml
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/TransitionLog.hbm.xml	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/main/resources/org/jbpm/graph/log/TransitionLog.hbm.xml	2008-10-16 13:32:12 UTC (rev 2554)
@@ -7,7 +7,7 @@
 <hibernate-mapping auto-import="false" default-access="field">
 
   <subclass name="org.jbpm.graph.log.TransitionLog" 
-            extends="org.jbpm.logging.log.ProcessLog"
+            extends="org.jbpm.logging.log.CompositeLog"
             discriminator-value="T">
             
     <many-to-one name="transition" 

Modified: jbpm3/branches/tbaeyens/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java
===================================================================
--- jbpm3/branches/tbaeyens/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java	2008-10-16 10:53:31 UTC (rev 2553)
+++ jbpm3/branches/tbaeyens/modules/core/src/test/java/org/jbpm/jbpm983/JBPM983Test.java	2008-10-16 13:32:12 UTC (rev 2554)
@@ -113,30 +113,20 @@
 
   public void testConcurrentJobs() throws Exception
   {
-    if (true)
-    {
-      System.out.println("FIXME [JBPM-1736]: Cleanup JBPM983Test");
-      return;
-    }
-    
     assertTrue(getJbpmConfiguration().getJobExecutor().getNbrOfThreads() > 1);
 
     log.info("### TEST: deploy + start processes ###");
 
     ProcessDefinition subProcessDefinition = ProcessDefinition.parseXmlString(SUBPROCESS_XML);
+    jbpmContext.deployProcessDefinition(subProcessDefinition);
+
+    newTransaction();
+
     ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(PROCESS_XML);
+    jbpmContext.deployProcessDefinition(processDefinition);
     
-    JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext();
-    try
-    {
-      jbpmContext.deployProcessDefinition(subProcessDefinition);
-      jbpmContext.deployProcessDefinition(processDefinition);
-    }
-    finally
-    {
-      jbpmContext.close();
-    }
-
+    newTransaction();
+    
     // create test properties
     Map testVariables = new HashMap();
     testVariables.put("test", "true");
@@ -147,18 +137,11 @@
     {
       log.info("#################### TEST: starting process " + i + " ####################");
 
-      jbpmContext = getJbpmConfiguration().createJbpmContext();
-      try
-      {
-        ProcessInstance pi = jbpmContext.newProcessInstanceForUpdate("superprocess");
-        pi.getContextInstance().addVariables(testVariables);
-        pi.signal();
-        piIds[i] = pi.getId();
-      }
-      finally
-      {
-        jbpmContext.close();
-      }
+      ProcessInstance pi = jbpmContext.newProcessInstanceForUpdate("superprocess");
+      pi.getContextInstance().addVariables(testVariables);
+      pi.signal();
+      piIds[i] = pi.getId();
+      newTransaction();
     }
 
     for (int i = 0; i < processCount; i++)
@@ -168,19 +151,18 @@
       long piId = piIds[i];
       waitFor(piId);
 
-      jbpmContext = getJbpmConfiguration().createJbpmContext();
-      try
-      {
-        ProcessInstance pi = jbpmContext.loadProcessInstance(piId);
-        assertEquals("end-state-success", pi.getRootToken().getNode().getName());
-      }
-      finally
-      {
-        jbpmContext.close();
-      }
-
-      log.info("#################### TEST: finished ####################");
+      ProcessInstance pi = jbpmContext.loadProcessInstance(piId);
+      assertEquals("end-state-success", pi.getRootToken().getNode().getName());
     }
+
+    log.info("#################### TEST: cleanup ####################");
+
+    newTransaction();
+    graphSession.deleteProcessDefinition(processDefinition.getId());
+    newTransaction();
+    graphSession.deleteProcessDefinition(subProcessDefinition.getId());
+    
+    session.flush();
   }
 
   protected void waitFor(long piId) throws Exception
@@ -199,7 +181,7 @@
       log.info("waiting for workflow completion....");
       try
       {
-        Thread.sleep(1000);
+        Thread.sleep(500);
       }
       catch (InterruptedException e)
       {
@@ -232,13 +214,7 @@
       String tokenName = executionContext.getToken().toString();
 
       log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): begin");
-
-      for (int i = 0; i < 5; i++)
-      {
-        log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): working...");
-        Thread.sleep(100);
-      }
-
+      Thread.sleep(50);
       log.info("ACTION (process=" + processName + ",node=" + nodeName + ",token=" + tokenName + "): end");
 
       executionContext.leaveNode();




More information about the jbpm-commits mailing list