提交 b503cc12 编写于 作者: T tombaeyens

ACT-60 switching back from activity instances to executions: fixing...

ACT-60 switching back from activity instances to executions: fixing persistence and refactoring queries
上级 cab8db59
......@@ -25,8 +25,7 @@ public class JavaServiceTaskTest extends ProcessEngineTestCase {
@Deployment
public void testJavaServiceDelegation() {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("javaServiceDelegation",
CollectionUtil.singletonMap("input", "Activiti BPM Engine"));
ProcessInstance pi = runtimeService.startProcessInstanceByKey("javaServiceDelegation", CollectionUtil.singletonMap("input", "Activiti BPM Engine"));
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId())
.activityId("waitState")
......
......@@ -71,6 +71,7 @@ public class IdentityTest extends ProcessEngineTestCase {
List<Group> groups = identityService.findGroupsByUserAndType("johndoe", "security-role");
Set<String> groupIds = getGroupIds(groups);
Set<String> expectedGroupIds = new HashSet<String>();
expectedGroupIds.add("sales");
expectedGroupIds.add("user");
expectedGroupIds.add("admin");
assertEquals(expectedGroupIds, groupIds);
......
......@@ -18,7 +18,7 @@ package org.activiti.engine;
*/
public enum SortOrder {
ASCENDING,
DESCENDING;
ASC,
DESC;
}
......@@ -16,6 +16,7 @@ import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.Page;
import org.activiti.engine.SortOrder;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
......@@ -26,9 +27,19 @@ import org.activiti.engine.impl.interceptor.CommandExecutor;
*
* @author Joram Barrez
*/
public abstract class AbstractQuery<T> {
public abstract class AbstractQuery<T> implements Command<Object>{
private static enum ResultType {
LIST, PAGINATED_LIST, SINGLE_RESULT, COUNT
}
protected CommandExecutor commandExecutor;
protected String sortColumn;
protected SortOrder sortOrder;
protected int start;
protected int size;
protected ResultType resultType;
protected AbstractQuery() {
}
......@@ -37,44 +48,41 @@ public abstract class AbstractQuery<T> {
this.commandExecutor = commandExecutor;
}
@SuppressWarnings("unchecked")
public T singleResult() {
return commandExecutor.execute(new Command<T>() {
public T execute(CommandContext commandContext) {
return executeSingleResult(commandContext);
};
});
this.resultType = ResultType.SINGLE_RESULT;
return (T) commandExecutor.execute(this);
}
@SuppressWarnings("unchecked")
public List<T> list() {
return commandExecutor.execute(new Command<List<T>>() {
public List<T> execute(CommandContext commandContext) {
return executeList(commandContext, null);
};
});
this.resultType = ResultType.LIST;
return (List) commandExecutor.execute(this);
}
public List<T> paginatedList(final int start, final int size) {
return commandExecutor.execute(new Command<List<T>>() {
public List<T> execute(CommandContext commandContext) {
return executeList(commandContext, new Page(start, size));
};
});
@SuppressWarnings("unchecked")
public List<T> paginatedList(int start, int size) {
this.start = start;
this.size = size;
this.resultType = ResultType.PAGINATED_LIST;
return (List) commandExecutor.execute(this);
}
public long count() {
return commandExecutor.execute(new Command<Long>() {
public Long execute(CommandContext commandContext) {
return executeCount(commandContext);
};
});
this.resultType = ResultType.COUNT;
return (Long) commandExecutor.execute(this);
}
public Object execute(CommandContext commandContext) {
if (resultType==ResultType.LIST) {
return executeList(commandContext, null);
} else if (resultType==ResultType.SINGLE_RESULT) {
return executeSingleResult(commandContext);
} else if (resultType==ResultType.PAGINATED_LIST) {
return executeList(commandContext, new Page(start, size));
} else {
return executeCount(commandContext);
}
}
public abstract long executeCount(CommandContext commandContext);
......@@ -94,4 +102,29 @@ public abstract class AbstractQuery<T> {
}
return null;
}
protected void orderAscToBeOverridden(String column) {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.ASC;
this.sortColumn = column;
}
public void orderDescToBeOverridden(String column) {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.DESC;
this.sortColumn = column;
}
public String getSortColumn() {
return sortColumn;
}
public SortOrder getSortOrder() {
return sortOrder;
}
}
......@@ -26,6 +26,8 @@ import org.activiti.engine.impl.interceptor.CommandExecutor;
* @author Tom Baeyens
*/
public class ProcessDefinitionQueryImpl extends AbstractQuery<ProcessDefinition> implements ProcessDefinitionQuery {
protected String deploymentId;
public ProcessDefinitionQueryImpl() {
}
......@@ -34,18 +36,27 @@ public class ProcessDefinitionQueryImpl extends AbstractQuery<ProcessDefinition>
super(commandExecutor);
}
public ProcessDefinitionQueryImpl deploymentId(String deploymentId) {
this.deploymentId = deploymentId;
return this;
}
@Override
public long executeCount(CommandContext commandContext) {
return 0;
return commandContext
.getRepositorySession()
.findProcessDefinitionCountByQueryCriteria(this);
}
@SuppressWarnings("unchecked")
@Override
public List<ProcessDefinition> executeList(CommandContext commandContext, Page page) {
return null;
return (List) commandContext
.getRepositorySession()
.findProcessDefinitionsByQueryCriteria(this, page);
}
public ProcessDefinitionQueryImpl deploymentId(String deploymentId) {
return null;
public String getDeploymentId() {
return deploymentId;
}
}
......@@ -58,7 +58,7 @@ public class TablePageQueryImpl implements TablePageQuery {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.ASCENDING;
this.sortOrder = SortOrder.ASC;
this.sortColumn = column;
return this;
}
......@@ -67,7 +67,7 @@ public class TablePageQueryImpl implements TablePageQuery {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.DESCENDING;
this.sortOrder = SortOrder.DESC;
this.sortColumn = column;
return this;
}
......
......@@ -14,9 +14,7 @@ package org.activiti.engine.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.Page;
......@@ -29,25 +27,17 @@ import org.activiti.engine.impl.persistence.identity.GroupEntity;
/**
* @author Joram Barrez
* @author Tom Baeyens
*/
public class TaskQueryImpl extends AbstractQuery<Task> implements TaskQuery {
protected String name;
protected String assignee;
protected String candidateUser;
protected String candidateGroup;
protected String processInstanceId;
protected String executionId;
protected String sortColumn;
protected SortOrder sortOrder;
public TaskQueryImpl() {
}
......@@ -92,64 +82,34 @@ public class TaskQueryImpl extends AbstractQuery<Task> implements TaskQuery {
}
public TaskQueryImpl orderAsc(String column) {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.ASCENDING;
this.sortColumn = column;
super.orderAscToBeOverridden(column);
return this;
}
public TaskQueryImpl orderDesc(String column) {
if (sortColumn != null) {
throw new ActivitiException("Invalid usage: cannot use both orderAsc and orderDesc in same query");
}
this.sortOrder = SortOrder.DESCENDING;
this.sortColumn = column;
super.orderDescToBeOverridden(column);
return this;
}
public List<Task> executeList(CommandContext commandContext, Page page) {
return commandContext
.getTaskSession()
.dynamicFindTasks(createParamMap(), page);
.findTasksByQueryCriteria(this, page);
}
public long executeCount(CommandContext commandContext) {
return commandContext
.getTaskSession()
.dynamicFindTaskCount(createParamMap());
.findTaskCountByQueryCriteria(this);
}
protected Map<String, Object> createParamMap() {
Map<String, Object> params = new HashMap<String, Object>();
if (name != null) {
params.put("name", name);
}
if (assignee != null) {
params.put("assignee", assignee);
public List<String> getCandidateGroups() {
if (candidateGroup!=null) {
return Collections.singletonList(candidateGroup);
} else if (candidateUser != null) {
return getGroupsForCandidateUser(candidateUser);
}
if (candidateUser != null) {
params.put("candidateUser", candidateUser);
if (candidateGroup == null) {
params.put("candidateGroups", getGroupsForCandidateUser(candidateUser));
}
}
if (candidateGroup != null) {
params.put("candidateGroups", Collections.singletonList(candidateGroup));
}
if (processInstanceId != null) {
params.put("processInstanceId", processInstanceId);
}
if (sortColumn != null) {
params.put("sortColumn", sortColumn);
if (sortOrder.equals(SortOrder.ASCENDING)) {
params.put("sortOrder", "asc");
} else {
params.put("sortOrder", "desc");
}
}
return params;
return null;
}
protected List<String> getGroupsForCandidateUser(String candidateUser) {
......@@ -164,4 +124,43 @@ public class TaskQueryImpl extends AbstractQuery<Task> implements TaskQuery {
return groupIds;
}
public String getName() {
return name;
}
public String getAssignee() {
return assignee;
}
public String getCandidateUser() {
return candidateUser;
}
public String getCandidateGroup() {
return candidateGroup;
}
public String getProcessInstanceId() {
return processInstanceId;
}
public String getExecutionId() {
return executionId;
}
public String getSortColumn() {
return sortColumn;
}
public SortOrder getSortOrder() {
return sortOrder;
}
}
......@@ -44,7 +44,7 @@ public class CallActivityBehaviour extends AbstractBpmnActivity {
processInstance.start();
}
public void event(ActivityExecution execution, String signalEvent, Object signalData) throws Exception {
public void signal(ActivityExecution execution, String signalEvent, Object signalData) throws Exception {
leave(execution);
}
}
......@@ -16,6 +16,9 @@ package org.activiti.engine.impl.cfg;
import java.util.List;
import org.activiti.engine.DeploymentBuilder;
import org.activiti.engine.Page;
import org.activiti.engine.ProcessDefinition;
import org.activiti.engine.impl.ProcessDefinitionQueryImpl;
import org.activiti.engine.impl.persistence.repository.DeploymentEntity;
import org.activiti.engine.impl.persistence.repository.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.repository.ResourceEntity;
......@@ -35,31 +38,28 @@ public interface RepositorySession {
/** deletes the deployment and cascades deletion to the contained resources
* and process definitions */
void deleteDeployment(String deploymentId, boolean cascade);
// TODO replace with query api
List<DeploymentEntity> findDeployments();
DeploymentEntity findDeploymentById(String deploymentId);
// TODO replace with query api
// document that these process definitions might not be deployed
List<ProcessDefinitionEntity> findProcessDefinitionsByDeploymentId(String deploymentId);
// TODO replace with query api
/** used when {@link DeploymentBuilder#enableDuplicateFiltering()} is called
* while building a deployment. */
DeploymentEntity findLatestDeploymentByName(String deploymentName);
List<ProcessDefinitionEntity> findProcessDefinitions();
// TODO replace with query api
ResourceEntity findResourceByDeploymentIdAndResourceName(String deploymentId, String resourceName);
// TODO replace with query api
List<ResourceEntity> findResourcesByDeploymentId(String deploymentId);
// document that these process definitions might not be deployed
List<ProcessDefinitionEntity> findProcessDefinitionsByDeploymentId(String deploymentId);
long findProcessDefinitionCountByQueryCriteria(ProcessDefinitionQueryImpl processDefinitionQueryImpl);
List<ProcessDefinition> findProcessDefinitionsByQueryCriteria(ProcessDefinitionQueryImpl processDefinitionQueryImpl, Page page);
List<ProcessDefinitionEntity> findProcessDefinitions();
List<String> findDeploymentResourceNames(String deploymentId);
// TODO document that these process definitions are not deployed and what that means
ProcessDefinitionEntity findProcessDefinitionById(String processDefinitionId);
......@@ -68,4 +68,14 @@ public interface RepositorySession {
// TODO document that these process definitions are deployed
ProcessDefinitionEntity findDeployedProcessDefinitionById(String processDefinitionId);
// TODO replace with query api
ResourceEntity findResourceByDeploymentIdAndResourceName(String deploymentId, String resourceName);
// TODO replace with query api
List<ResourceEntity> findResourcesByDeploymentId(String deploymentId);
List<String> findDeploymentResourceNames(String deploymentId);
}
......@@ -14,10 +14,10 @@
package org.activiti.engine.impl.cfg;
import java.util.List;
import java.util.Map;
import org.activiti.engine.Page;
import org.activiti.engine.Task;
import org.activiti.engine.impl.TaskQueryImpl;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.engine.impl.persistence.task.TaskInvolvementEntity;
......@@ -35,8 +35,8 @@ public interface TaskSession {
List<Task> findTasksByAssignee(String assignee);
List<Task> findCandidateTasks(String userId, List<String> groupIds);
List<Task> dynamicFindTasks(Map<String, Object> params, Page page);
long dynamicFindTaskCount(Map<String, Object> params);
List<Task> findTasksByQueryCriteria(TaskQueryImpl taskQuery, Page page);
long findTaskCountByQueryCriteria(TaskQueryImpl taskQuery);
/* TaskInvolvementEntity */
void deleteTaskInvolvement(TaskInvolvementEntity taskInvolvement);
......
......@@ -12,6 +12,7 @@
*/
package org.activiti.engine.impl.cmd;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ActivitiException;
......@@ -39,8 +40,14 @@ public class GetVariablesCmd implements Command<Map<String, Object>> {
if (execution==null) {
throw new ActivitiException("execution "+executionId+" doesn't exist");
}
// this copy is made to avoid lazy initialization outside a command context
Map<String, Object> variables = new HashMap<String, Object>();
for (String variableName: execution.getVariables().keySet()) {
variables.put(variableName, execution.getVariable(variableName));
}
return execution.getVariables();
return variables;
}
}
......@@ -28,7 +28,7 @@ public class SaveGroupCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
if (group.getId()==null) {
if (group.getRevision()==0) {
commandContext
.getIdentitySession()
.insertGroup(group);
......
......@@ -29,7 +29,7 @@ public class SaveUserCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
if (user.getId()==null) {
if (user.getRevision()==0) {
commandContext
.getIdentitySession()
.insertUser(user);
......
......@@ -58,7 +58,7 @@ public class DbIdentitySession implements IdentitySession, Session {
}
public void deleteUser(String userId) {
dbSqlSession.delete("deleteMembershipsForUser", userId);
dbSqlSession.delete("deleteMembershipsByUserId", userId);
dbSqlSession.delete("deleteUser", userId);
}
......@@ -67,12 +67,12 @@ public class DbIdentitySession implements IdentitySession, Session {
}
public GroupEntity findGroupById(String groupId) {
return (GroupEntity) dbSqlSession.selectOne("selectGroup", groupId);
return (GroupEntity) dbSqlSession.selectOne("selectGroupById", groupId);
}
@SuppressWarnings("unchecked")
public List<GroupEntity> findGroupsByUser(String userId) {
return dbSqlSession.selectList("selectGroupsByUser", userId);
return dbSqlSession.selectList("selectGroupsByUserId", userId);
}
@SuppressWarnings("unchecked")
......@@ -80,7 +80,7 @@ public class DbIdentitySession implements IdentitySession, Session {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("userId", userId);
parameters.put("groupType", groupType);
return dbSqlSession.selectList("selectGroupsByUserAndType", parameters);
return dbSqlSession.selectList("selectGroupsByUserIdAndGroupType", parameters);
}
@SuppressWarnings("unchecked")
......@@ -89,7 +89,7 @@ public class DbIdentitySession implements IdentitySession, Session {
}
public void deleteGroup(String groupId) {
dbSqlSession.delete("deleteMembershipsForGroup", groupId);
dbSqlSession.delete("deleteMembershipsByGroupId", groupId);
dbSqlSession.delete("deleteGroup", groupId);
}
......
......@@ -93,7 +93,7 @@ public class DbManagementSession implements ManagementSession, Session {
params.put("tableName", tableName);
if (sortColumn != null) {
params.put("sortColumn", sortColumn);
if (sortOrder.equals(SortOrder.ASCENDING)) {
if (sortOrder.equals(SortOrder.ASC)) {
params.put("sortOrder", "asc");
} else {
params.put("sortOrder", "desc");
......
......@@ -17,6 +17,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.Page;
import org.activiti.engine.ProcessDefinition;
import org.activiti.engine.ProcessInstance;
import org.activiti.engine.impl.ProcessDefinitionQueryImpl;
......@@ -185,4 +186,19 @@ public class DbRepositorySession implements Session, RepositorySession {
public void flush() {
}
@SuppressWarnings("unchecked")
public List<ProcessDefinition> findProcessDefinitionsByQueryCriteria(ProcessDefinitionQueryImpl processDefinitionQuery, Page page) {
final String query = "selectProcessDefinitionsByQueryCriteria";
if (page == null) {
return dbSqlSession.selectList(query, processDefinitionQuery);
} else {
return dbSqlSession.selectList(query, processDefinitionQuery, page.getOffset(), page.getMaxResults());
}
}
public long findProcessDefinitionCountByQueryCriteria(ProcessDefinitionQueryImpl processDefinitionQuery) {
return (Long) dbSqlSession.selectOne("selectProcessDefinitionCountByQueryCriteria", processDefinitionQuery);
}
}
......@@ -58,19 +58,19 @@ public class DbSqlSession implements Session {
// insert ///////////////////////////////////////////////////////////////////
public void insert(PersistentObject persistentObject) {
long nextDbid = dbSqlSessionFactory.getIdGenerator().getNextId();
String id = Long.toString(nextDbid);
persistentObject.setId(id);
if (persistentObject.getId()==null) {
long nextDbid = dbSqlSessionFactory.getIdGenerator().getNextId();
String id = Long.toString(nextDbid);
persistentObject.setId(id);
}
insertedObjects.add(persistentObject);
deletedObjects.remove(persistentObject);
cachePut(persistentObject);
cachePut(persistentObject, false);
}
// delete ///////////////////////////////////////////////////////////////////
public void delete(PersistentObject persistentObject) {
deletedObjects.add(new DeleteById(persistentObject.getClass(), persistentObject.getId()));
insertedObjects.remove(persistentObject);
}
public void delete(Class<?> clazz, String id) {
......@@ -173,13 +173,13 @@ public class DbSqlSession implements Session {
return filteredObjects;
}
protected CachedObject cachePut(PersistentObject persistentObject) {
protected CachedObject cachePut(PersistentObject persistentObject, boolean storeState) {
Map<String, CachedObject> classCache = cachedObjects.get(persistentObject.getClass());
if (classCache==null) {
classCache = new HashMap<String, CachedObject>();
cachedObjects.put(persistentObject.getClass(), classCache);
}
CachedObject cachedObject = new CachedObject(persistentObject);
CachedObject cachedObject = new CachedObject(persistentObject, storeState);
classCache.put(persistentObject.getId(), cachedObject);
return cachedObject;
}
......@@ -194,18 +194,28 @@ public class DbSqlSession implements Session {
cachedObject = classCache.get(persistentObject.getId());
}
if (cachedObject==null) {
cachedObject = cachePut(persistentObject);
cachedObject = cachePut(persistentObject, true);
}
return cachedObject.getPersistentObject();
}
protected void cacheRemove(Class<?> persistentObjectClass, String persistentObjectId) {
Map<String, CachedObject> classCache = cachedObjects.get(persistentObjectClass);
if (classCache==null) {
return;
}
classCache.remove(persistentObjectId);
}
public static class CachedObject {
protected PersistentObject persistentObject;
protected Object persistentObjectState;
public CachedObject(PersistentObject persistentObject) {
public CachedObject(PersistentObject persistentObject, boolean storeState) {
this.persistentObject = persistentObject;
this.persistentObjectState = persistentObject.getPersistentState();
if (storeState) {
this.persistentObjectState = persistentObject.getPersistentState();
}
}
public PersistentObject getPersistentObject() {
......@@ -226,6 +236,7 @@ public class DbSqlSession implements Session {
// flush ////////////////////////////////////////////////////////////////////
public void flush() {
removeUnnecessaryOperations();
flushDeserializedObjects();
List<PersistentObject> updatedObjects = getUpdatedObjects();
......@@ -248,6 +259,39 @@ public class DbSqlSession implements Session {
flushDeletes();
}
protected void removeUnnecessaryOperations() {
List<DeleteOperation> deletedObjectsCopy = new ArrayList<DeleteOperation>(deletedObjects);
// for all deleted objects
for (DeleteOperation deleteOperation: deletedObjectsCopy) {
if (deleteOperation instanceof DeleteById) {
DeleteById deleteById = (DeleteById) deleteOperation;
PersistentObject insertedObject = findInsertedObject(deleteById.persistenceObjectClass, deleteById.persistentObjectId);
// if the deleted object is inserted,
if (insertedObject!=null) {
// remove the insert and the delete
insertedObjects.remove(insertedObject);
deletedObjects.remove(deleteOperation);
}
// in any case, remove the deleted object from the cache
cacheRemove(deleteById.persistenceObjectClass, deleteById.persistentObjectId);
}
}
for (PersistentObject insertedObject: insertedObjects) {
cacheRemove(insertedObject.getClass(), insertedObject.getId());
}
}
protected PersistentObject findInsertedObject(Class< ? > persistenceObjectClass, String persistentObjectId) {
for (PersistentObject insertedObject: insertedObjects) {
if ( insertedObject.getClass().equals(persistenceObjectClass)
&& insertedObject.getId().equals(persistentObjectId)
) {
return insertedObject;
}
}
return null;
}
protected void flushDeserializedObjects() {
for (DeserializedObject deserializedObject: deserializedObjects) {
deserializedObject.flush();
......
......@@ -62,7 +62,7 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
protected static final Map<String, Map<String, String>> databaseSpecificStatements = new HashMap<String, Map<String,String>>();
static {
addDatabaseSpecificStatement("mysql", "selectTaskByDynamicCriteria", "selectTaskByDynamicCriteria_mysql");
addDatabaseSpecificStatement("mysql", "selectTaskByQueryCriteria", "selectTaskByQueryCriteria_mysql");
addDatabaseSpecificStatement("mysql", "selectNextJobsToExecute", "selectNextJobsToExecute_mysql");
}
......
......@@ -19,6 +19,7 @@ import java.util.Map;
import org.activiti.engine.Page;
import org.activiti.engine.Task;
import org.activiti.engine.impl.TaskQueryImpl;
import org.activiti.engine.impl.cfg.TaskSession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
......@@ -60,17 +61,17 @@ public class DbTaskSession implements TaskSession, Session {
}
@SuppressWarnings("unchecked")
public List<Task> dynamicFindTasks(Map<String, Object> params, Page page) {
final String query = "selectTaskByDynamicCriteria";
public List<Task> findTasksByQueryCriteria(TaskQueryImpl taskQuery, Page page) {
final String query = "selectTaskByQueryCriteria";
if (page == null) {
return dbSqlSession.selectList(query, params);
return dbSqlSession.selectList(query, taskQuery);
} else {
return dbSqlSession.selectList(query, params, page.getOffset(), page.getMaxResults());
return dbSqlSession.selectList(query, taskQuery, page.getOffset(), page.getMaxResults());
}
}
public long dynamicFindTaskCount(Map<String, Object> params) {
return (Long) dbSqlSession.selectOne("selectTaskCountByDynamicCriteria", params);
public long findTaskCountByQueryCriteria(TaskQueryImpl taskQuery) {
return (Long) dbSqlSession.selectOne("selectTaskCountByQueryCriteria", taskQuery);
}
public void insertTaskInvolvement(TaskInvolvementEntity taskInvolvement) {
......
......@@ -28,17 +28,15 @@ public class GroupEntity implements Group, Serializable, PersistentObject {
private static final long serialVersionUID = 1L;
protected String id;
protected int revision;
protected String name;
protected String type;
protected boolean isNew = false;
public GroupEntity() {
}
public GroupEntity(String id) {
this.id = id;
this.isNew = true;
}
public void update(GroupEntity group) {
......@@ -52,6 +50,10 @@ public class GroupEntity implements Group, Serializable, PersistentObject {
persistentState.put("type", type);
return persistentState;
}
public int getRevisionNext() {
return revision+1;
}
public String getId() {
return id;
......@@ -71,7 +73,10 @@ public class GroupEntity implements Group, Serializable, PersistentObject {
public void setType(String type) {
this.type = type;
}
public boolean isNew() {
return isNew;
}
public int getRevision() {
return revision;
}
public void setRevision(int revision) {
this.revision = revision;
}
}
......@@ -29,6 +29,7 @@ public class UserEntity implements User, Serializable, PersistentObject {
private static final long serialVersionUID = 1L;
protected String id;
protected int revision;
protected String firstName;
protected String lastName;
protected String email;
......@@ -58,6 +59,10 @@ public class UserEntity implements User, Serializable, PersistentObject {
persistentState.put("password", password);
return persistentState;
}
public int getRevisionNext() {
return revision+1;
}
public String getId() {
return id;
......@@ -89,4 +94,10 @@ public class UserEntity implements User, Serializable, PersistentObject {
public void setPassword(String password) {
this.password = password;
}
public int getRevision() {
return revision;
}
public void setRevision(int revision) {
this.revision = revision;
}
}
......@@ -106,6 +106,8 @@ public class ExecutionEntity extends ExecutionImpl implements PersistentObject,
// reset the process instance in order to have the db-generated process instance id available
setProcessInstance(this);
this.variables = VariableMap.createNewInitialized(id, processInstanceId);
}
@Override
......
......@@ -20,8 +20,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.engine.impl.cfg.RuntimeSession;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.db.DbSqlSession;
import org.activiti.engine.impl.variable.Type;
import org.activiti.engine.impl.variable.VariableTypes;
......@@ -34,25 +35,33 @@ public class VariableMap implements Map<String, Object> , Serializable {
private static final long serialVersionUID = 1L;
protected Map<String, VariableInstanceEntity> variableInstances = null;
protected String executionId;
protected String processInstanceId;
protected Map<String, VariableInstanceEntity> variableInstances = null;
public VariableMap(String executionId, String processInstanceId) {
this.executionId = executionId;
this.processInstanceId = processInstanceId;
}
/** returns an initialized empty variable map */
public static VariableMap createNewInitialized(String executionId, String processInstanceId) {
VariableMap variableMap = new VariableMap(executionId, processInstanceId);
variableMap.variableInstances = new HashMap<String, VariableInstanceEntity>();
return variableMap;
}
protected void ensureInitialized() {
variableInstances = new HashMap<String, VariableInstanceEntity>();
List<VariableInstanceEntity> variableInstancesList = CommandContext
.getCurrentSession(RuntimeSession.class)
.findVariableInstancesByExecutionId(executionId);
for (VariableInstanceEntity variableInstance: variableInstancesList) {
variableInstances.put(variableInstance.getName(), variableInstance);
if (variableInstances==null) {
variableInstances = new HashMap<String, VariableInstanceEntity>();
CommandContext commandContext = CommandContext.getCurrent();
if (commandContext == null) {
throw new ActivitiException("lazy loading outside command context");
}
List<VariableInstanceEntity> variableInstancesList = commandContext.getRuntimeSession().findVariableInstancesByExecutionId(executionId);
for (VariableInstanceEntity variableInstance : variableInstancesList) {
variableInstances.put(variableInstance.getName(), variableInstance);
}
}
}
......@@ -103,6 +112,7 @@ public class VariableMap implements Map<String, Object> , Serializable {
}
variableInstance.setValue(value);
variableInstances.put(key, variableInstance);
return null;
}
......@@ -111,10 +121,15 @@ public class VariableMap implements Map<String, Object> , Serializable {
VariableInstanceEntity variableInstance = variableInstances.remove(key);
if (variableInstance != null) {
// delete variable
CommandContext
DbSqlSession dbSqlSession = CommandContext
.getCurrent()
.getDbSqlSession()
.delete(VariableInstanceEntity.class, variableInstance.getId());
.getDbSqlSession();
dbSqlSession.delete(VariableInstanceEntity.class, variableInstance.getId());
if (variableInstance.getByteArrayValueId()!=null) {
dbSqlSession.delete(ByteArrayEntity.class, variableInstance.getByteArrayValueId());
}
}
return null;
}
......
......@@ -40,7 +40,6 @@ import org.activiti.engine.TaskService;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.engine.impl.bpmn.deployer.BpmnDeployer;
import org.activiti.engine.impl.jobexecutor.JobExecutor;
import org.activiti.engine.impl.persistence.db.DbSqlSessionFactory;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.pvm.impl.util.ClassNameUtil;
import org.activiti.pvm.impl.util.LogUtil.ThreadLogMode;
......@@ -226,7 +225,7 @@ public class ProcessEngineTestCase extends PvmTestCase {
protected void annotationDeploymentAfter() {
for (String deploymentId: deploymentsToDeleteAfterTestMethod) {
log.fine("annotation @Deployment deletes deployment for "+ClassNameUtil.getClassNameWithoutPackage(this)+"."+getName());
repositoryService.deleteDeployment(deploymentId);
repositoryService.deleteDeploymentCascade(deploymentId);
}
}
......
......@@ -9,7 +9,6 @@
<mappers>
<mapper resource="org/activiti/db/ibatis/engine.mapping.xml" />
<mapper resource="org/activiti/db/ibatis/repository.mapping.xml" />
<mapper resource="org/activiti/db/ibatis/processdefinition.mapping.xml" />
<mapper resource="org/activiti/db/ibatis/runtime.mapping.xml" />
<mapper resource="org/activiti/db/ibatis/history.mapping.xml" />
<mapper resource="org/activiti/db/ibatis/job.mapping.xml" />
......
......@@ -7,9 +7,10 @@
<!-- USER INSERT -->
<insert id="insertUser" parameterType="org.activiti.engine.impl.persistence.identity.UserEntity">
insert into ACT_ID_USER (ID_, FIRST_, LAST_, EMAIL_, PWD_)
insert into ACT_ID_USER (ID_, REV_, FIRST_, LAST_, EMAIL_, PWD_)
values (
#{id ,jdbcType=VARCHAR},
1,
#{firstName ,jdbcType=VARCHAR},
#{lastName ,jdbcType=VARCHAR},
#{email ,jdbcType=VARCHAR},
......@@ -21,11 +22,13 @@
<update id="updateUser" parameterType="org.activiti.engine.impl.persistence.identity.UserEntity">
update ACT_ID_USER set
REV_ = #{revisionNext ,jdbcType=INTEGER},
FIRST_ = #{firstName ,jdbcType=VARCHAR},
LAST_ = #{lastName ,jdbcType=VARCHAR},
EMAIL_ = #{email ,jdbcType=VARCHAR},
PWD_ = #{password ,jdbcType=VARCHAR}
where ID_ = #{id}
and REV_ = #{revision}
</update>
<!-- USER DELETE -->
......@@ -46,7 +49,7 @@
<!-- USER SELECT -->
<select id="selectUser" parameterType="string" resultMap="userResultMap">
<select id="selectUserById" parameterType="string" resultMap="userResultMap">
select * from ACT_ID_USER where ID_ = #{id}
</select>
......@@ -54,7 +57,7 @@
select * from ACT_ID_USER
</select>
<select id="selectUsersByGroup" parameterType="string" resultMap="userResultMap">
<select id="selectUsersByGroupId" parameterType="string" resultMap="userResultMap">
select user.*
from ACT_ID_USER user, ACT_ID_MEMBERSHIP membership
where user.ID_ = membership.USER_ID_
......@@ -65,9 +68,10 @@
<!-- GROUP INSERT -->
<insert id="insertGroup" parameterType="org.activiti.engine.impl.persistence.identity.GroupEntity">
insert into ACT_ID_GROUP (ID_, NAME_, TYPE_)
insert into ACT_ID_GROUP (ID_, REV_, NAME_, TYPE_)
values (
#{id ,jdbcType=VARCHAR},
1,
#{name ,jdbcType=VARCHAR},
#{type ,jdbcType=VARCHAR}
)
......@@ -77,9 +81,11 @@
<update id="updateGroup" parameterType="org.activiti.engine.impl.persistence.identity.GroupEntity">
update ACT_ID_GROUP set
REV_ = #{revisionNext ,jdbcType=INTEGER},
NAME_ = #{name ,jdbcType=VARCHAR},
TYPE_ = #{type ,jdbcType=VARCHAR}
where ID_ = #{id}
REV_ = #{revision}
</update>
<!-- GROUP DELETE -->
......@@ -98,7 +104,7 @@
<!-- GROUP SELECT -->
<select id="selectGroup" parameterType="string" resultMap="groupResultMap">
<select id="selectGroupById" parameterType="string" resultMap="groupResultMap">
select * from ACT_ID_GROUP where ID_ = #{id}
</select>
......@@ -106,14 +112,14 @@
select * from ACT_ID_GROUP
</select>
<select id="selectGroupsByUser" parameterType="string" resultMap="groupResultMap">
<select id="selectGroupsByUserId" parameterType="string" resultMap="groupResultMap">
select g.*
from ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership
where g.ID_ = membership.GROUP_ID_
and membership.USER_ID_ = #{userId}
</select>
<select id="selectGroupsByUserAndType" parameterType="map" resultMap="groupResultMap">
<select id="selectGroupsByUserIdAndGroupType" parameterType="map" resultMap="groupResultMap">
select g.*
from ACT_ID_GROUP g, ACT_ID_MEMBERSHIP membership
where g.ID_ = membership.GROUP_ID_
......@@ -136,7 +142,7 @@
<!-- MEMBERSHIP DELETE -->
<delete id="deleteMembershipsForUser" parameterType="string">
<delete id="deleteMembershipsByUserId" parameterType="string">
delete from ACT_ID_MEMBERSHIP
where USER_ID_ = #{userId}
</delete>
......@@ -151,7 +157,7 @@
<!-- MEMBERSHIP SELECT -->
<delete id="deleteMembershipsForGroup" parameterType="string">
<delete id="deleteMembershipsByGroupId" parameterType="string">
delete from ACT_ID_MEMBERSHIP
where GROUP_ID_ = #{groupId}
</delete>
......
......@@ -118,15 +118,40 @@
<!-- PROCESSDEFINITION SELECT -->
<select id="selectProcessDefinitionById" parameterType="string" resultMap="processDefinitionResultMap">
select * from ACT_PROCESSDEFINITION where ID_ = #{processDefinitionId}
</select>
<select id="selectProcessDefinitionsByQueryCriteria" parameterType="map" resultMap="processDefinitionResultMap">
select distinct(PD.*)
<include refid="selectProcessDefinitionsByQueryCriteriaSql"/>
<if test="sortColumn != null">
order by PD.${sortColumn} ${sortOrder}
</if>
<if test="sortColumn == null">
order by PD.ID_
</if>
</select>
<select id="selectProcessDefinitionCountByQueryCriteria" parameterType="org.activiti.engine.impl.ProcessDefinitionQueryImpl" resultType="long">
select count(distinct PD.ID_)
<include refid="selectProcessDefinitionsByQueryCriteriaSql"/>
</select>
<sql id="selectProcessDefinitionsByQueryCriteriaSql">
from ACT_PROCESSDEFINITION PD
<where>
<if test="deploymentId != null">
PD.DEPLOYMENT_ID_ = #{deploymentId}
</if>
</where>
</sql>
<select id="selectProcessDefinitions" resultMap="processDefinitionResultMap">
select * from ACT_PROCESSDEFINITION
order by KEY_ ASC, VERSION_ DESC
</select>
<select id="selectProcessDefinitionById" parameterType="string" resultMap="processDefinitionResultMap">
select * from ACT_PROCESSDEFINITION where ID_ = #{processDefinitionId}
</select>
<select id="selectProcessDefinitionByDeployment" parameterType="string" resultMap="processDefinitionResultMap">
select * from ACT_PROCESSDEFINITION where DEPLOYMENT_ID_ = #{deploymentId}
</select>
......
......@@ -95,9 +95,9 @@
select * from ACT_TASK where ASSIGNEE_ = #{assignee}
</select>
<select id="selectTaskByDynamicCriteria" parameterType="map" resultMap="taskResultMap">
<select id="selectTaskByQueryCriteria" parameterType="map" resultMap="taskResultMap">
select distinct(T.*)
<include refid="selectTaskByDynamicCriteriaSql"/>
<include refid="selectTaskByQueryCriteriaSql"/>
<if test="sortColumn != null">
order by T.${sortColumn} ${sortOrder}
</if>
......@@ -106,12 +106,12 @@
</if>
</select>
<select id="selectTaskCountByDynamicCriteria" parameterType="map" resultType="long">
<select id="selectTaskCountByQueryCriteria" parameterType="map" resultType="long">
select count(distinct T.ID_)
<include refid="selectTaskByDynamicCriteriaSql"/>
<include refid="selectTaskByQueryCriteriaSql"/>
</select>
<sql id="selectTaskByDynamicCriteriaSql">
<sql id="selectTaskByQueryCriteriaSql">
from ACT_TASK T
<if test="candidateUser != null || candidateGroups != null">
inner join ACT_TASKINVOLVEMENT I on I.TASK_ID_ = T.ID_
......@@ -152,9 +152,9 @@
</where>
</sql>
<select id="selectTaskByDynamicCriteria_mysql" parameterType="map" resultMap="taskResultMap">
<select id="selectTaskByQueryCriteria_mysql" parameterType="map" resultMap="taskResultMap">
select distinct T.*
<include refid="selectTaskByDynamicCriteriaSql"/>
<include refid="selectTaskByQueryCriteriaSql"/>
<if test="sortColumn != null">
order by T.${sortColumn} ${sortOrder}
</if>
......
......@@ -236,6 +236,7 @@ public class ExecutionImpl implements
// if there is a parent
ensureParentInitialized();
if (parent!=null) {
ensureActivityInitialized();
activity = activity.getParentActivity();
while(activity!=null && !activity.isScope()) {
// TODO add destroy scope if activity is scope
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册