提交 d824d9ee 编写于 作者: T tombaeyens

ACT-60 split persistence session into multiple separately pluggable sessions

上级 161b7dbf
......@@ -21,8 +21,8 @@ import org.activiti.engine.DbSchemaStrategy;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineBuilder;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.impl.persistence.IbatisPersistenceSessionFactory;
import org.activiti.impl.persistence.PersistenceSessionFactory;
import org.activiti.impl.persistence.DbRuntimeSessionFactory;
import org.activiti.impl.persistence.RuntimeSessionFactory;
import org.activiti.test.LogInitializer;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
......@@ -61,12 +61,12 @@ public class ProcessEngineInitializationTest {
// then update the version to something that is different to the library
// version
PersistenceSessionFactory persistenceSessionFactory = processEngine.getPersistenceSessionFactory();
RuntimeSessionFactory runtimeSessionFactory = processEngine.getPersistenceSessionFactory();
// if(persistenceSessionFactory instanceof CachingPersistenceSessionFactory){
// persistenceSessionFactory = ((CachingPersistenceSessionFactory) persistenceSessionFactory).getTargetPersistenceSessionFactory();
// }
SqlSessionFactory sqlSessionFactory = ((IbatisPersistenceSessionFactory) persistenceSessionFactory).getSqlSessionFactory();
SqlSessionFactory sqlSessionFactory = ((DbRuntimeSessionFactory) runtimeSessionFactory).getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
boolean success = false;
try {
......
......@@ -25,7 +25,7 @@ import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.ProcessEngineConfiguration;
import org.activiti.engine.impl.jobexecutor.JobExecutor;
import org.activiti.engine.impl.persistence.db.DbSqlSessionFactory;
import org.activiti.impl.persistence.PersistenceSessionFactory;
import org.activiti.impl.persistence.RuntimeSessionFactory;
/**
* @author Tom Baeyens
......@@ -44,7 +44,7 @@ public class ProcessEngineImpl implements ProcessEngine {
protected ManagementService managementService;
protected DbSchemaStrategy dbSchemaStrategy;
protected JobExecutor jobExecutor;
protected PersistenceSessionFactory persistenceSessionFactory;
protected RuntimeSessionFactory runtimeSessionFactory;
public ProcessEngineImpl(ProcessEngineConfiguration processEngineConfiguration) {
this.processEngineConfiguration = processEngineConfiguration;
......@@ -124,8 +124,8 @@ public class ProcessEngineImpl implements ProcessEngine {
public DbSchemaStrategy getDbSchemaStrategy() {
return dbSchemaStrategy;
}
public PersistenceSessionFactory getPersistenceSessionFactory() {
return persistenceSessionFactory;
public RuntimeSessionFactory getPersistenceSessionFactory() {
return runtimeSessionFactory;
}
public ProcessEngineConfiguration getProcessEngineConfiguration() {
return processEngineConfiguration;
......
/* 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.
*/
package org.activiti.engine.impl.cfg;
import org.activiti.impl.history.HistoricActivityInstanceImpl;
import org.activiti.impl.history.HistoricProcessInstanceImpl;
/**
* @author Christian Stettler
* @author Tom Baeyens
*/
public interface HistorySession {
/* History */
void saveHistoricProcessInstance(HistoricProcessInstanceImpl historicProcessInstance);
HistoricProcessInstanceImpl findHistoricProcessInstance(String processInstanceId);
void deleteHistoricProcessInstance(String processInstanceId);
void saveHistoricActivityInstance(HistoricActivityInstanceImpl historicActivityInstance);
HistoricActivityInstanceImpl findHistoricActivityInstance(String activityId, String processInstanceId);
void deleteHistoricActivityInstance(String activityId, String processInstanceId);
}
......@@ -13,10 +13,34 @@
package org.activiti.engine.impl.cfg;
import java.util.List;
import org.activiti.engine.impl.persistence.identity.GroupImpl;
import org.activiti.engine.impl.persistence.identity.UserImpl;
/**
* @author Tom Baeyens
*/
public interface IdentitySession {
/* User */
void saveUser(UserImpl user);
UserImpl findUser(String userId);
List<UserImpl> findUsersByGroup(String groupId);
void deleteUser(String userId);
boolean isValidUser(String userId);
/* Group */
void saveGroup(GroupImpl group);
GroupImpl findGroup(String groupId);
List<GroupImpl> findGroupsByUser(String userId);
List<GroupImpl> findGroupsByUserAndType(String userId, String groupType);
void deleteGroup(String groupId);
/* Membership */
void createMembership(String userId, String groupId);
void deleteMembership(String userId, String groupId);
}
/* 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.
*/
package org.activiti.engine.impl.cfg;
import java.util.Map;
import org.activiti.engine.SortOrder;
import org.activiti.engine.TableMetaData;
import org.activiti.engine.TablePage;
import org.activiti.engine.impl.persistence.db.IdBlock;
/**
* @author Tom Baeyens
*/
public interface ManagementSession {
/* Management */
Map<String, Long> getTableCount();
TablePage getTablePage(String tableName, int offset, int maxResults, String sortColumn, SortOrder sortOrder);
TableMetaData getTableMetaData(String tableName);
IdBlock getNextDbidBlock();
}
......@@ -12,14 +12,13 @@
*/
package org.activiti.engine.impl.cfg;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.runtime.MessageImpl;
/**
* @author Tom Baeyens
*/
public interface MessageSession extends Session {
public interface MessageSession {
void send(MessageImpl message);
......
......@@ -52,6 +52,7 @@ import org.activiti.engine.impl.jobexecutor.JobHandlers;
import org.activiti.engine.impl.jobexecutor.TimerExecuteNestedActivityJobHandler;
import org.activiti.engine.impl.persistence.db.DbIdGenerator;
import org.activiti.engine.impl.persistence.db.DbRepositorySessionFactory;
import org.activiti.engine.impl.persistence.db.DbRuntimeSessionFactory;
import org.activiti.engine.impl.persistence.db.DbSqlSession;
import org.activiti.engine.impl.persistence.db.DbSqlSessionFactory;
import org.activiti.engine.impl.persistence.repository.Deployer;
......@@ -60,9 +61,8 @@ import org.activiti.engine.impl.variable.DefaultVariableTypes;
import org.activiti.engine.impl.variable.VariableTypes;
import org.activiti.impl.event.DefaultProcessEventBus;
import org.activiti.impl.history.HistoricDataServiceImpl;
import org.activiti.impl.persistence.IbatisPersistenceSessionFactory;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.PersistenceSessionFactory;
import org.activiti.impl.persistence.RuntimeSession;
import org.activiti.impl.persistence.RuntimeSessionFactory;
import org.activiti.impl.repository.DeployerManager;
import org.activiti.pvm.event.ProcessEventBus;
......@@ -142,7 +142,7 @@ public class ProcessEngineConfiguration {
messageSessionFactory = new JobExecutorMessageSessionFactory();
timerSessionFactory = new JobExecutorTimerSessionFactory();
persistenceSessionFactory = new IbatisPersistenceSessionFactory();
persistenceSessionFactory = new DbRuntimeSessionFactory();
repositorySessionFactory = new DbRepositorySessionFactory();
dbSqlSessionFactory = new DbSqlSessionFactory();
......@@ -191,7 +191,7 @@ public class ProcessEngineConfiguration {
sessionFactories.put(TimerSession.class, timerSessionFactory);
}
if (persistenceSessionFactory != null) {
sessionFactories.put(PersistenceSession.class, persistenceSessionFactory);
sessionFactories.put(RuntimeSession.class, persistenceSessionFactory);
}
if (repositorySessionFactory != null) {
sessionFactories.put(RepositorySession.class, repositorySessionFactory);
......@@ -257,8 +257,8 @@ public class ProcessEngineConfiguration {
return persistenceSessionFactory;
}
public void setPersistenceSessionFactory(PersistenceSessionFactory persistenceSessionFactory) {
this.persistenceSessionFactory = persistenceSessionFactory;
public void setPersistenceSessionFactory(RuntimeSessionFactory runtimeSessionFactory) {
this.persistenceSessionFactory = runtimeSessionFactory;
}
public String getProcessEngineName() {
......
......@@ -14,7 +14,6 @@
package org.activiti.engine.impl.cfg;
import java.util.List;
import java.util.Map;
import org.activiti.engine.DeploymentBuilder;
import org.activiti.engine.impl.persistence.db.IdBlock;
......@@ -70,6 +69,4 @@ public interface RepositorySession {
// TODO document that these process definitions are deployed
ProcessDefinitionEntity findDeployedProcessDefinitionById(String processDefinitionId);
IdBlock getNextDbidBlock();
}
......@@ -13,7 +13,6 @@
package org.activiti.engine.impl.cfg;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.runtime.ActivityInstanceEntity;
import org.activiti.engine.impl.persistence.runtime.ProcessInstanceEntity;
......@@ -21,11 +20,10 @@ import org.activiti.engine.impl.persistence.runtime.ProcessInstanceEntity;
/**
* @author Tom Baeyens
*/
public interface RuntimeSession extends Session {
public interface RuntimeSession {
void insert(ProcessInstanceEntity processInstance);
void delete(ProcessInstanceEntity processInstance);
void insertProcessInstance(ProcessInstanceEntity processInstance);
void deleteProcessInstance(ProcessInstanceEntity processInstance);
void insert(ActivityInstanceEntity activityInstance);
void delete(ActivityInstanceEntity activityInstance);
void insertActivityInstance(ActivityInstanceEntity activityInstance);
}
......@@ -10,41 +10,34 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl.persistence;
import java.util.ArrayList;
import java.util.HashMap;
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.persistence.task.TaskEntity;
import org.activiti.engine.impl.persistence.task.TaskInvolvement;
/**
* @author Tom Baeyens
*/
public class PersistentMap<T,U> extends HashMap<T, U> {
public interface TaskSession {
private static final long serialVersionUID = 1L;
/* Task */
TaskEntity findTask(String taskId);
List<TaskEntity> findTasksByExecution(String executionId);
List<Task> findTasksByAssignee(String assignee);
List<Task> findCandidateTasks(String userId, List<String> groupIds);
protected List<U> added = new ArrayList<U>();
protected List<U> removed = new ArrayList<U>();
public U put(T key, U value) {
added.add(value);
U removedValue = super.put(key, value);
if (removedValue!=null) {
removed.add(removedValue);
}
return removedValue;
}
public U remove(Object key) {
U removedValue = super.remove(key);
if (removedValue!=null) {
removed.add(removedValue);
}
return removedValue;
}
public void clear() {
throw new UnsupportedOperationException("this method is not available on "+getClass().getName());
}
List<Task> dynamicFindTasks(Map<String, Object> params, Page page);
long dynamicFindTaskCount(Map<String, Object> params);
/* TaskInvolvement */
List<TaskInvolvement> findTaskInvolvementsByTask(String taskId);
}
......@@ -23,7 +23,7 @@ import org.activiti.engine.impl.cfg.TransactionListener;
import org.activiti.engine.impl.cfg.TransactionState;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.db.DbSqlSession;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -76,7 +76,7 @@ public class IbatisTransactionContext implements TransactionContext {
}
}
private PersistenceSession getPersistenceSession() {
private RuntimeSession getPersistenceSession() {
return commandContext.getPersistenceSession();
}
......
......@@ -17,7 +17,7 @@ import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.engine.impl.persistence.task.TaskInvolvement;
import org.activiti.engine.impl.persistence.task.TaskInvolvementType;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -68,8 +68,8 @@ public class AddTaskInvolvementCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
TaskEntity task = persistenceSession.findTask(taskId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
TaskEntity task = runtimeSession.findTask(taskId);
if (task == null) {
throw new ActivitiException("Cannot find task with id " + taskId);
......
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.identity.UserImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -33,8 +33,8 @@ public class CheckPassword implements Command<Boolean> {
public Boolean execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
UserImpl user = persistenceSession.findUser(userId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
UserImpl user = runtimeSession.findUser(userId);
if ( (user!=null)
&& (password!=null)
&& (password.equals(user.getPassword()))
......
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -33,8 +33,8 @@ public class ClaimTaskCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
TaskEntity task = persistenceSession.findTask(taskId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
TaskEntity task = runtimeSession.findTask(taskId);
if (task == null) {
throw new ActivitiException("Cannot find task with id " + taskId);
......@@ -43,7 +43,7 @@ public class ClaimTaskCmd extends CmdVoid {
if (task.getAssignee() != null) {
throw new ActivitiException("Task " + taskId + " is already claimed by someone else");
} else {
if (persistenceSession.isValidUser(userId)) {
if (runtimeSession.isValidUser(userId)) {
task.setAssignee(userId);
} else {
throw new ActivitiException("Cannot claim task " + taskId + ": user "
......
......@@ -18,7 +18,7 @@ import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
import org.activiti.pvm.runtime.PvmActivityInstance;
......@@ -36,9 +36,9 @@ public class CompleteTaskCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
TaskEntity task = persistenceSession.findTask(taskId);
TaskEntity task = runtimeSession.findTask(taskId);
if (variables!=null) {
task.setExecutionVariables(variables);
}
......
......@@ -18,7 +18,7 @@ import org.activiti.engine.impl.cfg.RepositorySession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.repository.ProcessDefinitionEntity;
import org.activiti.impl.db.execution.DbExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Joram Barrez
......@@ -33,11 +33,11 @@ public class DeleteDeploymentCmd extends CmdVoid {
public void executeVoid(CommandContext commandContext) {
RepositorySession repositorySession = commandContext.getRepositorySession();
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
List<ProcessDefinitionEntity> processDefinitions = repositorySession.findProcessDefinitionsByDeploymentId(deploymentId);
for (ProcessDefinitionEntity processDefinition : processDefinitions) {
List<DbExecutionImpl> executions = persistenceSession.findProcessInstancesByProcessDefintionId(processDefinition.getId());
List<DbExecutionImpl> executions = runtimeSession.findProcessInstancesByProcessDefintionId(processDefinition.getId());
for (DbExecutionImpl execution : executions) {
execution.end();
}
......
......@@ -19,7 +19,7 @@ import java.util.List;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.runtime.JobImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -39,10 +39,10 @@ public class DeleteJobsCmd implements Command<Void> {
}
public Void execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
for (String jobId: jobIds) {
JobImpl job = persistenceSession.findJobById(jobId);
persistenceSession.delete(job);
JobImpl job = runtimeSession.findJobById(jobId);
runtimeSession.delete(job);
}
return null;
}
......
......@@ -13,7 +13,7 @@
package org.activiti.engine.impl.cmd;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class DeleteMembershipCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
persistenceSession.deleteMembership(userId, groupId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
runtimeSession.deleteMembership(userId, groupId);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class DeleteTaskCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
TaskEntity task = persistenceSession.findTask(taskId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
TaskEntity task = runtimeSession.findTask(taskId);
if (task!=null) {
task.delete();
} else {
......
......@@ -13,7 +13,7 @@
package org.activiti.engine.impl.cmd;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -28,8 +28,8 @@ public class DeleteUserCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
persistenceSession.deleteUser(userId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
runtimeSession.deleteUser(userId);
}
}
......@@ -20,7 +20,7 @@ import org.activiti.engine.TaskQuery;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.identity.GroupImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Joram Barrez
......@@ -35,15 +35,15 @@ public class FindCandidateTasksCmd implements Command<List<Task>> {
}
public List<Task> execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
List<String> groupIds = new ArrayList<String>();
List<GroupImpl> groups = persistenceSession.findGroupsByUser(userId);
List<GroupImpl> groups = runtimeSession.findGroupsByUser(userId);
for (GroupImpl group : groups) {
groupIds.add(group.getId());
}
return persistenceSession.findCandidateTasks(userId, groupIds);
return runtimeSession.findCandidateTasks(userId, groupIds);
}
}
......@@ -16,7 +16,7 @@ import java.util.List;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -32,9 +32,9 @@ public class FindChildExecutionsCmd implements Command<List>{
}
public List execute(CommandContext commandContext) {
PersistenceSession persistenceSession =
RuntimeSession runtimeSession =
commandContext.getPersistenceSession();
return persistenceSession.findChildExecutions(executionId);
return runtimeSession.findChildExecutions(executionId);
}
}
......@@ -17,7 +17,7 @@ import java.util.List;
import org.activiti.engine.impl.cfg.RepositorySession;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.Execution;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,9 +30,9 @@ public class FindExecutionCmd implements Command<Execution> {
}
public Execution execute(CommandContext commandContext) {
PersistenceSession persistenceSession =
RuntimeSession runtimeSession =
commandContext.getPersistenceSession();
return persistenceSession.findExecution(executionId);
return runtimeSession.findExecution(executionId);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.identity.Group;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,7 +30,7 @@ public class FindGroupCmd implements Command<Group> {
}
public Group execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findGroup(groupId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findGroup(groupId);
}
}
......@@ -16,7 +16,7 @@ import java.util.List;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -33,13 +33,13 @@ public class FindGroupsByUserCmd implements Command<List> {
}
public List execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
if (groupType==null) {
return persistenceSession
return runtimeSession
.findGroupsByUser(userId);
}
return persistenceSession
return runtimeSession
.findGroupsByUserAndType(userId, groupType);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.ProcessInstance;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class FindProcessInstanceCmd implements Command<ProcessInstance> {
}
public ProcessInstance execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findExecution(id);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findExecution(id);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.Task;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class FindSingleTaskCmd implements Command<Task> {
}
public Task execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findTask(taskId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findTask(taskId);
}
}
......@@ -18,7 +18,7 @@ import org.activiti.engine.Task;
import org.activiti.engine.TaskQuery;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -34,8 +34,8 @@ public class FindTaskByAssigneeCmd implements Command<List<Task>> {
}
public List<Task> execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findTasksByAssignee(assignee);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findTasksByAssignee(assignee);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,7 +30,7 @@ public class FindUserCmd implements Command<User> {
}
public User execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findUser(userId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findUser(userId);
}
}
......@@ -16,7 +16,7 @@ import java.util.List;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -31,7 +31,7 @@ public class FindUsersByGroupCmd implements Command<List> {
}
public List execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.findUsersByGroup(groupId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.findUsersByGroup(groupId);
}
}
......@@ -19,7 +19,7 @@ import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.repository.ResourceEntity;
import org.activiti.engine.impl.persistence.runtime.ByteArrayImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......
......@@ -25,7 +25,7 @@ import org.activiti.engine.impl.scripting.ScriptingEngines;
import org.activiti.impl.definition.FormReference;
import org.activiti.impl.definition.ProcessDefinitionImpl;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
import org.activiti.pvm.runtime.PvmActivityInstance;
......@@ -46,7 +46,7 @@ public class GetFormCmd implements Command<Object> {
}
public Object execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
RepositorySession repositorySession = commandContext.getRepositorySession();
ProcessDefinitionEntity processDefinition = null;
TaskEntity task = null;
......@@ -55,7 +55,7 @@ public class GetFormCmd implements Command<Object> {
if (taskId!=null) {
task = persistenceSession.findTask(taskId);
task = runtimeSession.findTask(taskId);
if (task == null) {
throw new ActivitiException("No task found for id = '" + taskId + "'");
}
......
......@@ -16,7 +16,7 @@ import org.activiti.engine.impl.cfg.RepositorySession;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.db.IdBlock;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......
......@@ -16,7 +16,7 @@ import java.util.Map;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -25,8 +25,8 @@ import org.activiti.impl.persistence.PersistenceSession;
public class GetTableCountCmd implements Command<Map<String,Long>> {
public Map<String,Long> execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.getTableCount();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.getTableCount();
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.TableMetaData;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class GetTableMetaDataCmd implements Command<TableMetaData> {
}
public TableMetaData execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
return persistenceSession.getTableMetaData(tableName);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
return runtimeSession.getTableMetaData(tableName);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.Task;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Joram Barrez
......@@ -29,8 +29,8 @@ public class SaveTaskCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
persistenceSession.insert((TaskEntity)task);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
runtimeSession.insert((TaskEntity)task);
}
}
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.identity.UserImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -30,8 +30,8 @@ public class SaveUserCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
persistenceSession.saveUser((UserImpl) user);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
runtimeSession.saveUser((UserImpl) user);
}
}
......@@ -17,7 +17,7 @@ import java.util.Map;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.db.execution.DbExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -34,9 +34,9 @@ public class SetExecutionVariablesCmd implements Command<Object> {
}
public Object execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext
RuntimeSession runtimeSession = commandContext
.getPersistenceSession();
DbExecutionImpl execution = persistenceSession
DbExecutionImpl execution = runtimeSession
.findExecution(executionId);
execution.setVariables(variables);
return null;
......
......@@ -15,7 +15,7 @@ package org.activiti.engine.impl.cmd;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -33,8 +33,8 @@ public class SetTaskPriorityCmd extends CmdVoid {
}
public void executeVoid(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
TaskEntity task = persistenceSession.findTask(taskId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
TaskEntity task = runtimeSession.findTask(taskId);
if (task == null) {
throw new ActivitiException("Cannot find task with id " + taskId);
......
......@@ -21,7 +21,7 @@ import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.impl.definition.ProcessDefinitionImpl;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......
......@@ -19,13 +19,16 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.cfg.HistorySession;
import org.activiti.engine.impl.cfg.IdentitySession;
import org.activiti.engine.impl.cfg.ManagementSession;
import org.activiti.engine.impl.cfg.MessageSession;
import org.activiti.engine.impl.cfg.ProcessEngineConfiguration;
import org.activiti.engine.impl.cfg.RepositorySession;
import org.activiti.engine.impl.cfg.TaskSession;
import org.activiti.engine.impl.cfg.TimerSession;
import org.activiti.engine.impl.cfg.TransactionContext;
import org.activiti.engine.impl.cfg.TransactionContextFactory;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Tom Baeyens
......@@ -173,8 +176,14 @@ public class CommandContext {
return (T) session;
}
public PersistenceSession getPersistenceSession() {
return getSession(PersistenceSession.class);
public RepositorySession getRepositorySession() {
return getSession(RepositorySession.class);
}
public RuntimeSession getPersistenceSession() {
return getSession(RuntimeSession.class);
}
public IdentitySession getIdentitySession() {
return getSession(IdentitySession.class);
}
public MessageSession getMessageSession() {
return getSession(MessageSession.class);
......@@ -182,8 +191,14 @@ public class CommandContext {
public TimerSession getTimerSession() {
return getSession(TimerSession.class);
}
public RepositorySession getRepositorySession() {
return getSession(RepositorySession.class);
public TaskSession getTaskSession() {
return getSession(TaskSession.class);
}
public HistorySession getHistorySession() {
return getSession(HistorySession.class);
}
public ManagementSession getManagementSession() {
return getSession(ManagementSession.class);
}
// getters and setters //////////////////////////////////////////////////////
......
......@@ -21,7 +21,7 @@ import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.runtime.JobImpl;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -36,7 +36,7 @@ public class AcquireJobsCmd implements Command<AcquiredJobs> {
}
public AcquiredJobs execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
String lockOwner = jobExecutor.getLockOwner();
int lockTimeInMillis = jobExecutor.getLockTimeInMillis();
......@@ -44,7 +44,7 @@ public class AcquireJobsCmd implements Command<AcquiredJobs> {
AcquiredJobs acquiredJobs = new AcquiredJobs();
List<JobImpl> jobs = persistenceSession.findNextJobsToExecute(maxJobsPerAcquisition);
List<JobImpl> jobs = runtimeSession.findNextJobsToExecute(maxJobsPerAcquisition);
for (JobImpl job: jobs) {
List<String> jobIds = new ArrayList<String>();
......
......@@ -17,7 +17,7 @@ import org.activiti.engine.impl.cfg.TransactionState;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.runtime.JobImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Tom Baeyens
......@@ -35,8 +35,8 @@ public class DecrementJobRetriesCmd implements Command<Object> {
}
public Object execute(CommandContext commandContext) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
JobImpl job = persistenceSession.findJobById(jobId);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
JobImpl job = runtimeSession.findJobById(jobId);
job.setRetries(job.getRetries() - 1);
job.setLockOwner(null);
job.setLockExpirationTime(null);
......
......@@ -16,7 +16,7 @@ import org.activiti.engine.impl.cfg.MessageSession;
import org.activiti.engine.impl.cfg.TransactionState;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.runtime.MessageImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -38,8 +38,8 @@ public class JobExecutorMessageSession implements MessageSession {
}
public void send(MessageImpl message) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
persistenceSession.insert(message);
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
runtimeSession.insert(message);
commandContext
.getTransactionContext()
......
......@@ -23,7 +23,7 @@ import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.runtime.TimerImpl;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -62,10 +62,10 @@ public class JobExecutorTimerSession implements TimerSession, Session {
}
public void cancelTimers(ExecutionImpl execution) {
PersistenceSession persistenceSession = commandContext.getPersistenceSession();
List<TimerImpl> timers = persistenceSession.findTimersByExecutionId(execution.getId());
RuntimeSession runtimeSession = commandContext.getPersistenceSession();
List<TimerImpl> timers = runtimeSession.findTimersByExecutionId(execution.getId());
for (TimerImpl timer: timers) {
persistenceSession.delete(timer);
runtimeSession.delete(timer);
}
}
......
/* 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.
*/
package org.activiti.engine.impl.persistence;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Tom Baeyens
*/
public class PersistentList<T> extends ArrayList<T> {
private static final long serialVersionUID = 1L;
protected List<T> added = new ArrayList<T>();
protected List<T> removed = new ArrayList<T>();
@Override
public void add(int index, T element) {
added.add(element);
super.add(index, element);
}
@Override
public boolean add(T element) {
added.add(element);
return super.add(element);
}
@Override
public boolean addAll(Collection< ? extends T> c) {
added.addAll(c);
return super.addAll(c);
}
@Override
public boolean addAll(int index, Collection< ? extends T> c) {
added.addAll(c);
return super.addAll(index, c);
}
@Override
public T remove(int index) {
removed.add(get(index));
return super.remove(index);
}
@Override
public boolean remove(Object o) {
boolean isRemoved = super.remove(o);
if (isRemoved) {
removed.add((T) o);
}
return isRemoved;
}
@Override
protected void removeRange(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("this method is not available on "+getClass().getName());
}
@Override
public void clear() {
throw new UnsupportedOperationException("this method is not available on "+getClass().getName());
}
@Override
public T set(int index, T element) {
throw new UnsupportedOperationException("this method is not available on "+getClass().getName());
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.impl.cfg.HistorySession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.impl.history.HistoricActivityInstanceImpl;
import org.activiti.impl.history.HistoricProcessInstanceImpl;
/**
* @author Christian Stettler
* @author Tom Baeyens
*/
public class DbHistorySession implements HistorySession, Session {
protected DbSqlSession dbSqlSession;
public DbHistorySession() {
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
}
public void saveHistoricProcessInstance(HistoricProcessInstanceImpl historicProcessInstance) {
if (historicProcessInstance.getId() == null) {
historicProcessInstance.setId(String.valueOf(idGenerator.getNextId()));
dbSqlSession.insert("insertHistoricProcessInstance", historicProcessInstance);
} else {
dbSqlSession.update("updateHistoricProcessInstance", historicProcessInstance);
}
}
public HistoricProcessInstanceImpl findHistoricProcessInstance(String processInstanceId) {
return (HistoricProcessInstanceImpl) dbSqlSession.selectOne("selectHistoricProcessInstance", processInstanceId);
}
public void deleteHistoricProcessInstance(String processInstanceId) {
dbSqlSession.delete("deleteHistoricProcessInstance", processInstanceId);
}
public void saveHistoricActivityInstance(HistoricActivityInstanceImpl historicActivityInstance) {
if (historicActivityInstance.getId() == null) {
historicActivityInstance.setId(String.valueOf(idGenerator.getNextId()));
dbSqlSession.insert("insertHistoricActivityInstance", historicActivityInstance);
} else {
dbSqlSession.update("updateHistoricActivityInstance", historicActivityInstance);
}
}
public HistoricActivityInstanceImpl findHistoricActivityInstance(String activityId, String processInstanceId) {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("activityId", activityId);
parameters.put("processInstanceId", processInstanceId);
return (HistoricActivityInstanceImpl) dbSqlSession.selectOne("selectHistoricActivityInstance", parameters);
}
public void deleteHistoricActivityInstance(String activityId, String processInstanceId) {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("activityId", activityId);
parameters.put("processInstanceId", processInstanceId);
dbSqlSession.delete("deleteHistoricActivityInstance", parameters);
}
public void close() {
}
public void flush() {
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
/**
* @author Tom Baeyens
*/
public class DbHistorySessionFactory implements SessionFactory {
public Session openSession() {
return new DbHistorySession();
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.impl.cfg.IdentitySession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.identity.GroupImpl;
import org.activiti.engine.impl.persistence.identity.UserImpl;
/**
* @author Tom Baeyens
*/
public class DbIdentitySession implements IdentitySession, Session {
protected DbSqlSession dbSqlSession;
public DbIdentitySession() {
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
}
public void saveUser(UserImpl user) {
if (user.isNew()) {
dbSqlSession.insert("insertUser", user);
} else {
dbSqlSession.update("updateUser", user);
}
}
public UserImpl findUser(String userId) {
return (UserImpl) dbSqlSession.selectOne("selectUser", userId);
}
public List<UserImpl> findUsersByGroup(String groupId) {
return dbSqlSession.selectList("selectUsersByGroup", groupId);
}
public List<UserImpl> findUsers() {
return dbSqlSession.selectList("selectUsers");
}
public boolean isValidUser(String userId) {
return findUser(userId) != null;
}
public void deleteUser(String userId) {
dbSqlSession.delete("deleteMembershipsForUser", userId);
dbSqlSession.delete("deleteUser", userId);
}
public void saveGroup(GroupImpl group) {
if (group.isNew()) {
dbSqlSession.insert("insertGroup", group);
} else {
dbSqlSession.update("updateGroup", group);
}
}
public GroupImpl findGroup(String groupId) {
return (GroupImpl) dbSqlSession.selectOne("selectGroup", groupId);
}
public List<GroupImpl> findGroupsByUser(String userId) {
return dbSqlSession.selectList("selectGroupsByUser", userId);
}
public List<GroupImpl> findGroupsByUserAndType(String userId, String groupType) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("userId", userId);
parameters.put("groupType", groupType);
return dbSqlSession.selectList("selectGroupsByUserAndType", parameters);
}
public List<GroupImpl> findGroups() {
return dbSqlSession.selectList("selectGroups");
}
public void deleteGroup(String groupId) {
dbSqlSession.delete("deleteMembershipsForGroup", groupId);
dbSqlSession.delete("deleteGroup", groupId);
}
public void createMembership(String userId, String groupId) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("userId", userId);
parameters.put("groupId", groupId);
dbSqlSession.insert("insertMembership", parameters);
}
public void deleteMembership(String userId, String groupId) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("userId", userId);
parameters.put("groupId", groupId);
dbSqlSession.delete("deleteMembership", parameters);
}
public void close() {
}
public void flush() {
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
/**
* @author Tom Baeyens
*/
public class DbIdentitySessionFactory implements SessionFactory {
public Session openSession() {
return new DbIdentitySession();
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
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.ActivitiOptimisticLockingException;
import org.activiti.engine.SortOrder;
import org.activiti.engine.TableMetaData;
import org.activiti.engine.TablePage;
import org.activiti.engine.impl.cfg.ManagementSession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.repository.PropertyEntity;
import org.apache.ibatis.session.RowBounds;
/**
* @author Tom Baeyens
*/
public class DbManagementSession implements ManagementSession, Session {
protected DbSqlSession dbSqlSession;
public DbManagementSession() {
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
}
public Map<String, Long> getTableCount() {
Map<String, Long> tableCount = new HashMap<String, Long>();
try {
for (String tableName: tableNames) {
tableCount.put(tableName, getTableCount(tableName));
}
} catch (Exception e) {
throw new ActivitiException("couldn't get table counts", e);
}
return tableCount;
}
protected long getTableCount(String tableName) {
log.fine("selecting table count for "+tableName);
Long count = (Long) dbSqlSession.selectOne("selectTableCount",
Collections.singletonMap("tableName", tableName));
return count;
}
@SuppressWarnings("unchecked")
public TablePage getTablePage(String tableName, int offset, int maxResults,
String sortColumn, SortOrder sortOrder) {
TablePage tablePage = new TablePage();
Map<String, String> params = new HashMap<String, String>();
params.put("tableName", tableName);
if (sortColumn != null) {
params.put("sortColumn", sortColumn);
if (sortOrder.equals(SortOrder.ASCENDING)) {
params.put("sortOrder", "asc");
} else {
params.put("sortOrder", "desc");
}
tablePage.setSort(sortColumn);
tablePage.setOrder(sortOrder);
}
List<Map<String, Object>> tableData = (List<Map<String, Object>>) dbSqlSession.selectList(
"selectTableData", params, new RowBounds(offset, maxResults)
);
tablePage.setTableName(tableName);
tablePage.setStart(offset);
tablePage.setTotal(getTableCount(tableName));
tablePage.setRows(tableData);
return tablePage;
}
public TableMetaData getTableMetaData(String tableName) {
TableMetaData result = new TableMetaData();
try {
result.setTableName(tableName);
DatabaseMetaData metaData = dbSqlSession.getConnection().getMetaData();
ResultSet resultSet = metaData.getColumns(null, null, tableName, null);
while(resultSet.next()) {
String name = resultSet.getString("COLUMN_NAME");
String type = resultSet.getString("TYPE_NAME");
result.addColumnMetaData(name, type);
}
} catch (SQLException e) {
throw new ActivitiException("Could not retrieve database metadata: " + e.getMessage());
}
return result;
}
public IdBlock getNextDbidBlock() {
String statement = dbdbSqlSession.dbdbSqlSessionFactory.map"selectProperty";
PropertyEntity property = (PropertyEntity) dbdbSqlSession.dbSqlSession.selectOne(statement, "next.dbid");
long oldValue = Long.parseLong(property.getValue());
long newValue = oldValue+dbRepositorySessionFactory.getIdBlockSize();
Map<String, Object> updateValues = new HashMap<String, Object>();
updateValues.put("name", property.getName());
updateValues.put("revision", property.getDbversion());
updateValues.put("newRevision", property.getDbversion()+1);
updateValues.put("value", Long.toString(newValue));
int rowsUpdated = dbdbSqlSession.dbSqlSession.update("updateProperty", updateValues);
if (rowsUpdated!=1) {
throw new ActivitiOptimisticLockingException("couldn't get next block of dbids");
}
return new IdBlock(oldValue, newValue-1);
}
public void close() {
}
public void flush() {
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
/**
* @author Tom Baeyens
*/
public class DbManagementSessionFactory implements SessionFactory {
public Session openSession() {
return new DbManagementSession();
}
}
......@@ -44,12 +44,6 @@ public class DbRepositorySession implements Session, RepositorySession {
.getSession(DbSqlSession.class);
}
public void close() {
}
public void flush() {
}
public void deployNew(DeploymentEntity deployment) {
dbSqlSession.insert(deployment);
for (ResourceEntity resource: deployment.getResources().values()) {
......@@ -167,20 +161,9 @@ public class DbRepositorySession implements Session, RepositorySession {
return processDefinition;
}
public IdBlock getNextDbidBlock() {
String statement = dbSqlSession.dbSqlSessionFactory.mapStatement("selectProperty");
PropertyEntity property = (PropertyEntity) dbSqlSession.sqlSession.selectOne(statement, "next.dbid");
long oldValue = Long.parseLong(property.getValue());
long newValue = oldValue+dbRepositorySessionFactory.getIdBlockSize();
Map<String, Object> updateValues = new HashMap<String, Object>();
updateValues.put("name", property.getName());
updateValues.put("revision", property.getDbversion());
updateValues.put("newRevision", property.getDbversion()+1);
updateValues.put("value", Long.toString(newValue));
int rowsUpdated = dbSqlSession.sqlSession.update("updateProperty", updateValues);
if (rowsUpdated!=1) {
throw new ActivitiOptimisticLockingException("couldn't get next block of dbids");
}
return new IdBlock(oldValue, newValue-1);
public void close() {
}
public void flush() {
}
}
......@@ -10,44 +10,198 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl.persistence.db;
import org.activiti.engine.impl.cfg.RuntimeSession;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.activiti.engine.Job;
import org.activiti.engine.Page;
import org.activiti.engine.ProcessInstance;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.runtime.ActivityInstanceEntity;
import org.activiti.engine.impl.persistence.runtime.ProcessInstanceEntity;
import org.activiti.engine.impl.persistence.runtime.ByteArrayImpl;
import org.activiti.engine.impl.persistence.runtime.JobImpl;
import org.activiti.engine.impl.persistence.runtime.TimerImpl;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.engine.impl.variable.DeserializedObject;
import org.activiti.engine.impl.variable.VariableInstance;
import org.activiti.impl.db.execution.DbExecutionImpl;
import org.activiti.impl.definition.ProcessDefinitionImpl;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.RuntimeSession;
import org.apache.ibatis.session.RowBounds;
/**
* @author Joram Barrez
* @author Tom Baeyens
*/
public class DbRuntimeSession implements Session, RuntimeSession {
private static Logger log = Logger.getLogger(DbRuntimeSession.class.getName());
protected DbSqlSession dbSqlSession;
TODO fix the transaction flush (uncommented to make sure I don't forget)
protected List<DeserializedObject> deserializedObjects = new ArrayList<DeserializedObject>();
public void addDeserializedObject(Object deserializedObject, byte[] serializedBytes, VariableInstance variableInstance) {
deserializedObjects.add(new DeserializedObject(deserializedObject, serializedBytes, variableInstance));
}
public DbRuntimeSession() {
dbSqlSession = CommandContext
.getCurrent()
.getSession(DbSqlSession.class);
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
}
public void close() {
// executions ///////////////////////////////////////////////////////////////
public DbExecutionImpl findExecution(String executionId) {
// TODO check if this execution was already loaded
DbExecutionImpl execution = (DbExecutionImpl)
dbSqlSession.selectOne("selectExecution", executionId);
if (execution!=null) {
execution = (DbExecutionImpl) loaded.add(execution);
}
return execution;
}
public void flush() {
@SuppressWarnings("unchecked")
public List<DbExecutionImpl> findProcessInstancesByProcessDefintionId(String processDefinitionId) {
List executions = dbSqlSession.selectList("selectRootExecutionsForProcessDefinition", processDefinitionId);
return loaded.add(executions);
}
@SuppressWarnings("unchecked")
public List<ExecutionImpl> findChildExecutions(String parentExecutionid) {
List executions = dbSqlSession.selectList("selectChildExecutions", parentExecutionid);
return loaded.add(executions);
}
public void deleteExecution(String executionId) {
ExecutionImpl execution = findExecution(executionId);
execution.end(); // TODO replace with real delete instead of end(), since this will create history traces
}
public DbExecutionImpl findSubProcessInstance(String superExecutionId) {
DbExecutionImpl subProcessInstance = (DbExecutionImpl) dbSqlSession.selectOne("selectSubProcessInstanceBySuperExecutionId", superExecutionId);
if (subProcessInstance != null) {
subProcessInstance = (DbExecutionImpl) loaded.add(subProcessInstance);
}
return subProcessInstance;
}
public long findProcessInstanceCountByDynamicCriteria(Map<String, Object> params) {
return (Long) dbSqlSession.selectOne("selectProcessInstanceCountByDynamicCriteria", params);
}
@SuppressWarnings("unchecked")
public List<ProcessInstance> findProcessInstancesByDynamicCriteria(Map<String, Object> params) {
return dbSqlSession.selectList("selectProcessInstanceByDynamicCriteria", params);
}
// variables ////////////////////////////////////////////////////////////////
public List<VariableInstance> findVariablesByExecutionId(String executionId) {
List variablesInstances = dbSqlSession.selectList("selectVariablesByExecutionId", executionId);
loaded.add(variablesInstances);
return variablesInstances;
}
public List<VariableInstance> findVariablesByTaskId(String taskId) {
List variableInstances = dbSqlSession.selectList("selectVariablesByTaskId", taskId);
loaded.add(variableInstances);
return variableInstances;
}
@SuppressWarnings("unchecked")
public byte[] getByteArrayBytes(String byteArrayId) {
Map<String, Object> temp = (Map) dbSqlSession.selectOne("selectBytesOfByteArray", byteArrayId);
return (byte[]) temp.get("BYTES_");
}
public ByteArrayImpl findByteArrayById(String byteArrayId) {
ByteArrayImpl byteArray = (ByteArrayImpl) dbSqlSession.selectOne("selectByteArrayById", byteArrayId);
loaded.add(byteArray);
return byteArray;
}
public ProcessDefinitionImpl findProcessDefinitionByDeploymentAndKey(String deploymentId, String processDefinitionKey) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("deploymentId", deploymentId);
parameters.put("processDefinitionKey", processDefinitionKey);
return (ProcessDefinitionImpl) dbSqlSession.selectOne("selectProcessDefinitionByDeploymentAndKey", parameters);
}
// job /////////////////////////////////////////////////////////////////////
public JobImpl findJobById(String jobId) {
JobImpl job = (JobImpl) dbSqlSession.selectOne("selectJob", jobId);
if (job!=null) {
loaded.add(job);
}
return job;
}
public void delete(ProcessInstanceEntity processInstance) {
public List<JobImpl> findJobs() {
return dbSqlSession.selectList("selectJobs");
}
public List<JobImpl> findNextJobsToExecute(int maxNrOfJobs) {
Date now = ClockUtil.getCurrentTime();
RowBounds rowBounds = new RowBounds(0, maxNrOfJobs);
List<JobImpl> jobs = dbSqlSession.selectList("selectNextJobsToExecute", now, rowBounds);
if (jobs!=null) {
loaded.add(jobs);
}
return jobs;
}
@SuppressWarnings("unchecked")
public List<JobImpl> findLockedJobs() {
return dbSqlSession.selectList("selectLockedJobs");
}
@SuppressWarnings("unchecked")
public List<TimerImpl> findUnlockedTimersByDuedate(Date duedate, int nrOfTimers) {
final String query = "selectUnlockedTimersByDuedate";
if (nrOfTimers > 0) {
RowBounds rowBounds = new RowBounds(0,nrOfTimers);
return dbSqlSession.selectList(statement(query), duedate, rowBounds);
} else {
return dbSqlSession.selectList(statement(query), duedate);
}
}
public void delete(ActivityInstanceEntity activityInstance) {
@SuppressWarnings("unchecked")
public List<TimerImpl> findTimersByExecutionId(String executionId) {
return dbSqlSession.selectList("selectTimersByExecutionId", executionId);
}
public void insert(ProcessInstanceEntity processInstance) {
@SuppressWarnings("unchecked")
public List<Job> dynamicFindJobs(Map<String, Object> params, Page page) {
final String query = "org.activiti.persistence.selectJobByDynamicCriteria";
if (page == null) {
return dbSqlSession.selectList(query, params);
} else {
return dbSqlSession.selectList(query, params, new RowBounds(page.getOffset(), page.getMaxResults()));
}
}
public void insert(ActivityInstanceEntity activityInstance) {
public long dynamicJobCount(Map<String, Object> params) {
return (Long) dbSqlSession.selectOne("org.activiti.persistence.selectJobCountByDynamicCriteria", params);
}
public void close() {
}
public void flush() {
}
}
......@@ -34,7 +34,6 @@ import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.engine.impl.persistence.PersistentObject;
import org.activiti.engine.impl.util.ClassNameUtil;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.impl.persistence.IbatisPersistenceSessionFactory;
import org.activiti.impl.persistence.LoadedObject;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
......@@ -66,7 +65,7 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
public void configurationCompleted(ProcessEngineConfiguration processEngineConfiguration) {
this.databaseName = processEngineConfiguration.getDatabaseName();
this.sqlSessionFactory = ((IbatisPersistenceSessionFactory)processEngineConfiguration.getPersistenceSessionFactory()).getSqlSessionFactory();
this.sqlSessionFactory = ((DbRuntimeSessionFactory)processEngineConfiguration.getPersistenceSessionFactory()).getSqlSessionFactory();
this.idGenerator = processEngineConfiguration.getIdGenerator();
this.statementMappings = databaseSpecificStatements.get(processEngineConfiguration.getDatabaseName());
}
......
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.Page;
import org.activiti.engine.Task;
import org.activiti.engine.impl.cfg.TaskSession;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.engine.impl.persistence.task.TaskInvolvement;
import org.apache.ibatis.session.RowBounds;
/**
* @author Tom Baeyens
*/
public class DbTaskSession implements TaskSession, Session {
protected DbSqlSession dbSqlSession;
public DbTaskSession() {
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
}
// tasks ////////////////////////////////////////////////////////////////////
public TaskEntity findTask(String id) {
TaskEntity task = (TaskEntity) dbSqlSession.selectOne("selectTask", id);
if (task!=null) {
task = (TaskEntity) loaded.add(task);
}
return task;
}
@SuppressWarnings("unchecked")
public List<TaskInvolvement> findTaskInvolvementsByTask(String taskId) {
List taskInvolvements = dbSqlSession.selectList("selectTaskInvolvementsByTask", taskId);
return loaded.add(taskInvolvements);
}
@SuppressWarnings("unchecked")
public List<TaskEntity> findTasksByExecution(String executionId) {
List tasks = dbSqlSession.selectList("selectTaskByExecution", executionId);
return loaded.add(tasks);
}
@SuppressWarnings("unchecked")
public List<Task> findCandidateTasks(String userId, List<String> groupIds) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("userId", userId);
params.put("groupIds", groupIds);
List tasks = (List) dbSqlSession.selectList("selectCandidateTasks", params);
return loaded.add(tasks);
}
@SuppressWarnings("unchecked")
public List<Task> findTasksByAssignee(String assignee) {
return dbSqlSession.selectList("selectTasksByAssignee", assignee);
}
@SuppressWarnings("unchecked")
public List<Task> dynamicFindTasks(Map<String, Object> params, Page page) {
final String query = "selectTaskByDynamicCriteria";
if (page == null) {
return dbSqlSession.selectList(query, params);
} else {
return dbSqlSession.selectList(query, params, new RowBounds(page.getOffset(), page.getMaxResults()));
}
}
public long dynamicFindTaskCount(Map<String, Object> params) {
return (Long) dbSqlSession.selectOne("selectTaskCountByDynamicCriteria", params);
}
public void close() {
}
public void flush() {
}
}
/* 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.
*/
package org.activiti.engine.impl.persistence.db;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.interceptor.SessionFactory;
/**
* @author Tom Baeyens
*/
public class DbTaskSessionFactory implements SessionFactory {
public Session openSession() {
return new DbTaskSession();
}
}
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.impl.persistence;
package org.activiti.engine.impl.persistence.db;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
......
......@@ -21,7 +21,7 @@ import org.activiti.engine.impl.persistence.PersistentObject;
import org.activiti.engine.impl.persistence.runtime.ByteArrayImpl;
import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.db.execution.DbExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Tom Baeyens
......@@ -79,11 +79,11 @@ public class VariableInstance implements Serializable, PersistentObject {
}
public void delete() {
PersistenceSession persistenceSession = CommandContext.getCurrent().getPersistenceSession();
persistenceSession.delete(this);
RuntimeSession runtimeSession = CommandContext.getCurrent().getPersistenceSession();
runtimeSession.delete(this);
if (byteArrayValueId != null) {
persistenceSession.delete(getByteArrayValue());
runtimeSession.delete(getByteArrayValue());
}
}
......
......@@ -26,7 +26,7 @@ import org.activiti.engine.impl.persistence.task.TaskEntity;
import org.activiti.impl.definition.ActivityImpl;
import org.activiti.impl.definition.ProcessDefinitionImpl;
import org.activiti.impl.execution.ExecutionImpl;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
* @author Tom Baeyens
......@@ -244,20 +244,20 @@ public class DbExecutionImpl extends ExecutionImpl implements PersistentObject {
ensureVariableMapInitialized();
PersistenceSession persistenceSession = CommandContext.getCurrent().getPersistenceSession();
RuntimeSession runtimeSession = CommandContext.getCurrent().getPersistenceSession();
Set<String> variableNames = new HashSet<String>(variableMap.getVariableNames());
for (String variableName : variableNames) {
variableMap.deleteVariable(variableName);
}
List<TaskEntity> tasks = persistenceSession.findTasksByExecution(id);
List<TaskEntity> tasks = runtimeSession.findTasksByExecution(id);
for (TaskEntity task : tasks) {
task.delete();
}
// then delete execution
persistenceSession.delete(this);
runtimeSession.delete(this);
}
// variables ////////////////////////////////////////////////////////////////
......
/* 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.
*/
package org.activiti.impl.persistence;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.DataSource;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiWrongDbException;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.impl.cfg.IdGenerator;
import org.activiti.engine.impl.cfg.ProcessEngineConfiguration;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationAware;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.repository.ProcessDefinitionEntity;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.variable.Type;
import org.activiti.engine.impl.variable.VariableTypes;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.apache.ibatis.type.JdbcType;
/**
* @author Tom Baeyens
*/
public class IbatisPersistenceSessionFactory implements PersistenceSessionFactory, ProcessEngineConfigurationAware {
private static Logger log = Logger.getLogger(IbatisPersistenceSessionFactory.class.getName());
protected static List<String> statements = new ArrayList<String>();
protected static Map<String, Map<String, String>> databaseSpecificStatements = null;
static {
// Default statement ids
statements.add("selectExecution");
statements.add("selectDbSchemaVersion");
statements.add("selectRootExecutionsForProcessDefinition");
statements.add("selectChildExecutions");
statements.add("selectProcessInstanceCountByDynamicCriteria");
statements.add("selectProcessInstanceByDynamicCriteria");
statements.add("selectVariablesByExecutionId");
statements.add("selectVariablesByTaskId");
statements.add("selectTask");
statements.add("selectTaskByExecution");
statements.add("selectDeployments");
statements.add("selectDeploymentsByName");
statements.add("selectDeployment");
statements.add("selectDeploymentByProcessDefinitionId");
statements.add("selectByteArraysForDeployment");
statements.add("selectResourceNamesForDeployment");
statements.add("selectDeploymentResource");
statements.add("selectBytesOfByteArray");
statements.add("selectByteArrayById");
statements.add("selectProcessDefinitionById");
statements.add("selectLatestProcessDefinitionByKey");
statements.add("selectProcessDefinitions");
statements.add("selectProcessDefinitionIdsByDeployment");
statements.add("selectProcessDefinitionByDeploymentAndKey");
statements.add("selectJob");
statements.add("selectJobs");
statements.add("selectNextJobsToExecute");
statements.add("selectUnlockedTimersByDuedate");
statements.add("selectLockedJobs");
statements.add("selectTimersByExecutionId");
statements.add("selectUser");
statements.add("selectUsersByGroup");
statements.add("selectUsers");
statements.add("selectGroup");
statements.add("selectGroupsByUser");
statements.add("selectGroupsByUserAndType");
statements.add("selectGroups");
statements.add("selectCandidateTasks");
statements.add("selectTasksByAssignee");
statements.add("selectTaskByDynamicCriteria");
statements.add("selectTaskCountByDynamicCriteria");
statements.add("selectTaskInvolvementsByTask");
statements.add("selectTableCount");
statements.add("selectTableData");
statements.add("selectProperty");
statements.add("selectHistoricProcessInstance");
statements.add("selectHistoricActivityInstance");
statements.add("insertExecution");
statements.add("insertJob");
statements.add("insertTask");
statements.add("insertTaskInvolvement");
statements.add("insertVariableInstance");
statements.add("insertByteArray");
statements.add("insertMessage");
statements.add("insertTimer");
statements.add("insertDeployment");
statements.add("insertByteArray");
statements.add("insertProcessDefinition");
statements.add("insertGroup");
statements.add("insertUser");
statements.add("insertMembership");
statements.add("insertHistoricProcessInstance");
statements.add("insertHistoricActivityInstance");
statements.add("updateUser");
statements.add("updateGroup");
statements.add("updateProperty");
statements.add("updateExecution");
statements.add("updateTask");
statements.add("updateTaskInvolvement");
statements.add("updateVariableInstance");
statements.add("updateByteArray");
statements.add("updateMessage");
statements.add("updateTimer");
statements.add("updateHistoricProcessInstance");
statements.add("updateHistoricActivityInstance");
statements.add("deleteMembership");
statements.add("deleteDeployment");
statements.add("deleteExecution");
statements.add("deleteTask");
statements.add("deleteTaskInvolvement");
statements.add("deleteVariableInstance");
statements.add("deleteByteArray");
statements.add("deleteJob");
statements.add("deleteProcessDefinitionsForDeployment");
statements.add("deleteByteArraysForDeployment");
statements.add("deleteMembershipsForGroup");
statements.add("deleteGroup");
statements.add("deleteMembershipsForUser");
statements.add("deleteUser");
statements.add("deleteHistoricProcessInstance");
statements.add("deleteHistoricActivityInstance");
// DB specific statement ids
// e.g. addDatabaseSpecificStatement("oracle", "selectExecution",
// "selectExecution_oracle");
addDatabaseSpecificStatement("mysql", "selectTaskByDynamicCriteria", "selectTaskByDynamicCriteria_mysql");
addDatabaseSpecificStatement("mysql", "selectNextJobsToExecute", "selectNextJobsToExecute_mysql");
}
protected static void addDatabaseSpecificStatement(String databaseName, String activitiStatement, String ibatisStatement) {
Map<String, String> specificStatements = null;
if (databaseSpecificStatements == null) {
databaseSpecificStatements = new HashMap<String, Map<String, String>>();
specificStatements = new HashMap<String, String>();
databaseSpecificStatements.put(databaseName, specificStatements);
} else {
specificStatements = databaseSpecificStatements.get(databaseName);
}
specificStatements.put(activitiStatement, ibatisStatement);
}
protected String databaseName;
protected SqlSessionFactory sqlSessionFactory;
protected IdGenerator idGenerator;
protected Map<String, String> databaseStatements;
protected VariableTypes variableTypes;
public void configurationCompleted(ProcessEngineConfiguration processEngineConfiguration) {
this.variableTypes = processEngineConfiguration.getVariableTypes();
this.idGenerator = processEngineConfiguration.getIdGenerator();
this.databaseName = processEngineConfiguration.getDatabaseName();
DataSource dataSource = processEngineConfiguration.getDataSource();
if (dataSource==null) {
String jdbcDriver = processEngineConfiguration.getJdbcDriver();
String jdbcUrl = processEngineConfiguration.getJdbcUrl();
String jdbcUsername = processEngineConfiguration.getJdbcUsername();
String jdbcPassword = processEngineConfiguration.getJdbcPassword();
if ( (jdbcDriver==null)
|| (jdbcUrl==null)
|| (jdbcUsername==null)
) {
throw new ActivitiException("DataSource or JDBC properties have to be specified in a process engine configuration");
}
dataSource = new PooledDataSource(
Thread.currentThread().getContextClassLoader(),
jdbcDriver,
jdbcUrl,
jdbcUsername,
jdbcPassword );
}
TransactionFactory transactionFactory = null;
if (processEngineConfiguration.isLocalTransactions()) {
transactionFactory = new JdbcTransactionFactory();
} else {
transactionFactory = new ManagedTransactionFactory();
}
sqlSessionFactory = createSessionFactory(dataSource, transactionFactory);
}
protected SqlSessionFactory createSessionFactory(DataSource dataSource, TransactionFactory transactionFactory) {
try {
initializeDatabaseStatements(databaseName);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("org/activiti/db/ibatis/activiti.ibatis.mem.conf.xml");
// update the jdbc parameters to the configured ones...
Environment environment = new Environment("default", transactionFactory, dataSource);
Reader reader = new InputStreamReader(inputStream);
XMLConfigBuilder parser = new XMLConfigBuilder(reader);
Configuration configuration = parser.getConfiguration();
configuration.setEnvironment(environment);
configuration.getTypeHandlerRegistry().register(Type.class, JdbcType.VARCHAR, new IbatisVariableTypeHandler(variableTypes));
configuration.setObjectFactory(new ActivitiObjectFactory(variableTypes));
configuration = parser.parse();
return new DefaultSqlSessionFactory(configuration);
} catch (Exception e) {
throw new ActivitiException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);
}
}
// database statements //////////////////////////////////////////////////////
protected void initializeDatabaseStatements(String databaseName) {
databaseStatements = new HashMap<String, String>();
for (String defaultStatement : statements) {
databaseStatements.put(defaultStatement, defaultStatement);
}
Map<String, String> specificStatements = databaseSpecificStatements.get(databaseName);
if (specificStatements != null) {
databaseStatements.putAll(specificStatements);
}
}
public String statement(String statement) {
return databaseStatements.get(statement);
}
public Session openSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return new IbatisPersistenceSession(sqlSession, idGenerator, databaseStatements);
}
// getters and setters //////////////////////////////////////////////////////
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public IdGenerator getIdGenerator() {
return idGenerator;
}
@SuppressWarnings("unchecked")
private static class ActivitiObjectFactory implements ObjectFactory {
private ObjectFactory delegate = new DefaultObjectFactory();
private final VariableTypes variableTypes;
public ActivitiObjectFactory(VariableTypes variableTypes) {
this.variableTypes = variableTypes;
}
public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
return delegate.create(type, constructorArgTypes, constructorArgs);
}
public Object create(Class type) {
if (type==ProcessDefinitionEntity.class) {
return new ProcessDefinitionEntity(variableTypes);
}
return delegate.create(type);
}
public void setProperties(Properties properties) {
delegate.setProperties(properties);
}
}
}
......@@ -44,17 +44,11 @@ import org.activiti.impl.history.HistoricProcessInstanceImpl;
* @author Tom Baeyens
* @author Joram Barrez
*/
public interface PersistenceSession extends Session {
public interface RuntimeSession extends Session {
void commit();
void rollback();
byte[] getByteArrayBytes(String byteArrayId);
ByteArrayImpl findByteArrayById(String byteArrayValueId);
void insert(PersistentObject persistentObject);
void delete(PersistentObject persistentObject);
/* Execution */
DbExecutionImpl findExecution(String executionId);
List<DbExecutionImpl> findProcessInstancesByProcessDefintionId(String processDefinitionId);
......@@ -70,18 +64,6 @@ public interface PersistenceSession extends Session {
List<VariableInstance> findVariablesByTaskId(String id);
void addDeserializedObject(Object deserializedObject, byte[] bytes, VariableInstance variableInstance);
/* Task */
TaskEntity findTask(String taskId);
List<TaskEntity> findTasksByExecution(String executionId);
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);
/* TaskInvolvement */
List<TaskInvolvement> findTaskInvolvementsByTask(String taskId);
/* Job */
JobImpl findJobById(String jobId);
List<JobImpl> findJobs();
......@@ -93,34 +75,4 @@ public interface PersistenceSession extends Session {
List<Job> dynamicFindJobs(Map<String, Object> params, Page page);
long dynamicJobCount(Map<String, Object> params);
/* User */
void saveUser(UserImpl user);
UserImpl findUser(String userId);
List<UserImpl> findUsersByGroup(String groupId);
void deleteUser(String userId);
boolean isValidUser(String userId);
/* Group */
void saveGroup(GroupImpl group);
GroupImpl findGroup(String groupId);
List<GroupImpl> findGroupsByUser(String userId);
List<GroupImpl> findGroupsByUserAndType(String userId, String groupType);
void deleteGroup(String groupId);
/* Membership */
void createMembership(String userId, String groupId);
void deleteMembership(String userId, String groupId);
/* Management */
Map<String, Long> getTableCount();
TablePage getTablePage(String tableName, int offset, int maxResults, String sortColumn, SortOrder sortOrder);
TableMetaData getTableMetaData(String tableName);
/* History */
void saveHistoricProcessInstance(HistoricProcessInstanceImpl historicProcessInstance);
HistoricProcessInstanceImpl findHistoricProcessInstance(String processInstanceId);
void deleteHistoricProcessInstance(String processInstanceId);
void saveHistoricActivityInstance(HistoricActivityInstanceImpl historicActivityInstance);
HistoricActivityInstanceImpl findHistoricActivityInstance(String activityId, String processInstanceId);
void deleteHistoricActivityInstance(String activityId, String processInstanceId);
}
}
......@@ -18,6 +18,6 @@ import org.activiti.engine.impl.interceptor.SessionFactory;
/**
* @author Tom Baeyens
*/
public interface PersistenceSessionFactory extends SessionFactory {
public interface RuntimeSessionFactory extends SessionFactory {
}
......@@ -17,7 +17,7 @@ import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.impl.persistence.repository.Deployer;
import org.activiti.impl.persistence.PersistenceSession;
import org.activiti.impl.persistence.RuntimeSession;
/**
......@@ -29,7 +29,7 @@ public class DeployerManager implements Serializable {
List<Deployer> deployers = new ArrayList<Deployer>();
public void deploy(DeploymentImpl deployment, PersistenceSession persistenceSession) {
public void deploy(DeploymentImpl deployment, RuntimeSession runtimeSession) {
for (Deployer deployer: deployers) {
//deployer.deploy(deployment, persistenceSession);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册