protected static List<PlanItem> getSourcePlanItems(List<Criterion> criteria) { List<PlanItem> planItems = new ArrayList<>(); if (!criteria.isEmpty()) { for (Criterion entryCriterion : criteria) { Sentry sentry = entryCriterion.getSentry(); if (sentry.getOnParts() != null && !sentry.getOnParts().isEmpty()) { for (SentryOnPart sentryOnPart : sentry.getOnParts()) { planItems.add(sentryOnPart.getSource()); } } } } return planItems; }
public static boolean criterionHasOnPartDependingOnPlanItem(Criterion criterion, PlanItem planItem, String event) { Sentry sentry = criterion.getSentry(); if (sentry != null) { for (SentryOnPart sentryOnPart : sentry.getOnParts()) { if (sentryOnPart.getSource().getId().equals(planItem.getId()) && sentryOnPart.getStandardEvent().equals(event)) { return true; } } } return false; }
for (SentryOnPart sentryOnPart : sentry.getOnParts()) {
if (sentry.getOnParts().size() == 1 && sentry.getSentryIfPart() == null) { // Only one one part and no if part: no need to fetch the previously satisfied onparts if (planItemLifeCycleEvent != null) { SentryOnPart sentryOnPart = sentry.getOnParts().get(0); if (sentryOnPartMatchesCurrentLifeCycleEvent(sentryOnPart)) { return criterion.getId(); } else if (sentry.getOnParts().isEmpty() && sentry.getSentryIfPart() != null) { // Only an if part: simply evaluate the if part if (evaluateSentryIfPart(sentry, entityWithSentryPartInstances)) { return criterion.getId(); for (SentryOnPart sentryOnPart : sentry.getOnParts()) { if (!satisfiedSentryOnPartIds.contains(sentryOnPart.getId())) { if (planItemLifeCycleEvent != null && sentryOnPartMatchesCurrentLifeCycleEvent(sentryOnPart)) { boolean allOnPartsSatisfied = (satisfiedSentryOnPartIds.size() == sentry.getOnParts().size());
protected String evaluateDependentPlanItemEntryCriteria(PlanItem entryDependentPlanItem) { List<Criterion> entryCriteria = entryDependentPlanItem.getEntryCriteria(); if (!entryCriteria.isEmpty()) { for (Criterion criterion : entryCriteria) { // According to the spec, only the sentries that actually reference the planitem of which the event happens should be evaluated if (CriterionUtil.criterionHasOnPartDependingOnPlanItem(criterion, planItemLifeCycleEvent.getPlanItem(), planItemLifeCycleEvent.getTransition())) { boolean criterionSatisfied = true; List<SentryOnPart> onParts = criterion.getSentry().getOnParts(); for (SentryOnPart onPart : onParts) { if (!sentryOnPartMatchesCurrentLifeCycleEvent(onPart)) { criterionSatisfied = false; } } if (criterion.getSentry().getSentryIfPart() != null) { if (!evaluateSentryIfPart(criterion.getSentry(), caseInstanceEntity)) { // Resolved against case entity as there's no plan item instance yet criterionSatisfied = false; } } if (criterionSatisfied) { return criterion.getId(); } } } } return null; }
protected void processSentries(Stage planModelStage, PlanFragment planFragment) { for (Sentry sentry : planFragment.getSentries()) { for (SentryOnPart onPart : sentry.getOnParts()) { PlanItem planItem = planModelStage.findPlanItemInPlanFragmentOrDownwards(onPart.getSourceRef()); if (planItem != null) { onPart.setSource(planItem); } else { throw new FlowableException("Could not resolve on part source reference " + onPart.getSourceRef() + " of sentry " + sentry.getId()); } } } for (PlanItem planItem : planFragment.getPlanItems()) { if (planItem.getPlanItemDefinition() instanceof PlanFragment) { processSentries(planModelStage, (PlanFragment) planItem.getPlanItemDefinition()); } } }
for (Criterion criterion : planItem.getEntryCriteria()) { Sentry sentry = criterion.getSentry(); if (sentry.getOnParts().size() > 0) { SentryOnPart sentryOnPart = sentry.getOnParts().get(0); if (planItemSourceRef.equals(sentryOnPart.getSourceRef())) { association.setTransitionEvent(sentryOnPart.getStandardEvent());