[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