/** * Copyright 2008 biaoping.yin * * 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.bpmn.behavior; import java.util.Collection; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.Expression; import org.activiti.engine.delegate.VariableScope; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.pvm.delegate.ActivityExecution; import org.activiti.engine.impl.pvm.process.ActivityImpl; /** * <p>Title: MixMultiInstanceActivityBehavior.java</p> * * <p>Description: 扩展Activiti功能,便于流程实例运行时串并行切换</p> * * <p>Copyright: Copyright (c) 2007</p> * * <p>bboss workgroup</p> * @Date 2013-5-29 * @author biaoping.yin * @version 1.0 */ public class MixMultiInstanceActivityBehavior extends MultiInstanceActivityBehavior { private MultiInstanceActivityBehavior innerParallelActivityBehavior; private MultiInstanceActivityBehavior innerSequentialActivityBehavior; private String defaultMultiInstanceMode = multiInstanceMode_parallel; private MultiInstanceActivityBehavior defaultMultiInstanceActivityBehavior; private String multiInstanceMode_variable ; private ActivityImpl activity; public MixMultiInstanceActivityBehavior(ActivityImpl activity, MultiInstanceActivityBehavior innerParallelActivityBehavior,MultiInstanceActivityBehavior innerSequentialActivityBehavior,String defaultMultiInstanceMode) { this.innerParallelActivityBehavior = innerParallelActivityBehavior; this.innerSequentialActivityBehavior = innerSequentialActivityBehavior; this.defaultMultiInstanceMode = defaultMultiInstanceMode == null || defaultMultiInstanceMode.equals("")?multiInstanceMode_parallel:defaultMultiInstanceMode; this.activity = activity; this.multiInstanceMode_variable = this.activity.getId() + multiInstanceMode_variable_const; if(this.defaultMultiInstanceMode.equals(multiInstanceMode_parallel)) { this.defaultMultiInstanceActivityBehavior = this.innerParallelActivityBehavior; } else { this.defaultMultiInstanceActivityBehavior = this.innerSequentialActivityBehavior; } } /** * 返回任务类型是否是并行多实例任务 * @return */ public boolean isParreal() { return defaultMultiInstanceActivityBehavior != null && defaultMultiInstanceActivityBehavior instanceof ParallelMultiInstanceBehavior; } /** * 返回任务类型是否是串行多实例任务 * @return */ public boolean isSequence() { return defaultMultiInstanceActivityBehavior != null && defaultMultiInstanceActivityBehavior instanceof SequentialMultiInstanceBehavior; } public boolean isMail() { return this.defaultMultiInstanceActivityBehavior.innerActivityBehavior instanceof MailActivityBehavior; } private MultiInstanceActivityBehavior getMultiInstanceActivityBehavior(VariableScope execution) { String mode = (String)execution.getVariable(this.multiInstanceMode_variable); if(mode == null) mode = (String)execution.getVariableLocal(this.multiInstanceMode_variable); if(mode == null) { if(execution instanceof ActivityExecution) { return ((ActivityExecution)execution).getTaskContext().isIsparrel()?innerParallelActivityBehavior:innerSequentialActivityBehavior; } else return this.defaultMultiInstanceActivityBehavior; } if(mode.equals(multiInstanceMode_parallel)) { return this.innerParallelActivityBehavior; } else { return this.innerSequentialActivityBehavior; } } @Override protected void createInstances(ActivityExecution execution) throws Exception { getMultiInstanceActivityBehavior(execution).createInstances(execution); } public Collection getAssignee(TaskEntity task, ActivityExecution execution) { return getMultiInstanceActivityBehavior(execution).getAssignee(task, execution); // if (taskDefinition.getAssigneeExpression() != null) // return (String) taskDefinition.getAssigneeExpression().getValue(execution); // return null; } @Override public void execute(ActivityExecution execution) throws Exception { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).execute(execution); } @Override public void signal(ActivityExecution execution, String signalName, Object signalData) throws Exception { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).signal(execution, signalName, signalData); } // @Override // public void signal(ActivityExecution execution, String signalName, // Object signalData, TaskContext taskContext) throws Exception { // // TODO Auto-generated method stub // getMultiInstanceActivityBehavior(execution).signal(execution, signalName, signalData, taskContext); // } @Override public void lastExecutionEnded(ActivityExecution execution) { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).lastExecutionEnded(execution); } @Override public void completing(DelegateExecution execution, DelegateExecution subProcessInstance) throws Exception { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).completing(execution, subProcessInstance); } @Override public void completed(ActivityExecution execution) throws Exception { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).completed(execution); } @Override protected int resolveNrOfInstances(ActivityExecution execution) { // TODO Auto-generated method stub return getMultiInstanceActivityBehavior(execution).resolveNrOfInstances(execution); } @Override protected void executeOriginalBehavior(ActivityExecution execution, int loopCounter) throws Exception { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).executeOriginalBehavior(execution, loopCounter); } @Override protected boolean usesCollection() { // TODO Auto-generated method stub return super.usesCollection(); } @Override protected boolean isExtraScopeNeeded() { // TODO Auto-generated method stub return super.isExtraScopeNeeded(); } @Override protected int resolveLoopCardinality(ActivityExecution execution) { // TODO Auto-generated method stub return getMultiInstanceActivityBehavior(execution).resolveLoopCardinality(execution); } @Override protected boolean completionConditionSatisfied(ActivityExecution execution) { // TODO Auto-generated method stub return getMultiInstanceActivityBehavior(execution).completionConditionSatisfied(execution); } @Override protected void setLoopVariable(ActivityExecution execution, String variableName, Object value) { // TODO Auto-generated method stub super.setLoopVariable(execution, variableName, value); } @Override protected Integer getLoopVariable(ActivityExecution execution, String variableName) { // TODO Auto-generated method stub return super.getLoopVariable(execution, variableName); } @Override protected void callActivityEndListeners(ActivityExecution execution) { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).callActivityEndListeners(execution); } @Override protected void logLoopDetails(ActivityExecution execution, String custom, int loopCounter, int nrOfCompletedInstances, int nrOfActiveInstances, int nrOfInstances) { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).logLoopDetails(execution, custom, loopCounter, nrOfCompletedInstances, nrOfActiveInstances, nrOfInstances); } @Override public Expression getLoopCardinalityExpression() { // TODO Auto-generated method stub return super.getLoopCardinalityExpression(); } @Override public void setLoopCardinalityExpression( Expression loopCardinalityExpression) { // TODO Auto-generated method stub super.setLoopCardinalityExpression(loopCardinalityExpression); this.innerParallelActivityBehavior.setLoopCardinalityExpression(loopCardinalityExpression); this.innerSequentialActivityBehavior.setLoopCardinalityExpression(loopCardinalityExpression); } @Override public Expression getCompletionConditionExpression() { // TODO Auto-generated method stub return super.getCompletionConditionExpression(); } @Override public void setCompletionConditionExpression( Expression completionConditionExpression) { // TODO Auto-generated method stub super.setCompletionConditionExpression(completionConditionExpression); this.innerParallelActivityBehavior.setCompletionConditionExpression(completionConditionExpression); this.innerSequentialActivityBehavior.setCompletionConditionExpression(completionConditionExpression); } @Override public Expression getCollectionExpression() { // TODO Auto-generated method stub return super.getCollectionExpression(); } @Override public void setCollectionExpression(Expression collectionExpression) { // TODO Auto-generated method stub super.setCollectionExpression(collectionExpression); this.innerParallelActivityBehavior.setCollectionExpression(collectionExpression); this.innerSequentialActivityBehavior.setCollectionExpression(collectionExpression); } @Override public String getCollectionVariable() { // TODO Auto-generated method stub return super.getCollectionVariable(); } @Override public void setCollectionVariable(String collectionVariable) { // TODO Auto-generated method stub super.setCollectionVariable(collectionVariable); this.innerParallelActivityBehavior.setCollectionVariable(collectionVariable); this.innerSequentialActivityBehavior.setCollectionVariable(collectionVariable); } @Override public String getCollectionElementVariable() { // TODO Auto-generated method stub return super.getCollectionElementVariable(); } @Override public void setCollectionElementVariable(String collectionElementVariable) { // TODO Auto-generated method stub super.setCollectionElementVariable(collectionElementVariable); this.innerParallelActivityBehavior.setCollectionElementVariable(collectionElementVariable); this.innerSequentialActivityBehavior.setCollectionElementVariable(collectionElementVariable); } /** * to do */ public void setInnerActivityBehavior( AbstractBpmnActivityBehavior innerActivityBehavior) { // TODO Auto-generated method stub this.innerParallelActivityBehavior.setInnerActivityBehavior(innerActivityBehavior); this.innerSequentialActivityBehavior.setInnerActivityBehavior(innerActivityBehavior); super.setInnerActivityBehavior(innerActivityBehavior); } @Override protected void leave(ActivityExecution execution) { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(execution).leave(execution); } // @Override // protected void leave(ActivityExecution execution,TaskContext taskContext) { // // TODO Auto-generated method stub // getMultiInstanceActivityBehavior(execution).leave(execution, taskContext); // } @Override protected void leaveIgnoreConditions(ActivityExecution activityContext) { // TODO Auto-generated method stub getMultiInstanceActivityBehavior(activityContext).leaveIgnoreConditions(activityContext); } @Override public boolean isUserTask() { // TODO Auto-generated method stub return this.innerParallelActivityBehavior.isUserTask(); } }