diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/delegate/DelegateExecution.java b/modules/activiti-engine/src/main/java/org/activiti/engine/delegate/DelegateExecution.java index d740ded44f6ec076e4220f025c03075320bd997e..d28d4b8d25bde695e4dfabfdaf384348ff8036d3 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/delegate/DelegateExecution.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/delegate/DelegateExecution.java @@ -72,4 +72,10 @@ public interface DelegateExecution extends VariableScope { * All Activiti services can be accessed through this interface. */ EngineServices getEngineServices(); + + /** + * Update process business key if not null. + * Returns null if not updated + */ + String updateProcessBusinessKey(String bzKey); } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/HistoryManager.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/HistoryManager.java index 762b1a57dcfce55e31d34fc5741dacb11cdd8a1f..cf8fe18dd6bcca676424e2f397bcc05c4c9a76bb 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/HistoryManager.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/HistoryManager.java @@ -659,4 +659,13 @@ public class HistoryManager extends AbstractManager { getHistoricIdentityLinkEntityManager().deleteHistoricIdentityLink(id); } } + + public void updateProcessBusinessKeyInHistory(ExecutionEntity processInstance) { + if(log.isDebugEnabled()) { + log.debug("updateProcessBusinessKeyInHistory : {}", processInstance.getId()); + } + HistoricProcessInstanceEntity historicProcessInstance = getDbSqlSession().selectById(HistoricProcessInstanceEntity.class, processInstance.getId()); + historicProcessInstance.setBusinessKey(processInstance.getProcessBusinessKey()); + getDbSqlSession().update(historicProcessInstance); + } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntity.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntity.java index 2afb0ffd8acfc698cb6b9cff433f1bf6130777b6..629bca8d4dbb1e9bf134ea6b9af878ab76e63da1 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntity.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntity.java @@ -1398,4 +1398,13 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut public void setQueryVariables(List queryVariables) { this.queryVariables = queryVariables; } + + public String updateProcessBusinessKey(String bzKey) { + if (isProcessInstanceType() && businessKey == null && bzKey != null) { + setBusinessKey(bzKey); + Context.getCommandContext().getHistoryManager().updateProcessBusinessKeyInHistory(this); + return bzKey; + } + return null; + } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java index b753b911f2c39681a23b17a64d9c338fb7b7bd19..a489b356007ffa6a78219a3bf235369663c39e14 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java @@ -869,4 +869,8 @@ public class ExecutionImpl implements public void disposeStartingExecution() { startingExecution = null; } + + public String updateProcessBusinessKey(String bzKey) { + return getProcessInstance().updateProcessBusinessKey(bzKey); + } } diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ea8e1a4ed199d31a379de313ba777a8c76e60dc9 --- /dev/null +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.java @@ -0,0 +1,45 @@ +/* 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.test.api.runtime; + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.ExecutionListener; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.impl.test.PluggableActivitiTestCase; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.test.Deployment; + +public class ProcessInstanceUpdateBusinessKeyTest extends PluggableActivitiTestCase { + + @Deployment + public void testProcessInstanceUpdateBusinessKey() { + + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult(); + runtimeService.startProcessInstanceByKey(processDefinition.getKey()); + + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult(); + assertEquals("bzKey", processInstance.getBusinessKey()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().singleResult(); + assertEquals("bzKey", historicProcessInstance.getBusinessKey()); + + } + + public static class UpdateBusinessKeyExecutionListener implements ExecutionListener { + public void notify(DelegateExecution delegateExecution) { + delegateExecution.updateProcessBusinessKey("bzKey"); + } + } + +} diff --git a/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.testProcessInstanceUpdateBusinessKey.bpmn20.xml b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.testProcessInstanceUpdateBusinessKey.bpmn20.xml new file mode 100644 index 0000000000000000000000000000000000000000..c58d513aca7e3cd36f50113c315c9640406f749d --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/runtime/ProcessInstanceUpdateBusinessKeyTest.testProcessInstanceUpdateBusinessKey.bpmn20.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/activiti-explorer/src/main/java/org/activiti/explorer/ui/process/MyProcessInstancesListQuery.java b/modules/activiti-explorer/src/main/java/org/activiti/explorer/ui/process/MyProcessInstancesListQuery.java index 89fd6bddd7f9cc3a9e0960ff47a6e211004dd6aa..dfc92d914dee552d051a1c4279020d27193c8748 100644 --- a/modules/activiti-explorer/src/main/java/org/activiti/explorer/ui/process/MyProcessInstancesListQuery.java +++ b/modules/activiti-explorer/src/main/java/org/activiti/explorer/ui/process/MyProcessInstancesListQuery.java @@ -76,7 +76,8 @@ public class MyProcessInstancesListQuery extends AbstractLazyLoadingQuery { ProcessDefinition processDefinition = getProcessDefinition(processInstance.getProcessDefinitionId()); - String itemName = getProcessDisplayName(processDefinition) + " (" + processInstance.getId() + ")"; + String itemName = getProcessDisplayName(processDefinition) + " (" + processInstance.getId() + ")" + + (processInstance.getBusinessKey() != null? processInstance.getBusinessKey() : ""); item.addItemProperty("name", new ObjectProperty(itemName, String.class)); return item; }