提交 74725f36 编写于 作者: T tombaeyens

ACT-60 worked out pvm execution model further to handle more bpmn activity types

上级 38b28460
...@@ -84,7 +84,7 @@ public class SpringTest { ...@@ -84,7 +84,7 @@ public class SpringTest {
List<Task> tasks = processEngine.getTaskService().findAssignedTasks("kermit"); List<Task> tasks = processEngine.getTaskService().findAssignedTasks("kermit");
assertEquals(before + 1, tasks.size()); assertEquals(before + 1, tasks.size());
processEngine.getRuntimeService().deleteProcessInstance(processInstance.getId()); processEngine.getRuntimeService().endProcessInstance(processInstance.getId());
} }
...@@ -95,7 +95,7 @@ public class SpringTest { ...@@ -95,7 +95,7 @@ public class SpringTest {
CollectionUtil.singletonMap("input", "Activiti BPM Engine")); CollectionUtil.singletonMap("input", "Activiti BPM Engine"));
ActivityInstance activityInstance = runtimeService.findActivityInstanceByProcessInstanceIdAndActivityId(pi.getId(), "waitState"); ActivityInstance activityInstance = runtimeService.findActivityInstanceByProcessInstanceIdAndActivityId(pi.getId(), "waitState");
assertEquals("ACTIVITI BPM ENGINE", runtimeService.getVariable(activityInstance.getId(), "input")); assertEquals("ACTIVITI BPM ENGINE", runtimeService.getVariable(activityInstance.getId(), "input"));
processEngine.getRuntimeService().deleteProcessInstance(activityInstance.getId()); processEngine.getRuntimeService().endProcessInstance(activityInstance.getId());
} }
@Test @Test
......
...@@ -36,7 +36,7 @@ public interface RuntimeService { ...@@ -36,7 +36,7 @@ public interface RuntimeService {
ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables); ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);
/** delete an existing runtime process instance */ /** delete an existing runtime process instance */
void deleteProcessInstance(String processInstanceId); void endProcessInstance(String processInstanceId, String nonCompletionReason);
/** gets the details of a process instance /** gets the details of a process instance
* @return the process instance or null if no process instance could be found with the given id. */ * @return the process instance or null if no process instance could be found with the given id. */
......
...@@ -19,7 +19,7 @@ import org.activiti.engine.ActivityInstance; ...@@ -19,7 +19,7 @@ import org.activiti.engine.ActivityInstance;
import org.activiti.engine.ProcessInstance; import org.activiti.engine.ProcessInstance;
import org.activiti.engine.ProcessInstanceQuery; import org.activiti.engine.ProcessInstanceQuery;
import org.activiti.engine.RuntimeService; import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.cmd.DeleteProcessInstanceCmd; import org.activiti.engine.impl.cmd.EndProcessInstanceCmd;
import org.activiti.engine.impl.cmd.FindActivitiyInstanceCmd; import org.activiti.engine.impl.cmd.FindActivitiyInstanceCmd;
import org.activiti.engine.impl.cmd.FindActivityInstanceInActivityCmd; import org.activiti.engine.impl.cmd.FindActivityInstanceInActivityCmd;
import org.activiti.engine.impl.cmd.FindProcessInstanceCmd; import org.activiti.engine.impl.cmd.FindProcessInstanceCmd;
...@@ -38,8 +38,8 @@ public class RuntimeServiceImpl extends ServiceImpl implements RuntimeService { ...@@ -38,8 +38,8 @@ public class RuntimeServiceImpl extends ServiceImpl implements RuntimeService {
return commandExecutor.execute(new FindActivitiyInstanceCmd(activityInstanceId)); return commandExecutor.execute(new FindActivitiyInstanceCmd(activityInstanceId));
} }
public void deleteProcessInstance(String processInstanceId) { public void endProcessInstance(String processInstanceId, String nonCompletionReason) {
commandExecutor.execute(new DeleteProcessInstanceCmd(processInstanceId)); commandExecutor.execute(new EndProcessInstanceCmd(processInstanceId, nonCompletionReason));
} }
public ProcessInstance startProcessInstanceByKey(String processDefinitionKey) { public ProcessInstance startProcessInstanceByKey(String processDefinitionKey) {
......
...@@ -98,7 +98,7 @@ public class BpmnActivityBehavior { ...@@ -98,7 +98,7 @@ public class BpmnActivityBehavior {
log.fine("No outgoing sequence flow found for " + activityContext.getActivity().getId() log.fine("No outgoing sequence flow found for " + activityContext.getActivity().getId()
+ ". Ending execution."); + ". Ending execution.");
} }
activityContext.end(); activityContext.endActivityInstance();
} }
} }
......
...@@ -22,7 +22,7 @@ public class NoneEndEventActivity extends AbstractBpmnActivity { ...@@ -22,7 +22,7 @@ public class NoneEndEventActivity extends AbstractBpmnActivity {
public void start(ActivityContext activityContext) throws Exception { public void start(ActivityContext activityContext) throws Exception {
activityContext.end(); activityContext.endActivityInstance();
// // TODO: needs cleanup! // // TODO: needs cleanup!
// ActivityImpl currentActivity = (ActivityImpl) activityContext.getActivity(); // ActivityImpl currentActivity = (ActivityImpl) activityContext.getActivity();
......
...@@ -34,7 +34,7 @@ import org.activiti.engine.impl.persistence.runtime.VariableInstanceEntity; ...@@ -34,7 +34,7 @@ import org.activiti.engine.impl.persistence.runtime.VariableInstanceEntity;
*/ */
public interface RuntimeSession { public interface RuntimeSession {
void deleteProcessInstance(String processInstanceId); void endProcessInstance(String processInstanceId, String nonCompletionReason);
ProcessInstanceEntity findProcessInstanceById(String processInstanceId); ProcessInstanceEntity findProcessInstanceById(String processInstanceId);
List<ProcessInstanceEntity> findProcessInstancesByProcessDefintionId(String processDefinitionId); List<ProcessInstanceEntity> findProcessInstancesByProcessDefintionId(String processDefinitionId);
ProcessInstanceEntity findSubProcessInstance(String superExecutionId); ProcessInstanceEntity findSubProcessInstance(String superExecutionId);
......
...@@ -12,32 +12,26 @@ ...@@ -12,32 +12,26 @@
*/ */
package org.activiti.engine.impl.cmd; package org.activiti.engine.impl.cmd;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.runtime.ProcessInstanceEntity;
/** /**
* @author Joram Barrez * @author Joram Barrez
*/ */
public class DeleteProcessInstanceCmd extends CmdVoid { public class EndProcessInstanceCmd extends CmdVoid {
protected String processInstanceId; protected String processInstanceId;
protected String nonCompletionReason;
public DeleteProcessInstanceCmd(String processInstanceId) {
this.processInstanceId = processInstanceId; public EndProcessInstanceCmd(String processInstanceId, String nonCompletionReason) {
this.processInstanceId = processInstanceId;
this.nonCompletionReason = nonCompletionReason;
} }
public void executeVoid(CommandContext commandContext) { public void executeVoid(CommandContext commandContext) {
ProcessInstanceEntity processInstance = commandContext commandContext
.getRuntimeSession() .getRuntimeSession()
.findProcessInstanceById(processInstanceId); .endProcessInstance(processInstanceId, nonCompletionReason);
if (processInstance==null) {
throw new ActivitiException("process instance "+processInstanceId+" does not exist");
}
processInstance.delete();
} }
} }
...@@ -96,7 +96,7 @@ public class DbRepositorySession implements Session, RepositorySession { ...@@ -96,7 +96,7 @@ public class DbRepositorySession implements Session, RepositorySession {
for (ProcessInstance processInstance: processInstances) { for (ProcessInstance processInstance: processInstances) {
commandContext commandContext
.getRuntimeSession() .getRuntimeSession()
.deleteProcessInstance(processInstance.getId()); .endProcessInstance(processInstance.getId());
} }
} }
} }
......
...@@ -43,8 +43,8 @@ public class DbRuntimeSession implements Session, RuntimeSession { ...@@ -43,8 +43,8 @@ public class DbRuntimeSession implements Session, RuntimeSession {
this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class); this.dbSqlSession = CommandContext.getCurrentSession(DbSqlSession.class);
} }
public void deleteProcessInstance(String processInstanceId) { public void endProcessInstance(String processInstanceId, String nonCompletionReason) {
findProcessInstanceById(processInstanceId).delete(); findProcessInstanceById(processInstanceId).end();
} }
public ProcessInstanceEntity findProcessInstanceById(String processInstanceId) { public ProcessInstanceEntity findProcessInstanceById(String processInstanceId) {
......
...@@ -70,19 +70,11 @@ public class ActivityInstanceEntity extends ActivityInstanceImpl implements Acti ...@@ -70,19 +70,11 @@ public class ActivityInstanceEntity extends ActivityInstanceImpl implements Acti
} }
@Override @Override
protected ActivityInstanceEntity createActivityInstance(ActivityImpl activity) { protected ActivityInstanceEntity newActivityInstance(ActivityImpl activity) {
ActivityInstanceEntity activityInstance = createAndInsert(activity, this); return createAndInsert(activity, this);
activityInstances.add(activityInstance);
return activityInstance;
}
@Override
public void removeActivityInstance(ActivityInstanceImpl activityInstance) {
super.removeActivityInstance(activityInstance);
((ActivityInstanceEntity)activityInstance).delete();
} }
public void delete() { public void destroy() {
CommandContext CommandContext
.getCurrent() .getCurrent()
.getRuntimeSession() .getRuntimeSession()
......
...@@ -70,12 +70,18 @@ public class ProcessInstanceEntity extends ProcessInstanceImpl implements Proces ...@@ -70,12 +70,18 @@ public class ProcessInstanceEntity extends ProcessInstanceImpl implements Proces
super.removeActivityInstance(activityInstance); super.removeActivityInstance(activityInstance);
((ActivityInstanceEntity)activityInstance).delete(); ((ActivityInstanceEntity)activityInstance).delete();
} }
/** normal end */
@Override @Override
public void remove() { public void end() {
end(null);
}
/** abnormal end of a process instance */
public void end(String nonCompletionReason) {
delete(); delete();
} }
public void delete() { public void delete() {
CommandContext CommandContext
.getCurrent() .getCurrent()
......
...@@ -13,39 +13,40 @@ ...@@ -13,39 +13,40 @@
package org.activiti.pvm.activity; package org.activiti.pvm.activity;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.activiti.pvm.event.EventContext; import org.activiti.pvm.event.EventContext;
import org.activiti.pvm.process.PvmActivity; import org.activiti.pvm.process.PvmActivity;
import org.activiti.pvm.process.PvmProcessDefinition;
import org.activiti.pvm.process.PvmTransition; import org.activiti.pvm.process.PvmTransition;
import org.activiti.pvm.runtime.PvmActivityInstance; import org.activiti.pvm.runtime.PvmProcessInstance;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public interface ActivityContext extends EventContext { public interface ActivityContext extends EventContext {
// runtime structure methods
DelegateActivityInstance getActivityInstance();
// execution operations
void take(PvmTransition transition); void take(PvmTransition transition);
void executeActivity(PvmActivity startActivity);
void endActivityInstance();
void endProcessInstance();
void keepAlive();
PvmProcessInstance createSubProcessInstance(PvmProcessDefinition processDefinition);
void end(); // user variables
List<PvmTransition> getOutgoingTransitions();
PvmTransition getOutgoingTransition(String signalName);
List<PvmTransition> getIncomingTransitions();
List<PvmActivity> getActivities();
void setVariable(String variableName, Object value); void setVariable(String variableName, Object value);
Object getVariable(String variableName); Object getVariable(String variableName);
Map<String, Object> getVariables(); Map<String, Object> getVariables();
PvmActivity getActivity(); // scoped activity variables
Object getSystemVariable(String variableName);
void setSystemVariable(String variableName, Object value);
PvmActivityInstance getActivityInstance(); // activity and whole process definition model
PvmActivity getActivity();
} }
/* 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.pvm.activity;
/**
* @author Tom Baeyens
*/
public interface CompositeActivityBehavior extends ActivityBehavior {
void activityInstanceEnded(ActivityContext activityContext) throws Exception;
}
/* 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.pvm.activity;
import java.io.Serializable;
import java.util.Set;
/**
* @author Tom Baeyens
*/
public interface DelegateActivityInstance extends Serializable {
Set<? extends DelegateActivityInstance> getActivityInstances();
}
/* 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.pvm.activity;
/**
* @author Tom Baeyens
*/
public interface SubProcessActivityBehavior extends ActivityBehavior {
void subProcessEnded(ActivityContext activityContext) throws Exception;
}
...@@ -30,6 +30,7 @@ import org.activiti.pvm.process.PvmTransition; ...@@ -30,6 +30,7 @@ import org.activiti.pvm.process.PvmTransition;
*/ */
public class ActivityImpl extends ScopeImpl implements PvmActivity { public class ActivityImpl extends ScopeImpl implements PvmActivity {
private static final long serialVersionUID = 1L;
protected List<TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>(); protected List<TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>();
protected Map<String, TransitionImpl> namedOutgoingTransitions = new HashMap<String, TransitionImpl>(); protected Map<String, TransitionImpl> namedOutgoingTransitions = new HashMap<String, TransitionImpl>();
protected List<TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>(); protected List<TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>();
......
...@@ -23,6 +23,8 @@ import org.activiti.pvm.process.PvmProcessDefinition; ...@@ -23,6 +23,8 @@ import org.activiti.pvm.process.PvmProcessDefinition;
*/ */
public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefinition { public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefinition {
private static final long serialVersionUID = 1L;
protected ActivityImpl initial; protected ActivityImpl initial;
public ProcessDefinitionImpl(String id) { public ProcessDefinitionImpl(String id) {
...@@ -34,6 +36,8 @@ public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefini ...@@ -34,6 +36,8 @@ public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefini
return new ProcessInstanceImpl(this); return new ProcessInstanceImpl(this);
} }
// getters and setters //////////////////////////////////////////////////////
public ActivityImpl getInitial() { public ActivityImpl getInitial() {
return initial; return initial;
} }
......
...@@ -20,6 +20,7 @@ import java.util.List; ...@@ -20,6 +20,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.activiti.pvm.event.EventListener; import org.activiti.pvm.event.EventListener;
import org.activiti.pvm.process.PvmProcessElement;
/** common properties for process definition, activity and transition /** common properties for process definition, activity and transition
...@@ -27,8 +28,10 @@ import org.activiti.pvm.event.EventListener; ...@@ -27,8 +28,10 @@ import org.activiti.pvm.event.EventListener;
* *
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public class ProcessElementImpl { public class ProcessElementImpl implements PvmProcessElement {
private static final long serialVersionUID = 1L;
protected String id; protected String id;
protected ProcessDefinitionImpl processDefinition; protected ProcessDefinitionImpl processDefinition;
protected Map<String, List<EventListener>> eventListeners; protected Map<String, List<EventListener>> eventListeners;
......
...@@ -19,20 +19,23 @@ import java.util.List; ...@@ -19,20 +19,23 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.activiti.pvm.PvmException; import org.activiti.pvm.PvmException;
import org.activiti.pvm.process.PvmScope;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public class ScopeImpl extends ProcessElementImpl { public abstract class ScopeImpl extends ProcessElementImpl implements PvmScope {
private static final long serialVersionUID = 1L;
protected List<ActivityImpl> activities = new ArrayList<ActivityImpl>(); protected List<ActivityImpl> activities = new ArrayList<ActivityImpl>();
protected Map<String, ActivityImpl> namedActivities = new HashMap<String, ActivityImpl>(); protected Map<String, ActivityImpl> namedActivities = new HashMap<String, ActivityImpl>();
public ScopeImpl(String id, ProcessDefinitionImpl processDefinition) { public ScopeImpl(String id, ProcessDefinitionImpl processDefinition) {
super(id, processDefinition); super(id, processDefinition);
} }
public ActivityImpl findActivity(String activityId) { public ActivityImpl findActivity(String activityId) {
ActivityImpl localActivity = namedActivities.get(activityId); ActivityImpl localActivity = namedActivities.get(activityId);
if (localActivity!=null) { if (localActivity!=null) {
......
...@@ -23,6 +23,8 @@ import org.activiti.pvm.process.PvmTransition; ...@@ -23,6 +23,8 @@ import org.activiti.pvm.process.PvmTransition;
*/ */
public class TransitionImpl extends ProcessElementImpl implements PvmTransition { public class TransitionImpl extends ProcessElementImpl implements PvmTransition {
private static final long serialVersionUID = 1L;
protected ActivityImpl source; protected ActivityImpl source;
protected ActivityImpl destination; protected ActivityImpl destination;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
package org.activiti.pvm.impl.runtime; package org.activiti.pvm.impl.runtime;
import org.activiti.pvm.activity.DelegateActivityInstance;
import org.activiti.pvm.impl.process.ActivityImpl; import org.activiti.pvm.impl.process.ActivityImpl;
import org.activiti.pvm.runtime.PvmActivityInstance; import org.activiti.pvm.runtime.PvmActivityInstance;
...@@ -20,8 +21,10 @@ import org.activiti.pvm.runtime.PvmActivityInstance; ...@@ -20,8 +21,10 @@ import org.activiti.pvm.runtime.PvmActivityInstance;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public class ActivityInstanceImpl extends ScopeInstanceImpl implements PvmActivityInstance { public class ActivityInstanceImpl extends ScopeInstanceImpl implements PvmActivityInstance, DelegateActivityInstance {
private static final long serialVersionUID = 1L;
protected ActivityImpl activity; protected ActivityImpl activity;
protected ExecutionContextImpl executionContext; protected ExecutionContextImpl executionContext;
protected boolean isActive; protected boolean isActive;
...@@ -35,6 +38,12 @@ public class ActivityInstanceImpl extends ScopeInstanceImpl implements PvmActivi ...@@ -35,6 +38,12 @@ public class ActivityInstanceImpl extends ScopeInstanceImpl implements PvmActivi
this.parent = parent; this.parent = parent;
} }
public void create() {
}
public void destroy() {
}
public void signal(String signalName, Object signalData) { public void signal(String signalName, Object signalData) {
ExecutionContextImpl.signal(this, signalName, signalData); ExecutionContextImpl.signal(this, signalName, signalData);
} }
......
...@@ -21,6 +21,7 @@ import java.util.logging.Logger; ...@@ -21,6 +21,7 @@ import java.util.logging.Logger;
import org.activiti.pvm.PvmException; import org.activiti.pvm.PvmException;
import org.activiti.pvm.activity.ActivityBehavior; import org.activiti.pvm.activity.ActivityBehavior;
import org.activiti.pvm.activity.ActivityContext; import org.activiti.pvm.activity.ActivityContext;
import org.activiti.pvm.activity.CompositeActivityBehavior;
import org.activiti.pvm.activity.SignallableActivityBehaviour; import org.activiti.pvm.activity.SignallableActivityBehaviour;
import org.activiti.pvm.event.Event; import org.activiti.pvm.event.Event;
import org.activiti.pvm.event.EventContext; import org.activiti.pvm.event.EventContext;
...@@ -29,7 +30,9 @@ import org.activiti.pvm.impl.process.ActivityImpl; ...@@ -29,7 +30,9 @@ import org.activiti.pvm.impl.process.ActivityImpl;
import org.activiti.pvm.impl.process.ProcessElementImpl; import org.activiti.pvm.impl.process.ProcessElementImpl;
import org.activiti.pvm.impl.process.TransitionImpl; import org.activiti.pvm.impl.process.TransitionImpl;
import org.activiti.pvm.process.PvmActivity; import org.activiti.pvm.process.PvmActivity;
import org.activiti.pvm.process.PvmProcessDefinition;
import org.activiti.pvm.process.PvmTransition; import org.activiti.pvm.process.PvmTransition;
import org.activiti.pvm.runtime.PvmProcessInstance;
/** /**
...@@ -49,6 +52,7 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -49,6 +52,7 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
private static final AtomicOperation ACTIVITY_END = new ActivityEnd(); private static final AtomicOperation ACTIVITY_END = new ActivityEnd();
private static final AtomicOperation PROCESS_END = new ProcessEnd(); private static final AtomicOperation PROCESS_END = new ProcessEnd();
protected ActivityImpl activity;
protected ProcessInstanceImpl processInstance; protected ProcessInstanceImpl processInstance;
protected ActivityInstanceImpl activityInstance; protected ActivityInstanceImpl activityInstance;
...@@ -62,6 +66,8 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -62,6 +66,8 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
protected String signalName; protected String signalName;
protected Object signalData; protected Object signalData;
protected String endReason;
protected TransitionImpl transition; protected TransitionImpl transition;
protected AtomicOperation nextAtomicOperation = null; protected AtomicOperation nextAtomicOperation = null;
...@@ -85,6 +91,12 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -85,6 +91,12 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
executionContext.perform(ACTIVITY_SIGNAL); executionContext.perform(ACTIVITY_SIGNAL);
} }
public static void endProcessInstance(ProcessInstanceImpl processInstance, String endReason) {
log.fine("ending "+processInstance+" because "+endReason);
ExecutionContextImpl executionContext = new ExecutionContextImpl();
executionContext.scopeInstance = processInstance;
}
public void take(PvmTransition transition) { public void take(PvmTransition transition) {
if (transition==null) { if (transition==null) {
throw new PvmException("transition is null"); throw new PvmException("transition is null");
...@@ -94,10 +106,15 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -94,10 +106,15 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
fireEvent(activityInstance.activity, Event.ACTIVITY_END, TRANSITION_ACTIVITY_END); fireEvent(activityInstance.activity, Event.ACTIVITY_END, TRANSITION_ACTIVITY_END);
} }
public void end() { public void endActivityInstance() {
log.fine("ending "+activityInstance); log.fine("ending "+activityInstance);
fireEvent(activityInstance.activity, Event.ACTIVITY_END, ACTIVITY_END); fireEvent(activityInstance.activity, Event.ACTIVITY_END, ACTIVITY_END);
} }
public void endProcessInstance() {
log.fine("ending "+processInstance);
fireEvent(processInstance.getProcessDefinition(), Event.PROCESS_END, PROCESS_END);
}
public void executeTimerNestedActivity(ActivityImpl borderEventActivity) { public void executeTimerNestedActivity(ActivityImpl borderEventActivity) {
throw new UnsupportedOperationException("please implement me"); throw new UnsupportedOperationException("please implement me");
...@@ -245,18 +262,33 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -245,18 +262,33 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
protected static class ActivityEnd implements AtomicOperation { protected static class ActivityEnd implements AtomicOperation {
public void perform(ExecutionContextImpl executionContext) { public void perform(ExecutionContextImpl executionContext) {
executionContext.activityInstance.setEnded(true); ActivityInstanceImpl activityInstance = executionContext.activityInstance;
ScopeInstanceImpl parent = executionContext.activityInstance.getParent(); activityInstance.setEnded(true);
parent.removeActivityInstance(executionContext.activityInstance); ScopeInstanceImpl parent = activityInstance.getParent();
activityInstance.destroy();
parent.removeActivityInstance(activityInstance);
executionContext.scopeInstance = parent; executionContext.scopeInstance = parent;
if (parent.getActivityInstances().isEmpty()) { if (parent instanceof ProcessInstanceImpl) {
if (parent instanceof ProcessInstanceImpl) { if (parent.getActivityInstances().isEmpty()) {
executionContext.activityInstance = null; executionContext.activityInstance = null;
executionContext.fireEvent(parent.getScope(), Event.PROCESS_END, PROCESS_END); executionContext.fireEvent(parent.getScope(), Event.PROCESS_END, PROCESS_END);
} else { }
executionContext.activityInstance = (ActivityInstanceImpl) parent; } else {
executionContext.end(); executionContext.activityInstance = (ActivityInstanceImpl) parent;
ActivityImpl activity = activityInstance.getActivity();
ActivityBehavior activityBehavior = activity.getActivityBehavior();
if (activityBehavior instanceof CompositeActivityBehavior) {
try {
((CompositeActivityBehavior)activityBehavior).activityInstanceEnded(executionContext);
} catch (RuntimeException e) {
log.log(Level.SEVERE, getDelegationExceptionMessage(activity, "activityInstanceEnded", e), e);
throw e;
} catch (Exception e) {
String delegationExceptionMessage = getDelegationExceptionMessage(activity, "activityInstanceEnded", e);
log.log(Level.SEVERE, delegationExceptionMessage, e);
throw new PvmException(delegationExceptionMessage, e);
}
} }
} }
} }
...@@ -265,12 +297,21 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -265,12 +297,21 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
protected static class ProcessEnd implements AtomicOperation { protected static class ProcessEnd implements AtomicOperation {
public void perform(ExecutionContextImpl executionContext) { public void perform(ExecutionContextImpl executionContext) {
ProcessInstanceImpl processInstance = (ProcessInstanceImpl) executionContext.scopeInstance; ProcessInstanceImpl processInstance = (ProcessInstanceImpl) executionContext.scopeInstance;
for (ActivityInstanceImpl activityInstance: processInstance.getActivityInstances()) {
destroyActivityInstance(activityInstance);
}
processInstance.setEnded(true); processInstance.setEnded(true);
processInstance.remove(); processInstance.destroy();
}
private void destroyActivityInstance(ActivityInstanceImpl activityInstance) {
for (ActivityInstanceImpl nestedActivityInstance: activityInstance.getActivityInstances()) {
destroyActivityInstance(nestedActivityInstance);
}
activityInstance.destroy();
} }
} }
// event context methods //////////////////////////////////////////////////// // user variables ///////////////////////////////////////////////////////////
public void setVariable(String variableName, Object value) { public void setVariable(String variableName, Object value) {
scopeInstance.setVariable(variableName, value); scopeInstance.setVariable(variableName, value);
...@@ -284,6 +325,16 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -284,6 +325,16 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
return scopeInstance.getVariables(); return scopeInstance.getVariables();
} }
// system variables /////////////////////////////////////////////////////////
public void setSystemVariable(String variableName, Object value) {
scopeInstance.setSystemVariable(activity, variableName, value);
}
public Object getSystemVariable(String variableName) {
return scopeInstance.getSystemVariable(activity, variableName);
}
// activity context methods ///////////////////////////////////////////////// // activity context methods /////////////////////////////////////////////////
public PvmActivity getActivity() { public PvmActivity getActivity() {
...@@ -320,4 +371,15 @@ public class ExecutionContextImpl implements EventContext, ActivityContext { ...@@ -320,4 +371,15 @@ public class ExecutionContextImpl implements EventContext, ActivityContext {
public List<PvmActivity> getActivities() { public List<PvmActivity> getActivities() {
return (List) activityInstance.getActivity().getActivities(); return (List) activityInstance.getActivity().getActivities();
} }
public PvmProcessInstance createSubProcessInstance(PvmProcessDefinition processDefinition) {
return null;
}
public void executeActivity(PvmActivity startActivity) {
}
public void keepAlive() {
}
} }
...@@ -25,6 +25,8 @@ import org.activiti.pvm.runtime.PvmProcessInstance; ...@@ -25,6 +25,8 @@ import org.activiti.pvm.runtime.PvmProcessInstance;
*/ */
public class ProcessInstanceImpl extends ScopeInstanceImpl implements PvmProcessInstance { public class ProcessInstanceImpl extends ScopeInstanceImpl implements PvmProcessInstance {
private static final long serialVersionUID = 1L;
protected ProcessInstanceImpl() { protected ProcessInstanceImpl() {
} }
...@@ -36,7 +38,7 @@ public class ProcessInstanceImpl extends ScopeInstanceImpl implements PvmProcess ...@@ -36,7 +38,7 @@ public class ProcessInstanceImpl extends ScopeInstanceImpl implements PvmProcess
ExecutionContextImpl.startProcessInstance(this); ExecutionContextImpl.startProcessInstance(this);
} }
public void remove() { public void destroy() {
} }
public List<String> findActivityIds() { public List<String> findActivityIds() {
......
...@@ -32,11 +32,14 @@ import org.activiti.pvm.runtime.PvmScopeInstance; ...@@ -32,11 +32,14 @@ import org.activiti.pvm.runtime.PvmScopeInstance;
*/ */
public class ScopeInstanceImpl implements PvmScopeInstance { public class ScopeInstanceImpl implements PvmScopeInstance {
private static final long serialVersionUID = 1L;
protected ProcessDefinitionImpl processDefinition; protected ProcessDefinitionImpl processDefinition;
protected ScopeImpl scope; protected ScopeImpl scope;
protected ScopeInstanceImpl parent; protected ScopeInstanceImpl parent;
protected Set<ActivityInstanceImpl> activityInstances = new HashSet<ActivityInstanceImpl>(); protected Set<ActivityInstanceImpl> activityInstances = new HashSet<ActivityInstanceImpl>();
protected Map<String, Object> variables; protected Map<String, Object> variables;
protected Map<String, Object> systemVariables;
protected boolean isEnded; protected boolean isEnded;
protected ScopeInstanceImpl() { protected ScopeInstanceImpl() {
...@@ -48,12 +51,17 @@ public class ScopeInstanceImpl implements PvmScopeInstance { ...@@ -48,12 +51,17 @@ public class ScopeInstanceImpl implements PvmScopeInstance {
} }
protected ActivityInstanceImpl createActivityInstance(ActivityImpl activity) { protected ActivityInstanceImpl createActivityInstance(ActivityImpl activity) {
ActivityInstanceImpl activityInstance = new ActivityInstanceImpl(activity, this); ActivityInstanceImpl activityInstance = newActivityInstance(activity);
activityInstances.add(activityInstance); activityInstances.add(activityInstance);
return activityInstance; return activityInstance;
} }
protected ActivityInstanceImpl newActivityInstance(ActivityImpl activity) {
return new ActivityInstanceImpl(activity, this);
}
public void removeActivityInstance(ActivityInstanceImpl activityInstance) { public void removeActivityInstance(ActivityInstanceImpl activityInstance) {
activityInstance.destroy();
activityInstances.remove(activityInstance); activityInstances.remove(activityInstance);
activityInstance.setParent(null); activityInstance.setParent(null);
} }
...@@ -91,7 +99,7 @@ public class ScopeInstanceImpl implements PvmScopeInstance { ...@@ -91,7 +99,7 @@ public class ScopeInstanceImpl implements PvmScopeInstance {
} }
// variables //////////////////////////////////////////////////////////////// // user variables ///////////////////////////////////////////////////////////
public boolean hasVariable(String variableName) { public boolean hasVariable(String variableName) {
if (getVariables().containsKey(variableName)) { if (getVariables().containsKey(variableName)) {
...@@ -157,6 +165,28 @@ public class ScopeInstanceImpl implements PvmScopeInstance { ...@@ -157,6 +165,28 @@ public class ScopeInstanceImpl implements PvmScopeInstance {
} }
} }
// system variables /////////////////////////////////////////////////////////
public void setSystemVariable(ActivityImpl activity, String variableName, Object value) {
if (systemVariables==null) {
systemVariables = new HashMap<String, Object>();
}
String systemVariableKey = getSystemVariableKey(activity, variableName);
systemVariables.put(systemVariableKey, value);
}
public Object getSystemVariable(ActivityImpl activity, String variableName) {
if (systemVariables==null) {
return null;
}
String systemVariableKey = getSystemVariableKey(activity, variableName);
return systemVariables.get(systemVariableKey);
}
protected String getSystemVariableKey(ActivityImpl activity, String variableName) {
return "["+activity.getId()+"|"+variableName+"]";
}
// end ////////////////////////////////////////////////////////////////////// // end //////////////////////////////////////////////////////////////////////
public void end() { public void end() {
......
...@@ -13,14 +13,17 @@ ...@@ -13,14 +13,17 @@
package org.activiti.pvm.process; package org.activiti.pvm.process;
import java.util.List;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public interface PvmActivity { public interface PvmActivity extends PvmScope {
PvmScope getParent();
public String getId(); List<? extends PvmTransition> getIncomingTransitions();
Object getProperty(String name);
List<? extends PvmTransition> getOutgoingTransitions();
} }
...@@ -19,10 +19,10 @@ import org.activiti.pvm.runtime.PvmProcessInstance; ...@@ -19,10 +19,10 @@ import org.activiti.pvm.runtime.PvmProcessInstance;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public interface PvmProcessDefinition { public interface PvmProcessDefinition extends PvmScope {
PvmProcessInstance createProcessInstance(); PvmProcessInstance createProcessInstance();
Object getProperty(String name); PvmActivity getInitial();
} }
/* 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.pvm.process;
import java.io.Serializable;
/**
* @author Tom Baeyens
*/
public interface PvmProcessElement extends Serializable {
String getId();
PvmProcessDefinition getProcessDefinition();
Object getProperty(String name);
}
/* 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.pvm.process;
import java.util.List;
/**
* @author Tom Baeyens
*/
public interface PvmScope extends PvmProcessElement {
List<? extends PvmActivity> getActivities();
PvmActivity findActivity(String activityId);
}
...@@ -14,12 +14,13 @@ ...@@ -14,12 +14,13 @@
package org.activiti.pvm.process; package org.activiti.pvm.process;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public interface PvmTransition { public interface PvmTransition extends PvmProcessElement {
PvmActivity getSource();
public String getId(); PvmActivity getDestination();
Object getProperty(String name);
} }
...@@ -13,13 +13,14 @@ ...@@ -13,13 +13,14 @@
package org.activiti.pvm.runtime; package org.activiti.pvm.runtime;
import java.io.Serializable;
import java.util.Map; import java.util.Map;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public interface PvmScopeInstance { public interface PvmScopeInstance extends Serializable {
boolean hasVariable(String variableName); boolean hasVariable(String variableName);
......
...@@ -20,6 +20,7 @@ import org.activiti.pvm.process.PvmProcessDefinition; ...@@ -20,6 +20,7 @@ import org.activiti.pvm.process.PvmProcessDefinition;
import org.activiti.pvm.runtime.PvmActivityInstance; import org.activiti.pvm.runtime.PvmActivityInstance;
import org.activiti.pvm.runtime.PvmProcessInstance; import org.activiti.pvm.runtime.PvmProcessInstance;
import org.activiti.test.pvm.activities.Automatic; import org.activiti.test.pvm.activities.Automatic;
import org.activiti.test.pvm.activities.End;
import org.activiti.test.pvm.activities.ParallelGateway; import org.activiti.test.pvm.activities.ParallelGateway;
import org.activiti.test.pvm.activities.WaitState; import org.activiti.test.pvm.activities.WaitState;
import org.junit.Test; import org.junit.Test;
...@@ -56,14 +57,14 @@ public class PvmConcurrencyTest extends PvmTestCase { ...@@ -56,14 +57,14 @@ public class PvmConcurrencyTest extends PvmTestCase {
.transition("end") .transition("end")
.endActivity() .endActivity()
.createActivity("end") .createActivity("end")
.behavior(new WaitState()) .behavior(new End())
.endActivity() .endActivity()
.buildProcessDefinition(); .buildProcessDefinition();
PvmProcessInstance processInstance = processDefinition.createProcessInstance(); PvmProcessInstance processInstance = processDefinition.createProcessInstance();
processInstance.start(); processInstance.start();
assertNotNull(processInstance.findActivityInstance("end")); assertTrue(processInstance.isEnded());
} }
@Test @Test
......
...@@ -24,7 +24,7 @@ import org.activiti.pvm.process.PvmTransition; ...@@ -24,7 +24,7 @@ import org.activiti.pvm.process.PvmTransition;
public class Automatic implements ActivityBehavior { public class Automatic implements ActivityBehavior {
public void start(ActivityContext activityExecutionContext) { public void start(ActivityContext activityExecutionContext) {
PvmTransition transition = activityExecutionContext.getOutgoingTransitions().get(0); PvmTransition transition = activityExecutionContext.getActivity().getOutgoingTransitions().get(0);
activityExecutionContext.take(transition); activityExecutionContext.take(transition);
} }
......
/* 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.test.pvm.activities;
import java.util.ArrayList;
import java.util.List;
import org.activiti.pvm.activity.ActivityContext;
import org.activiti.pvm.activity.CompositeActivityBehavior;
import org.activiti.pvm.activity.SignallableActivityBehaviour;
import org.activiti.pvm.process.PvmActivity;
import org.activiti.pvm.process.PvmTransition;
/**
* @author Tom Baeyens
*/
public class EmbeddedSubProcess implements CompositeActivityBehavior, SignallableActivityBehaviour {
public void start(ActivityContext activityContext) throws Exception {
List<PvmActivity> startActivities = new ArrayList<PvmActivity>();
for (PvmActivity activity: activityContext.getActivity().getActivities()) {
if (activity.getIncomingTransitions().isEmpty()) {
startActivities.add(activity);
}
}
for (PvmActivity startActivity: startActivities) {
activityContext.executeActivity(startActivity);
}
}
public void activityInstanceEnded(ActivityContext activityContext) throws Exception {
if (activityContext.getActivityInstance().getActivityInstances().isEmpty()) {
for (PvmTransition transition: activityContext.getActivity().getOutgoingTransitions()) {
activityContext.take(transition);
}
}
}
// used by timers
public void signal(ActivityContext activityContext, String signalName, Object signalData) throws Exception {
PvmActivity timerActivity = activityContext.getActivity().findActivity(signalName);
boolean isInterrupting = (Boolean) timerActivity.getProperty("isInterrupting");
if (!isInterrupting) {
activityContext.keepAlive();
}
for (PvmTransition transition: timerActivity.getOutgoingTransitions()) {
activityContext.take(transition);
}
}
}
...@@ -23,7 +23,7 @@ import org.activiti.pvm.activity.ActivityContext; ...@@ -23,7 +23,7 @@ import org.activiti.pvm.activity.ActivityContext;
public class End implements ActivityBehavior { public class End implements ActivityBehavior {
public void start(ActivityContext activityContext) throws Exception { public void start(ActivityContext activityContext) throws Exception {
activityContext.end(); activityContext.endActivityInstance();
} }
} }
...@@ -12,39 +12,37 @@ ...@@ -12,39 +12,37 @@
*/ */
package org.activiti.test.pvm.activities; package org.activiti.test.pvm.activities;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.activiti.pvm.activity.ActivityBehavior; import org.activiti.pvm.activity.ActivityBehavior;
import org.activiti.pvm.activity.ActivityContext; import org.activiti.pvm.activity.ActivityContext;
import org.activiti.pvm.process.PvmTransition;
/** /**
* @author Tom Baeyens * @author Tom Baeyens
*/ */
public class ParallelGateway implements ActivityBehavior { public class ParallelGateway implements ActivityBehavior {
private static Logger log = Logger.getLogger(ParallelGateway.class.getName()); public void start(ActivityContext activityContext) {
int incomingTransitionsSize = activityContext.getActivity().getIncomingTransitions().size();
if (incomingTransitionsSize==1) {
activate(activityContext);
} else { //incomingTransitionsSize > 1
Integer joinCount = (Integer) activityContext.getSystemVariable("joinCount");
if (joinCount==null) {
activityContext.setSystemVariable("joinCount", new Integer(1));
} else {
joinCount = joinCount + 1;
if (joinCount==incomingTransitionsSize) {
activate(activityContext);
}
}
}
}
public void start(ActivityContext activityExecutionContext) { protected void activate(ActivityContext activityContext) {
// Activity activity = execution.getActivity(); for (PvmTransition transition: activityContext.getActivity().getOutgoingTransitions()) {
// activityContext.take(transition);
// List<Transition> outgoingTransitions = execution.getOutgoingTransitions(); }
//
// ConcurrencyController concurrencyController = new ConcurrencyController(execution);
// concurrencyController.inactivate();
//
// List<ActivityExecution> joinedExecutions = concurrencyController.findInactiveConcurrentExecutions(activity);
//
// int nbrOfExecutionsToJoin = execution.getIncomingTransitions().size();
// int nbrOfExecutionsJoined = joinedExecutions.size();
//
// if (nbrOfExecutionsJoined==nbrOfExecutionsToJoin) {
// log.fine("parallel gateway '"+activity.getId()+"' activates: "+nbrOfExecutionsJoined+" of "+nbrOfExecutionsToJoin+" joined");
// concurrencyController.takeAll(outgoingTransitions, joinedExecutions);
//
// } else if (log.isLoggable(Level.FINE)){
// log.fine("parallel gateway '"+activity.getId()+"' does not activate: "+nbrOfExecutionsJoined+" of "+nbrOfExecutionsToJoin+" joined");
// }
} }
} }
/* 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.test.pvm.activities;
import org.activiti.pvm.activity.ActivityContext;
import org.activiti.pvm.activity.SubProcessActivityBehavior;
import org.activiti.pvm.process.PvmProcessDefinition;
import org.activiti.pvm.process.PvmTransition;
import org.activiti.pvm.runtime.PvmProcessInstance;
/**
* @author Tom Baeyens
*/
public class ReusableSubProcess implements SubProcessActivityBehavior {
public void start(ActivityContext activityContext) throws Exception {
PvmProcessDefinition processDefinition = null;
PvmProcessInstance subProcessInstance = activityContext.createSubProcessInstance(processDefinition);
// inject information from the super process into the subprocess
// for (variableDeclarations) {
// subProcessInstance.setVariable(null, null);
// }
subProcessInstance.start();
}
public void subProcessEnded(ActivityContext activityContext) throws Exception {
// extract information from the subprocess and inject it into the superprocess
// for (variableDeclarations) {
// subProcessInstance.setVariable(null, null);
// }
// take default transition
PvmTransition transition = activityContext.getActivity().getOutgoingTransitions().get(0);
activityContext.take(transition);
}
}
...@@ -27,7 +27,7 @@ public class WaitState implements SignallableActivityBehaviour { ...@@ -27,7 +27,7 @@ public class WaitState implements SignallableActivityBehaviour {
} }
public void signal(ActivityContext activityExecutionContext, String signal, Object signalData) { public void signal(ActivityContext activityExecutionContext, String signal, Object signalData) {
PvmTransition transition = activityExecutionContext.getOutgoingTransitions().get(0); PvmTransition transition = activityExecutionContext.getActivity().getOutgoingTransitions().get(0);
activityExecutionContext.take(transition); activityExecutionContext.take(transition);
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册