Skip to content

Commit

Permalink
Merge branch 'main' into flowable-release-7.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
filiphr committed Mar 20, 2024
2 parents 930e464 + 98dead9 commit 19e512a
Show file tree
Hide file tree
Showing 27 changed files with 724 additions and 41 deletions.
14 changes: 11 additions & 3 deletions distro/src/notice.txt
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ org.liquibase liquibase-core 4.5.0 Apac
org.mybatis mybatis 3.5.13 The Apache Software License, Version 2.0
org.mybatis mybatis-spring 3.0.3 The Apache Software License, Version 2.0
org.mvel mvel2 2.2.6.Final The Apache Software License, Version 2.0
org.slf4j jcl-over-slf4j 2.0.11 MIT License
org.slf4j slf4j-api 2.0.11 MIT License
org.slf4j slf4j-log4j12 2.0.11 MIT License
org.slf4j jcl-over-slf4j 2.0.11 MIT License
org.slf4j slf4j-api 2.0.11 MIT License
org.slf4j slf4j-log4j12 2.0.11 MIT License
org.springframework spring-beans 6.1.3 The Apache Software License, Version 2.0
org.springframework spring-core 6.1.3 The Apache Software License, Version 2.0
org.springframework spring-context 6.1.3 The Apache Software License, Version 2.0
Expand All @@ -127,3 +127,11 @@ org.tinyjee.jgraphx jgraphx 1.10.4.1 JGra
org.yaml snakeyaml 1.17 The Apache Software License, Version 2.0
xerces xercesImpl 2.12.1 The Apache Software License, Version 2.0
xml-apis xml-apis 1.4.01 The Apache Software License, Version 2.0-The SAX License-The W3C License

When using the Flowable Rest app, there are a number of additional libraries included, which are otherwise not a dependency of Flowable:

org.eclipse.angus angus-mail 2.0.2 EPL 2.0, GPL with classpath exception
jakarta.annotation jakarta.annotation-api 2.1.1 EPL 2.0, GPL with classpath exception
jakarta.jms jakarta.jms-api 3.1.0 EPL 2.0, GPL with classpath exception
jakarta.mail jakarta.mail-api 2.1.2 EPL 2.0, GPL with classpath exception
org.openjdk.nashorn nashorn-core 15.4 GPL with classpath exception
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,27 @@
*/
package org.flowable.cmmn.api.migration;

import java.util.LinkedHashMap;
import java.util.Map;

