Skip to content

Commit aa7d3ee

Browse files
Expos plan item instance local variables via query and rest api (#3971)
Co-authored-by: Christopher Welsch <christopher.welsch@flowable.com>
1 parent d0989be commit aa7d3ee

File tree

36 files changed

+589
-30
lines changed

36 files changed

+589
-30
lines changed

modules/flowable-cmmn-api/src/main/java/org/flowable/cmmn/api/history/HistoricPlanItemInstance.java

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.flowable.cmmn.api.history;
1414

1515
import java.util.Date;
16+
import java.util.Map;
1617

1718
/**
1819
* @author Dennis Federico
@@ -88,4 +89,6 @@ public interface HistoricPlanItemInstance {
8889

8990
/** Sets an optional localized name for the plan item */
9091
void setLocalizedName(String localizedName);
92+
93+
Map<String, Object> getPlanItemInstanceLocalVariables();
9194
}

modules/flowable-cmmn-api/src/main/java/org/flowable/cmmn/api/history/HistoricPlanItemInstanceQuery.java

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public interface HistoricPlanItemInstanceQuery extends Query<HistoricPlanItemIns
8585
*/
8686
HistoricPlanItemInstanceQuery withLocalizationFallback();
8787

88+
HistoricPlanItemInstanceQuery includeLocalVariables();
89+
8890
HistoricPlanItemInstanceQuery orderByCreateTime();
8991
HistoricPlanItemInstanceQuery orderByEndedTime();
9092
HistoricPlanItemInstanceQuery orderByLastAvailableTime();

modules/flowable-cmmn-api/src/main/java/org/flowable/cmmn/api/runtime/PlanItemInstance.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.flowable.cmmn.api.runtime;
1414

1515
import java.util.Date;
16+
import java.util.Map;
1617

1718
/**
1819
* @author Joram Barrez
@@ -58,7 +59,7 @@ default Date getStartTime() {
5859
String getFormKey();
5960
String getExtraValue();
6061
String getTenantId();
61-
62+
Map<String, Object> getPlanItemInstanceLocalVariables();
6263

6364
/** Sets an optional localized name for the plan item */
6465
void setLocalizedName(String localizedName);

modules/flowable-cmmn-api/src/main/java/org/flowable/cmmn/api/runtime/PlanItemInstanceQuery.java

+6
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,12 @@ public interface PlanItemInstanceQuery extends Query<PlanItemInstanceQuery, Plan
381381
*/
382382
PlanItemInstanceQuery caseVariableNotExists(String name);
383383

384+
/**
385+
*
386+
* Include local plan item instance variables in the query result
387+
*/
388+
PlanItemInstanceQuery includeLocalVariables();
389+
384390
/**
385391
* Localize plan item name to specified locale.
386392
*/

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/delegate/ReadOnlyDelegatePlanItemInstanceImpl.java

+7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class ReadOnlyDelegatePlanItemInstanceImpl implements ReadOnlyDelegatePla
5858
protected final String formKey;
5959
protected final String extraValue;
6060
protected final Map<String, Object> variables;
61+
protected final Map<String, Object> localVariables;
6162
protected final String tenantId;
6263
protected final PlanItem planItem;
6364

@@ -94,6 +95,7 @@ public ReadOnlyDelegatePlanItemInstanceImpl(DelegatePlanItemInstance planItemIns
9495
this.formKey = planItemInstance.getFormKey();
9596
this.extraValue = planItemInstance.getExtraValue();
9697
this.variables = new HashMap<>(planItemInstance.getVariables());
98+
this.localVariables = new HashMap<>(planItemInstance.getPlanItemInstanceLocalVariables());
9799
this.tenantId = planItemInstance.getTenantId();
98100
this.planItem = planItemInstance.getPlanItem();
99101
}
@@ -268,6 +270,11 @@ public String getTenantId() {
268270
return tenantId;
269271
}
270272

