protected void addIdIfNotSatisfied(List<String> affectedSentries, CmmnSentryPart sentryPart) { if (!sentryPart.isSatisfied()) { // if it is not already satisfied, then set the // current case sentry part to satisfied (=true). String sentryId = sentryPart.getSentryId(); sentryPart.setSatisfied(true); // collect the id of affected sentry. if (!affectedSentries.contains(sentryId)) { affectedSentries.add(sentryId); } } }
public void fireIfOnlySentryParts() { // the following steps are a workaround, because setVariable() // does not check nor fire a sentry!!! Set<String> affectedSentries = new HashSet<String>(); List<CmmnSentryPart> sentryParts = collectSentryParts(getSentries()); for (CmmnSentryPart sentryPart : sentryParts) { if (isNotSatisfiedIfPartOnly(sentryPart)) { affectedSentries.add(sentryPart.getSentryId()); } } // Step 7: check each not affected sentry whether it is satisfied List<String> satisfiedSentries = getSatisfiedSentries(new ArrayList<String>(affectedSentries)); // Step 8: reset sentries -> satisfied == false resetSentries(satisfiedSentries); // Step 9: fire satisfied sentries fireSentries(satisfiedSentries); }
protected boolean isSentryPartsSatisfied( String sentryId, List<? extends CmmnSentryPart> sentryParts) { // if part will be evaluated in the end CmmnSentryPart ifPart = null; if (sentryParts != null && !sentryParts.isEmpty()) { for (CmmnSentryPart sentryPart : sentryParts) { if (PLAN_ITEM_ON_PART.equals(sentryPart.getType())) { if (!sentryPart.isSatisfied()) { return false; } } else if (VARIABLE_ON_PART.equals(sentryPart.getType())) { if (!sentryPart.isSatisfied()) { return false; } } else { /* IF_PART.equals(sentryPart.getType) == true */ ifPart = sentryPart; // once the ifPart has been satisfied the whole sentry is satisfied if (ifPart.isSatisfied()) { return true; } } } } if (ifPart != null) { CmmnExecution execution = ifPart.getCaseExecution(); ensureNotNull("Case execution of sentry '" + ifPart.getSentryId() + "': is null", execution); CmmnActivity activity = ifPart.getCaseExecution().getActivity(); ensureNotNull("Case execution '" + id + "': has no current activity", "activity", activity); CmmnSentryDeclaration sentryDeclaration = activity.getSentry(sentryId); ensureNotNull( "Case execution '" + id + "': has no declaration for sentry '" + sentryId + "'", "sentryDeclaration", sentryDeclaration); CmmnIfPartDeclaration ifPartDeclaration = sentryDeclaration.getIfPart(); ensureNotNull( "Sentry declaration '" + sentryId + "' has no definied ifPart, but there should be one defined for case execution '" + id + "'.", "ifPartDeclaration", ifPartDeclaration); Expression condition = ifPartDeclaration.getCondition(); ensureNotNull( "A condition was expected for ifPart of Sentry declaration '" + sentryId + "' for case execution '" + id + "'.", "condition", condition); Object result = condition.getValue(this); ensureInstanceOf("condition expression returns non-Boolean", "result", result, Boolean.class); Boolean booleanResult = (Boolean) result; ifPart.setSatisfied(booleanResult); return booleanResult; } // if all onParts are satisfied and there is no // ifPart then the whole sentry is satisfied. return true; }
protected boolean isNotSatisfiedIfPartOnly(CmmnSentryPart sentryPart) { return IF_PART.equals(sentryPart.getType()) && getSentries().get(sentryPart.getSentryId()).size() == 1 && !sentryPart.isSatisfied(); }