public static void writeSentry(Sentry sentry, XMLStreamWriter xtw) throws Exception { xtw.writeAttribute(ATTRIBUTE_ID, sentry.getId()); if (StringUtils.isNotEmpty(sentry.getName())) { xtw.writeAttribute(ATTRIBUTE_NAME, sentry.getName()); if (StringUtils.isNotEmpty(sentry.getTriggerMode()) && !Sentry.TRIGGER_MODE_DEFAULT.equals(sentry.getTriggerMode())) { // default is not exported. If missing, default is assumed xtw.writeAttribute(FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_TRIGGER_MODE, sentry.getTriggerMode()); for (SentryOnPart sentryOnPart : sentry.getOnParts()) { if (sentry.getSentryIfPart() != null) { xtw.writeStartElement(ELEMENT_IF_PART); xtw.writeStartElement(ELEMENT_CONDITION); xtw.writeCData(sentry.getSentryIfPart().getCondition()); xtw.writeEndElement(); xtw.writeEndElement();
@Override protected CmmnElement convert(XMLStreamReader xtr, ConversionHelper conversionHelper) { Sentry sentry = new Sentry(); sentry.setName(xtr.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_NAME)); sentry.setTriggerMode(xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_TRIGGER_MODE)); conversionHelper.addSentryToCurrentPlanFragment(sentry); return sentry; }
public void addSentryOnPartToCurrentSentry(SentryOnPart sentryOnPart) { addSentryOnPart(sentryOnPart); getCurrentSentry().addSentryOnPart(sentryOnPart); setCurrentSentryOnPart(sentryOnPart); }
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(); boolean isDefaultTriggerMode = sentry.isDefaultTriggerMode(); satisfiedSentryOnPartIds.add(sentryPartInstanceEntity.getOnPartId()); } else if (sentryPartInstanceEntity.getIfPartId() != null && sentryPartInstanceEntity.getIfPartId().equals(sentry.getSentryIfPart().getId())) { sentryIfPartSatisfied = true; for (SentryOnPart sentryOnPart : sentry.getOnParts()) { if (!satisfiedSentryOnPartIds.contains(sentryOnPart.getId())) { if (planItemLifeCycleEvent != null && sentryOnPartMatchesCurrentLifeCycleEvent(sentryOnPart)) { boolean allOnPartsSatisfied = (satisfiedSentryOnPartIds.size() == sentry.getOnParts().size()); if (sentry.getSentryIfPart() != null && !sentryIfPartSatisfied && (isDefaultTriggerMode || (sentry.isOnEventTriggerMode() && allOnPartsSatisfied) )) { createSentryPartInstanceEntity(entityWithSentryPartInstances, sentry, null, sentry.getSentryIfPart()); sentryIfPartSatisfied = true;
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 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; }
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()); } } }
protected boolean evaluateSentryIfPart(Sentry sentry, VariableContainer variableContainer) { Expression conditionExpression = CommandContextUtil.getExpressionManager(commandContext).createExpression(sentry.getSentryIfPart().getCondition()); Object result = conditionExpression.getValue(variableContainer); if (result instanceof Boolean) { return (Boolean) result; } return false; }
sentryOnPart.setStandardEvent(timerEventListener.getTimerStartTriggerStandardEvent()); Sentry sentry = new Sentry(); sentry.addSentryOnPart(sentryOnPart);
if (sentry.isDefaultTriggerMode() && entityWithSentryPartInstances instanceof CountingPlanItemInstanceEntity) { CountingPlanItemInstanceEntity countingPlanItemInstanceEntity = (CountingPlanItemInstanceEntity) planItemInstanceEntity; countingPlanItemInstanceEntity.setSentryPartInstanceCount(countingPlanItemInstanceEntity.getSentryPartInstanceCount() + 1); if (sentry.isDefaultTriggerMode()) { sentryPartInstanceEntityManager.insert(sentryPartInstanceEntity);
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 (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());