提交 a3f85307 编写于 作者: J jbarrez

ACT-593: fix NPE on full history on process with timer

上级 a0ef3844
......@@ -19,7 +19,6 @@ import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.pvm.delegate.ExecutionListener;
import org.activiti.engine.impl.pvm.delegate.TaskListener;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
import org.activiti.engine.impl.pvm.process.TransitionImpl;
import org.activiti.engine.impl.repository.ProcessDefinitionEntity;
......@@ -99,7 +98,7 @@ public class HistoryParseListener implements BpmnParseListener {
}
public void parseStartEvent(Element startEventElement, ScopeImpl scope, ActivityImpl activity) {
if (fullHistoryEnabled(scope.getProcessDefinition(), historyLevel)) {
if (fullHistoryEnabled(historyLevel)) {
activity.addExecutionListener(ExecutionListener.EVENTNAME_END, START_EVENT_END_HANDLER);
}
}
......@@ -131,27 +130,16 @@ public class HistoryParseListener implements BpmnParseListener {
}
}
public static boolean fullHistoryEnabled(ScopeImpl scopeElement, int historyLevel) {
return determineHistoryLevel(scopeElement, historyLevel) >= ProcessEngineConfigurationImpl.HISTORYLEVEL_FULL;
public static boolean fullHistoryEnabled(int historyLevel) {
return historyLevel >= ProcessEngineConfigurationImpl.HISTORYLEVEL_FULL;
}
public static boolean auditHistoryEnabled(ScopeImpl scopeElement, int historyLevel) {
return determineHistoryLevel(scopeElement, historyLevel) >= ProcessEngineConfigurationImpl.HISTORYLEVEL_AUDIT;
return historyLevel >= ProcessEngineConfigurationImpl.HISTORYLEVEL_AUDIT;
}
public static boolean activityHistoryEnabled(ScopeImpl scopeElement, int historyLevel) {
return determineHistoryLevel(scopeElement, historyLevel) >= ProcessEngineConfigurationImpl.HISTORYLEVEL_ACTIVITY;
}
public static int determineHistoryLevel(ScopeImpl scopeElement, int historyLevel) {
ProcessDefinitionImpl processDefinition = scopeElement.getProcessDefinition();
if (processDefinition != null) {
Integer processHistoryLevel = ((ProcessDefinitionEntity) processDefinition).getHistoryLevel();
if (processHistoryLevel != null) {
return Math.min(historyLevel, ((ProcessDefinitionEntity) scopeElement.getProcessDefinition()).getHistoryLevel());
}
}
return historyLevel;
return historyLevel >= ProcessEngineConfigurationImpl.HISTORYLEVEL_ACTIVITY;
}
public void parseSendTask(Element sendTaskElement, ScopeImpl scope, ActivityImpl activity) {
......
......@@ -35,7 +35,6 @@ import org.activiti.engine.impl.history.HistoricActivityInstanceEntity;
import org.activiti.engine.impl.history.HistoricProcessInstanceEntity;
import org.activiti.engine.impl.history.HistoricVariableUpdateEntity;
import org.activiti.engine.impl.history.handler.ActivityInstanceEndHandler;
import org.activiti.engine.impl.history.handler.HistoryParseListener;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.jobexecutor.TimerDeclarationImpl;
import org.activiti.engine.impl.pvm.PvmActivity;
......@@ -53,8 +52,6 @@ import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
import org.activiti.engine.impl.pvm.process.TransitionImpl;
import org.activiti.engine.impl.pvm.runtime.AtomicOperation;
import org.activiti.engine.impl.pvm.runtime.AtomicOperationDeleteCascade;
import org.activiti.engine.impl.pvm.runtime.AtomicOperationDeleteCascadeFireActivityEnd;
import org.activiti.engine.impl.pvm.runtime.InterpretableExecution;
import org.activiti.engine.impl.pvm.runtime.OutgoingExecution;
import org.activiti.engine.impl.task.TaskEntity;
......@@ -62,7 +59,6 @@ import org.activiti.engine.impl.variable.VariableDeclaration;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.tools.ant.filters.TokenFilter.DeleteCharacters;
/**
......@@ -833,8 +829,8 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
@Override
protected void initializeActivityInstanceId(HistoricVariableUpdateEntity historicVariableUpdate) {
int historyLevel = CommandContext.getCurrent().getProcessEngineConfiguration().getHistoryLevel();
if (HistoryParseListener.fullHistoryEnabled(getActivity(), historyLevel)) {
ProcessEngineConfigurationImpl processEngineConfig = CommandContext.getCurrent().getProcessEngineConfiguration();
if (processEngineConfig.getHistoryLevel() >= processEngineConfig.HISTORYLEVEL_FULL) {
HistoricActivityInstanceEntity historicActivityInstance = ActivityInstanceEndHandler.findActivityInstance(this, true);
if (historicActivityInstance!=null) {
historicVariableUpdate.setActivityInstanceId(historicActivityInstance.getId());
......
......@@ -545,4 +545,13 @@ public class FullHistoryTest extends ResourceActivitiTestCase {
historyService.deleteHistoricTaskInstance(taskId);
}
// ACT-592
@Deployment
public void testSetVariableOnProcessInstanceWithTimer() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("timerVariablesProcess");
runtimeService.setVariable(processInstance.getId(), "myVar", 123456L);
assertEquals(123456L, runtimeService.getVariable(processInstance.getId(), "myVar"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="timerVariablesProcess">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="task" />
<userTask id="task" name="Task rigged with timer" />
<sequenceFlow id="flow2" sourceRef="task" targetRef="theEnd" />
<boundaryEvent id="boundaryTimer" cancelActivity="true" attachedToRef="task">
<timerEventDefinition>
<timeDuration>PT2H</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<sequenceFlow id="flow3" sourceRef="boundaryTimer" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册