public class MoveToAvailablePlanItemDefinitionMapping extends PlanItemDefinitionMapping {

protected Map<String, Object> withLocalVariables = new LinkedHashMap<>();

public MoveToAvailablePlanItemDefinitionMapping(String planItemDefinitionId) {
super(planItemDefinitionId);
}

public MoveToAvailablePlanItemDefinitionMapping(String planItemDefinitionId, Map<String, Object> withLocalVariables) {
super(planItemDefinitionId);
this.withLocalVariables = withLocalVariables;
}

public Map<String, Object> getWithLocalVariables() {
return withLocalVariables;
}

public void setWithLocalVariables(Map<String, Object> withLocalVariables) {
this.withLocalVariables = withLocalVariables;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ public static MoveToAvailablePlanItemDefinitionMapping createMoveToAvailablePlan
return new MoveToAvailablePlanItemDefinitionMapping(planItemDefinitionId);
}

public static MoveToAvailablePlanItemDefinitionMapping createMoveToAvailablePlanItemDefinitionMappingFor(
String planItemDefinitionId, Map<String, Object> withLocalVariables) {

return new MoveToAvailablePlanItemDefinitionMapping(planItemDefinitionId, withLocalVariables);
}

public static WaitingForRepetitionPlanItemDefinitionMapping createWaitingForRepetitionPlanItemDefinitionMappingFor(String planItemDefinitionId) {
return new WaitingForRepetitionPlanItemDefinitionMapping(planItemDefinitionId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.Map;

import org.flowable.cmmn.api.migration.ActivatePlanItemDefinitionMapping;
import org.flowable.cmmn.api.migration.MoveToAvailablePlanItemDefinitionMapping;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.common.engine.api.FlowableObjectNotFoundException;

Expand Down Expand Up @@ -63,6 +64,11 @@ public interface ChangePlanItemStateBuilder {
*/
ChangePlanItemStateBuilder changeToAvailableStateByPlanItemDefinitionIds(List<String> planItemDefinitionIds);

/**
* Set a plan item to available state by definition mapping.
*/
ChangePlanItemStateBuilder changeToAvailableStateByPlanItemDefinition(MoveToAvailablePlanItemDefinitionMapping planItemDefinitionMapping);

/**
* Terminate a plan item by definition id without terminating another plan item instance.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ public interface CmmnEngineAgenda extends Agenda {

void planEvaluateCriteriaOperation(String caseInstanceEntityId, PlanItemLifeCycleEvent lifeCycleEvent);

void planEvaluateCriteriaOperation(String caseInstanceEntityId, MigrationContext migrationContext);

void planEvaluateVariableEventListenersOperation(String caseInstanceEntityId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,14 @@ public void planEvaluateCriteriaOperation(String caseInstanceEntityId, PlanItemL
internalPlanEvaluateCriteria(caseInstanceEntityId, lifeCycleEvent, false);
}

@Override
public void planEvaluateCriteriaOperation(String caseInstanceEntityId, MigrationContext migrationContext) {
EvaluateCriteriaOperation evaluateCriteriaOperation = new EvaluateCriteriaOperation(commandContext, caseInstanceEntityId, null);
evaluateCriteriaOperation.setEvaluateStagesAndCaseInstanceCompletion(false);
evaluateCriteriaOperation.setMigrationContext(migrationContext);
addOperation(evaluateCriteriaOperation);
}

protected void internalPlanEvaluateCriteria(String caseInstanceEntityId, PlanItemLifeCycleEvent planItemLifeCycleEvent, boolean evaluateCaseInstanceCompleted) {
EvaluateCriteriaOperation evaluateCriteriaOperation = new EvaluateCriteriaOperation(commandContext, caseInstanceEntityId, planItemLifeCycleEvent);
evaluateCriteriaOperation.setEvaluateStagesAndCaseInstanceCompletion(evaluateCaseInstanceCompleted);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.flowable.cmmn.engine.impl.util.ExpressionUtil;
import org.flowable.cmmn.engine.impl.util.PlanItemInstanceContainerUtil;
import org.flowable.cmmn.engine.impl.util.PlanItemInstanceUtil;
import org.flowable.cmmn.engine.interceptor.MigrationContext;
import org.flowable.cmmn.model.Criterion;
import org.flowable.cmmn.model.EventListener;
import org.flowable.cmmn.model.HasExitCriteria;
Expand Down Expand Up @@ -107,6 +108,7 @@ public void evaluateForActivation(PlanItemInstanceEntity planItemInstanceEntity,
// if we need to activate the plan item, mark the result as some criteria changed and plan the activation of the plan item by adding
// this as an operation to the agenda
if (activatePlanItemInstance) {
planItemInstanceEntity.setPlannedForActivationInMigration(true);
evaluationResult.markCriteriaChanged();
CommandContextUtil.getAgenda(commandContext)
.planActivatePlanItemInstanceOperation(planItemInstanceEntity, satisfiedEntryCriterion != null ? satisfiedEntryCriterion.getId() : null);
Expand Down Expand Up @@ -144,7 +146,7 @@ public boolean evaluateForCompletion(PlanItemInstanceEntity planItemInstanceEnti
} else if (planItem.getPlanItemDefinition() instanceof Stage) {

if (PlanItemInstanceState.ACTIVE.equals(state)) {
boolean criteriaChangeOrActiveChildrenForStage = evaluatePlanItemsCriteria(planItemInstanceEntity);
boolean criteriaChangeOrActiveChildrenForStage = evaluatePlanItemsCriteria(planItemInstanceEntity, null);
if (criteriaChangeOrActiveChildrenForStage) {
evaluationResult.markCriteriaChanged();
planItemInstanceEntity.setCompletable(false); // an active child = stage cannot be completed anymore
Expand Down Expand Up @@ -189,15 +191,21 @@ public boolean evaluateForCompletion(PlanItemInstanceEntity planItemInstanceEnti
* Returns false if no sentry changes happened and none of the passed plan item instances are active.
* This means that the parent of these plan item instances also now can change its state.
*/
protected boolean evaluatePlanItemsCriteria(PlanItemInstanceContainer planItemInstanceContainer) {
protected boolean evaluatePlanItemsCriteria(PlanItemInstanceContainer planItemInstanceContainer, MigrationContext migrationContext) {
List<PlanItemInstanceEntity> planItemInstances = planItemInstanceContainer.getChildPlanItemInstances();

// needed because when doing case instance migration the child plan item instances can be null
if (planItemInstances == null && planItemInstanceContainer instanceof CaseInstanceEntity) {
if ((planItemInstances == null || (migrationContext != null && migrationContext.isFetchPlanItemInstances())) &&
planItemInstanceContainer instanceof CaseInstanceEntity) {

PlanItemInstanceEntityManager planItemInstanceEntityManager = CommandContextUtil.getPlanItemInstanceEntityManager(commandContext);
CaseInstanceEntity caseInstance = (CaseInstanceEntity) planItemInstanceContainer;
planItemInstances = planItemInstanceEntityManager.findByCaseInstanceId(caseInstance.getId());
planItemInstanceContainer.setChildPlanItemInstances(planItemInstances);

if (migrationContext != null && migrationContext.isFetchPlanItemInstances()) {
migrationContext.setFetchPlanItemInstances(false);
}
}

// create an evaluation result object, holding all evaluation results as well as a list of newly created child plan items, as to avoid concurrent
Expand All @@ -212,7 +220,7 @@ protected boolean evaluatePlanItemsCriteria(PlanItemInstanceContainer planItemIn
String state = planItemInstanceEntity.getState();

// check, if the plan item is in an evaluation state (e.g. available or waiting for repetition) to check for its activation
if (PlanItemInstanceState.EVALUATE_ENTRY_CRITERIA_STATES.contains(state)) {
if (PlanItemInstanceState.EVALUATE_ENTRY_CRITERIA_STATES.contains(state) && !planItemInstanceEntity.isPlannedForActivationInMigration()) {
evaluateForActivation(planItemInstanceEntity, planItemInstanceContainer, evaluationResult);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.flowable.cmmn.api.runtime.CaseInstanceState;
import org.flowable.cmmn.engine.impl.criteria.PlanItemLifeCycleEvent;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.cmmn.engine.interceptor.MigrationContext;
import org.flowable.cmmn.model.Criterion;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.slf4j.Logger;
Expand All @@ -27,6 +28,8 @@
public class EvaluateCriteriaOperation extends AbstractEvaluationCriteriaOperation {

private static final Logger LOGGER = LoggerFactory.getLogger(EvaluateCriteriaOperation.class);

protected MigrationContext migrationContext;

public EvaluateCriteriaOperation(CommandContext commandContext, String caseInstanceEntityId) {
super(commandContext, caseInstanceEntityId, null, null);
Expand All @@ -53,7 +56,7 @@ public void run() {
satisfiedExitCriterion.getExitType(), satisfiedExitCriterion.getExitEventType());

} else {
boolean criteriaChangeOrActiveChildren = evaluatePlanItemsCriteria(caseInstanceEntity);
boolean criteriaChangeOrActiveChildren = evaluatePlanItemsCriteria(caseInstanceEntity, migrationContext);
if (evaluateStagesAndCaseInstanceCompletion
&& evaluatePlanModelComplete()
&& !criteriaChangeOrActiveChildren
Expand Down Expand Up @@ -91,5 +94,12 @@ public String toString() {

return stringBuilder.toString();
}


public MigrationContext getMigrationContext() {
return migrationContext;
}

public void setMigrationContext(MigrationContext migrationContext) {
this.migrationContext = migrationContext;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ protected ChangePlanItemStateBuilderImpl prepareChangeStateBuilder(CaseInstance
}

for (MoveToAvailablePlanItemDefinitionMapping planItemDefinitionMapping : document.getMoveToAvailablePlanItemDefinitionMappings()) {
changePlanItemStateBuilder.changeToAvailableStateByPlanItemDefinitionId(planItemDefinitionMapping.getPlanItemDefinitionId());
changePlanItemStateBuilder.changeToAvailableStateByPlanItemDefinition(planItemDefinitionMapping);
}

for (WaitingForRepetitionPlanItemDefinitionMapping planItemDefinitionMapping : document.getWaitingForRepetitionPlanItemDefinitionMappings()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,7 @@ public interface PlanItemInstanceEntity extends Entity, HasRevision, DelegatePla

VariableScope getParentVariableScope();

boolean isPlannedForActivationInMigration();

void setPlannedForActivationInMigration(boolean plannedForActivationInMigration);
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public class PlanItemInstanceEntityImpl extends AbstractCmmnEngineVariableScopeE

protected PlanItemInstanceLifecycleListener currentLifecycleListener; // Only set when executing an plan item lifecycle listener
protected FlowableListener currentFlowableListener; // Only set when executing an plan item lifecycle listener
protected boolean plannedForActivationInMigration;

public PlanItemInstanceEntityImpl() {
}
Expand Down Expand Up @@ -646,6 +647,16 @@ public void setLocalizedName(String localizedName) {
this.localizedName = localizedName;
}

@Override
public boolean isPlannedForActivationInMigration() {
return plannedForActivationInMigration;
}

@Override
public void setPlannedForActivationInMigration(boolean plannedForActivationInMigration) {
this.plannedForActivationInMigration = plannedForActivationInMigration;
}

@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,9 @@ protected void doMovePlanItemState(CaseInstanceChangeState caseInstanceChangeSta
executeRemoveWaitingForRepetitionPlanItemInstances(caseInstanceChangeState, caseInstance, commandContext);

CmmnEngineAgenda agenda = CommandContextUtil.getAgenda(commandContext);
agenda.planEvaluateCriteriaOperation(caseInstance.getId());
MigrationContext migrationContext = new MigrationContext();
migrationContext.setFetchPlanItemInstances(true);
agenda.planEvaluateCriteriaOperation(caseInstance.getId(), migrationContext);
}

protected void executeChangePlanItemIds(CaseInstanceChangeState caseInstanceChangeState, String originalCaseDefinitionId, CommandContext commandContext) {
Expand Down Expand Up @@ -228,6 +230,10 @@ protected void executeActivatePlanItemInstances(CaseInstanceChangeState caseInst

PlanItemInstanceEntity newPlanItemInstance = createStagesAndPlanItemInstances(planItem,
caseInstance, caseInstanceChangeState, commandContext);

if (planItemDefinitionMapping.getWithLocalVariables() != null && !planItemDefinitionMapping.getWithLocalVariables().isEmpty()) {
newPlanItemInstance.setVariablesLocal(planItemDefinitionMapping.getWithLocalVariables());
}

CmmnEngineAgenda agenda = CommandContextUtil.getAgenda(commandContext);
if (planItemDefinitionMapping.getNewAssignee() != null && planItem.getPlanItemDefinition() instanceof HumanTask) {
Expand Down Expand Up @@ -316,6 +322,10 @@ protected void executeChangePlanItemInstancesToAvailableState(CaseInstanceChange
caseInstanceChangeState.addCreatedStageInstance(planItemDefinitionMapping.getPlanItemDefinitionId(), availablePlanItemInstance);
}

if (planItemDefinitionMapping.getWithLocalVariables() != null && !planItemDefinitionMapping.getWithLocalVariables().isEmpty()) {
availablePlanItemInstance.setVariablesLocal(planItemDefinitionMapping.getWithLocalVariables());
}

CmmnHistoryManager cmmnHistoryManager = cmmnEngineConfiguration.getCmmnHistoryManager();
cmmnHistoryManager.recordPlanItemInstanceCreated(availablePlanItemInstance);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ public ChangePlanItemStateBuilder changeToAvailableStateByPlanItemDefinitionIds(
return this;
}

@Override
public ChangePlanItemStateBuilder changeToAvailableStateByPlanItemDefinition(MoveToAvailablePlanItemDefinitionMapping planItemDefinitionMapping) {
changeToAvailableStatePlanItemDefinitions.add(planItemDefinitionMapping);
return this;
}

@Override
public ChangePlanItemStateBuilder terminatePlanItemDefinitionId(String planItemDefinitionId) {
terminatePlanItemDefinitions.add(new TerminatePlanItemDefinitionMapping(planItemDefinitionId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,16 @@

public class MigrationContext {

protected boolean fetchPlanItemInstances;
protected String assignee;

public boolean isFetchPlanItemInstances() {
return fetchPlanItemInstances;
}

public void setFetchPlanItemInstances(boolean fetchPlanItemInstances) {
this.fetchPlanItemInstances = fetchPlanItemInstances;
}

public String getAssignee() {
return assignee;
Expand Down
Loading

0 comments on commit 19e512a

Please sign in to comment.