273+
@Override
274+
public Map<String, Object> getPlanItemInstanceLocalVariables() {
275+
return localVariables;
276+
}
277+
271278
@Override
272279
public PlanItem getPlanItem() {
273280
return planItem;

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/history/HistoricPlanItemInstanceQueryImpl.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public class HistoricPlanItemInstanceQueryImpl extends AbstractQuery<HistoricPla
8888
protected boolean withoutTenantId;
8989
protected String locale;
9090
protected boolean withLocalizationFallback;
91+
protected boolean includeLocalVariables;
9192

9293
public HistoricPlanItemInstanceQueryImpl() {
9394

@@ -439,6 +440,13 @@ public HistoricPlanItemInstanceQuery withLocalizationFallback() {
439440
return this;
440441
}
441442

443+
@Override
444+
public HistoricPlanItemInstanceQuery includeLocalVariables() {
445+
this.includeLocalVariables = true;
446+
return this;
447+
}
448+
449+
442450
@Override
443451
public HistoricPlanItemInstanceQuery orderByCreateTime() {
444452
return orderBy(HistoricPlanItemInstanceQueryProperty.CREATE_TIME);
@@ -511,7 +519,12 @@ public long executeCount(CommandContext commandContext) {
511519

512520
@Override
513521
public List<HistoricPlanItemInstance> executeList(CommandContext commandContext) {
514-
List<HistoricPlanItemInstance> historicPlanItems = CommandContextUtil.getHistoricPlanItemInstanceEntityManager(commandContext).findByCriteria(this);
522+
List<HistoricPlanItemInstance> historicPlanItems;
523+
if (includeLocalVariables){
524+
historicPlanItems = CommandContextUtil.getHistoricPlanItemInstanceEntityManager(commandContext).findWithVariablesByCriteria(this);
525+
} else {
526+
historicPlanItems =CommandContextUtil.getHistoricPlanItemInstanceEntityManager(commandContext).findByCriteria(this);
527+
}
515528

516529
CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);
517530
if (cmmnEngineConfiguration.getPlanItemLocalizationManager() != null) {
@@ -676,6 +689,9 @@ public String getTenantIdLike() {
676689
public boolean isWithoutTenantId() {
677690
return withoutTenantId;
678691
}
692+
public boolean isIncludeLocalVariables() {
693+
return includeLocalVariables;
694+
}
679695

680696
public List<List<String>> getSafeInvolvedGroups() {
681697
return safeInvolvedGroups;

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricPlanItemInstanceEntity.java

+3
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
package org.flowable.cmmn.engine.impl.persistence.entity;
1414

1515
import java.util.Date;
16+
import java.util.List;
1617

1718
import org.flowable.cmmn.api.history.HistoricPlanItemInstance;
1819
import org.flowable.common.engine.impl.db.HasRevision;
1920
import org.flowable.common.engine.impl.persistence.entity.Entity;
21+
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity;
2022

2123
/**
2224
* @author Dennis Federico
@@ -91,4 +93,5 @@ public interface HistoricPlanItemInstanceEntity extends Entity, HasRevision, His
9193

9294
void setTenantId(String tenantId);
9395

96+
List<HistoricVariableInstanceEntity> getQueryVariables();
9497
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricPlanItemInstanceEntityImpl.java

+33
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,16 @@
1414

1515
import java.util.Date;
1616
import java.util.HashMap;
17+
import java.util.List;
1718
import java.util.Map;
1819

1920
import org.apache.commons.lang3.StringUtils;
2021
import org.flowable.cmmn.api.runtime.PlanItemInstance;
2122
import org.flowable.cmmn.engine.CmmnEngineConfiguration;
23+
import org.flowable.common.engine.impl.context.Context;
24+
import org.flowable.variable.api.history.HistoricVariableInstance;
25+
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInitializingList;
26+
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity;
2227

2328
/**
2429
* @author Dennis Federico
@@ -57,6 +62,7 @@ public class HistoricPlanItemInstanceEntityImpl extends AbstractCmmnEngineEntity
5762
protected boolean showInOverview;
5863
protected String tenantId = CmmnEngineConfiguration.NO_TENANT_ID;
5964
protected String localizedName;
65+
protected List<HistoricVariableInstanceEntity> queryVariables;
6066

6167
public HistoricPlanItemInstanceEntityImpl() {
6268
}
@@ -466,6 +472,33 @@ public void setLocalizedName(String localizedName) {
466472
this.localizedName = localizedName;
467473
}
468474

475+
@Override
476+
public Map<String, Object> getPlanItemInstanceLocalVariables() {
477+
Map<String, Object> variables = new HashMap<>();
478+
if (queryVariables != null) {
479+
for (HistoricVariableInstance variableInstance : queryVariables) {
480+
if (variableInstance.getId() != null && variableInstance.getSubScopeId() != null) {
481+
variables.put(variableInstance.getVariableName(), variableInstance.getValue());
482+
}
483+
}
484+
}
485+
return variables;
486+
}
487+
488+
@Override
489+
public List<HistoricVariableInstanceEntity> getQueryVariables() {
490+
if (queryVariables == null && Context.getCommandContext() != null) {
491+
queryVariables = new HistoricVariableInitializingList();
492+
}
493+
return queryVariables;
494+
}
495+
496+
public void setQueryVariables(List<HistoricVariableInstanceEntity> queryVariables) {
497+
this.queryVariables = queryVariables;
498+
}
499+
500+
501+
469502
@Override
470503
public String toString() {
471504
StringBuilder sb = new StringBuilder();

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricPlanItemInstanceEntityManager.java

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.flowable.cmmn.api.history.HistoricPlanItemInstance;
1919
import org.flowable.cmmn.api.history.HistoricPlanItemInstanceQuery;
2020
import org.flowable.cmmn.api.runtime.PlanItemInstance;
21+
import org.flowable.cmmn.engine.impl.history.HistoricPlanItemInstanceQueryImpl;
2122
import org.flowable.common.engine.impl.persistence.entity.EntityManager;
2223

2324
/**
@@ -38,4 +39,6 @@ public interface HistoricPlanItemInstanceEntityManager extends EntityManager<His
3839
void bulkDeleteHistoricPlanItemInstancesForCaseInstanceIds(Collection<String> caseInstanceIds);
3940

4041
void deleteHistoricPlanItemInstancesForNonExistingCaseInstances();
42+
43+
List<HistoricPlanItemInstance> findWithVariablesByCriteria(HistoricPlanItemInstanceQueryImpl historicPlanItemInstanceQuery);
4144
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricPlanItemInstanceEntityManagerImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,9 @@ public void bulkDeleteHistoricPlanItemInstancesForCaseInstanceIds(Collection<Str
6969
public void deleteHistoricPlanItemInstancesForNonExistingCaseInstances() {
7070
dataManager.deleteHistoricPlanItemInstancesForNonExistingCaseInstances();
7171
}
72+
73+
@Override
74+
public List<HistoricPlanItemInstance> findWithVariablesByCriteria(HistoricPlanItemInstanceQueryImpl historicPlanItemInstanceQuery) {
75+
return dataManager.findWithVariablesByCriteria(historicPlanItemInstanceQuery);
76+
}
7277
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/PlanItemInstanceEntity.java

+5
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
*/
1313
package org.flowable.cmmn.engine.impl.persistence.entity;
1414

15+
import java.util.List;
16+
1517
import org.flowable.cmmn.api.delegate.DelegatePlanItemInstance;
1618
import org.flowable.common.engine.impl.db.HasRevision;
1719
import org.flowable.common.engine.impl.persistence.entity.Entity;
1820
import org.flowable.variable.api.delegate.VariableScope;
21+
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;
1922

2023
/**
2124
* @author Joram Barrez
@@ -32,4 +35,6 @@ public interface PlanItemInstanceEntity extends Entity, HasRevision, DelegatePla
3235
boolean isStateChangeUnprocessed();
3336
void setStateChangeUnprocessed(boolean stateChangeUnprocessed);
3437

38+
39+
List<VariableInstanceEntity> getQueryVariables();
3540
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/PlanItemInstanceEntityImpl.java

+29-1
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
3535
import org.flowable.cmmn.model.PlanItem;
3636
import org.flowable.cmmn.model.RepetitionRule;
3737
import org.flowable.common.engine.api.scope.ScopeTypes;
38+
import org.flowable.common.engine.impl.context.Context;
3839
import org.flowable.variable.api.persistence.entity.VariableInstance;
3940
import org.flowable.variable.service.VariableServiceConfiguration;
41+
import org.flowable.variable.service.impl.persistence.entity.VariableInitializingList;
4042
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;
4143
import org.flowable.variable.service.impl.persistence.entity.VariableScopeImpl;
4244

@@ -77,7 +79,7 @@ public class PlanItemInstanceEntityImpl extends AbstractCmmnEngineVariableScopeE
7779
protected String exitCriterionId;
7880
protected String extraValue;
7981
protected String tenantId = CmmnEngineConfiguration.NO_TENANT_ID;
80-
82+
protected List<VariableInstanceEntity> queryVariables;
8183
// Counts
8284
protected boolean countEnabled;
8385
protected int variableCount;
@@ -457,6 +459,7 @@ public void setExtraValue(String extraValue) {
457459
public String getTenantId() {
458460
return tenantId;
459461
}
462+
460463
@Override
461464
public void setTenantId(String tenantId) {
462465
this.tenantId = tenantId;
@@ -669,6 +672,31 @@ public void setStateChangeUnprocessed(boolean stateChangeUnprocessed) {
669672
this.stateChangeUnprocessed = stateChangeUnprocessed;
670673
}
671674

675+
@Override
676+
public Map<String, Object> getPlanItemInstanceLocalVariables() {
677+
Map<String, Object> variables = new HashMap<>();
678+
if (queryVariables != null) {
679+
for (VariableInstance variableInstance : queryVariables) {
680+
if (variableInstance.getId() != null && variableInstance.getSubScopeId() != null) {
681+
variables.put(variableInstance.getName(), variableInstance.getValue());
682+
}
683+
}
684+
}
685+
return variables;
686+
}
687+
688+
@Override
689+
public List<VariableInstanceEntity> getQueryVariables() {
690+
if (queryVariables == null && Context.getCommandContext() != null) {
691+
queryVariables = new VariableInitializingList();
692+
}
693+
return queryVariables;
694+
}
695+
696+
public void setQueryVariables(List<VariableInstanceEntity> queryVariables) {
697+
this.queryVariables = queryVariables;
698+
}
699+
672700
@Override
673701
public String toString() {
674702
StringBuilder stringBuilder = new StringBuilder();

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/PlanItemInstanceEntityManager.java

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.flowable.cmmn.api.history.HistoricPlanItemInstance;
1818
import org.flowable.cmmn.api.runtime.PlanItemInstance;
1919
import org.flowable.cmmn.api.runtime.PlanItemInstanceQuery;
20+
import org.flowable.cmmn.engine.impl.runtime.PlanItemInstanceQueryImpl;
2021
import org.flowable.common.engine.impl.persistence.entity.EntityManager;
2122

2223
/**
@@ -38,6 +39,8 @@ public interface PlanItemInstanceEntityManager extends EntityManager<PlanItemIns
3839

3940
List<PlanItemInstance> findByCriteria(PlanItemInstanceQuery planItemInstanceQuery);
4041

42+
List<PlanItemInstance> findWithVariablesByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery);
43+
4144
List<PlanItemInstanceEntity> findByCaseInstanceId(String caseInstanceId);
4245

4346
List<PlanItemInstanceEntity> findByStagePlanItemInstanceId(String stagePlanItemInstanceId);
@@ -55,4 +58,5 @@ public interface PlanItemInstanceEntityManager extends EntityManager<PlanItemIns
5558
void deleteByStageInstanceId(String stageInstanceId);
5659

5760
void deleteByCaseInstanceId(String caseInstanceId);
61+
5862
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/PlanItemInstanceEntityManagerImpl.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,12 @@ public long countByCriteria(PlanItemInstanceQuery planItemInstanceQuery) {
397397
public List<PlanItemInstance> findByCriteria(PlanItemInstanceQuery planItemInstanceQuery) {
398398
return dataManager.findByCriteria((PlanItemInstanceQueryImpl) planItemInstanceQuery);
399399
}
400-
400+
401+
@Override
402+
public List<PlanItemInstance> findWithVariablesByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery) {
403+
return dataManager.findWithVariablesByCriteria((PlanItemInstanceQueryImpl) planItemInstanceQuery);
404+
}
405+
401406
@Override
402407
public List<PlanItemInstanceEntity> findByCaseInstanceId(String caseInstanceId) {
403408
return dataManager.findByCaseInstanceId(caseInstanceId);

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/HistoricPlanItemInstanceDataManager.java

+2
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,6 @@ public interface HistoricPlanItemInstanceDataManager extends DataManager<Histori
3939
void bulkDeleteHistoricPlanItemInstancesForCaseInstanceIds(Collection<String> caseInstanceIds);
4040

4141
void deleteHistoricPlanItemInstancesForNonExistingCaseInstances();
42+
43+
List<HistoricPlanItemInstance> findWithVariablesByCriteria(HistoricPlanItemInstanceQueryImpl historicPlanItemInstanceQuery);
4244
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/PlanItemInstanceDataManager.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public interface PlanItemInstanceDataManager extends DataManager<PlanItemInstanc
3333
List<PlanItemInstanceEntity> findByStageInstanceIdAndPlanItemId(String stageInstanceId, String planItemId);
3434

3535
List<PlanItemInstance> findByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery);
36-
36+
37+
List<PlanItemInstance> findWithVariablesByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery);
38+
3739
long countByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery);
3840

3941
void deleteByCaseDefinitionId(String caseDefinitionId);

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisHistoricPlanItemInstanceDataManager.java

+8
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ public void deleteHistoricPlanItemInstancesForNonExistingCaseInstances() {
7676
getDbSqlSession().delete("bulkDeleteHistoricPlanItemInstancesForNonExistingCaseInstances", null, getManagedEntityClass());
7777
}
7878

79+
@Override
80+
@SuppressWarnings("unchecked")
81+
public List<HistoricPlanItemInstance> findWithVariablesByCriteria(HistoricPlanItemInstanceQueryImpl historicPlanItemInstanceQuery) {
82+
setSafeInValueLists(historicPlanItemInstanceQuery);
83+
return getDbSqlSession().selectList("selectHistoricPlanItemInstancesWithLocalVariablesByQueryCriteria", historicPlanItemInstanceQuery,
84+
getManagedEntityClass());
85+
}
86+
7987
@Override
8088
public Class<? extends HistoricPlanItemInstanceEntity> getManagedEntityClass() {
8189
return HistoricPlanItemInstanceEntityImpl.class;

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisPlanItemInstanceDataManagerImpl.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,14 @@ public List<PlanItemInstance> findByCriteria(PlanItemInstanceQueryImpl planItemI
119119
setSafeInValueLists(planItemInstanceQuery);
120120
return getDbSqlSession().selectList("selectPlanItemInstancesByQueryCriteria", planItemInstanceQuery, getManagedEntityClass());
121121
}
122-
122+
123+
@Override
124+
@SuppressWarnings("unchecked")
125+
public List<PlanItemInstance> findWithVariablesByCriteria(PlanItemInstanceQueryImpl planItemInstanceQuery) {
126+
setSafeInValueLists(planItemInstanceQuery);
127+
return getDbSqlSession().selectList("selectPlanItemInstancesWithLocalVariablesByQueryCriteria", planItemInstanceQuery, getManagedEntityClass());
128+
}
129+
123130
@Override
124131
public void deleteByCaseDefinitionId(String caseDefinitionId) {
125132
getDbSqlSession().delete("deletePlanItemInstanceByCaseDefinitionId", caseDefinitionId, getManagedEntityClass());

0 commit comments

Comments
 (0)