private boolean limitReached(AccessCertificationCampaignType campaign, Integer limit) { return limit != null && norm(campaign.getIteration()) >= limit; }
public static int getCurrentStageEscalationLevelNumberSafe(@NotNull AccessCertificationCampaignType campaign) { AccessCertificationStageType currentStage = getCurrentStage(campaign); return currentStage != null ? getEscalationLevelNumber(currentStage) : 0; }
public static AccessCertificationStageType findCurrentStage(AccessCertificationCampaignType campaign) { return findStage(campaign, campaign.getStageNumber()); }
@SuppressWarnings("BooleanMethodIsAlwaysInverted") private static boolean caseMatches(AccessCertificationCaseType aCase, Integer stage, Integer iteration) { if (iteration != null && iteration != norm(aCase.getIteration())) { return false; } return stage == null || stage == aCase.getStageNumber() || !CertCampaignTypeUtil.getCompletedStageEvents(aCase, stage, iteration).isEmpty(); }
public static float getWorkItemsCompletedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getWorkItemsCompletedPercentage(campaign.getCase(), null, norm(campaign.getIteration())); }
CertCampaignTypeUtil.createWorkItemsForCampaignQuery(campaignOid, prismContext), null, false, null, result); int newStageEscalationLevelNumber = CertCampaignTypeUtil.getCurrentStageEscalationLevelNumber(campaign) + 1; WorkItemEscalationLevelType newEscalationLevel = new WorkItemEscalationLevelType() .number(newStageEscalationLevelNumber) .displayName(escalateAction.getEscalationLevelDisplayName()); for (AccessCertificationWorkItemType workItem : workItems) { AccessCertificationCaseType aCase = CertCampaignTypeUtil.getCaseChecked(workItem); AccessCertificationCampaignType workItemCampaign = CertCampaignTypeUtil.getCampaignChecked(aCase); if (!java.util.Objects.equals(workItemCampaign.getOid(), campaignOid)) { throw new IllegalArgumentException("Work item to delegate does not belong to specified campaign (" + campaignOid + ") but to " + workItemCampaign); if (norm(workItem.getIteration()) != norm(workItemCampaign.getIteration())) { throw new IllegalStateException("Couldn't delegate a work item that is not in a current iteration. Current stage: " + norm(workItemCampaign.getIteration()) + ", work item iteration: " + norm(workItem.getIteration())); event.setEscalationLevel(workItem.getEscalationLevel()); event.setStageNumber(campaign.getStageNumber()); event.setIteration(norm(campaign.getIteration())); List<ItemDelta<?, ?>> deltas = new ArrayList<>(); addDeltasForNewAssigneesAndEvent(deltas, workItem, aCase, newAssignees, event); AccessCertificationStageType stage = CertCampaignTypeUtil.getCurrentStage(campaign); assert stage != null; Long stageId = stage.asPrismContainerValue().getId(); .item(F_STAGE, stageId, AccessCertificationStageType.F_ESCALATION_LEVEL).replace(newEscalationLevel) .asItemDelta());
@NotNull AccessCertificationResponseType computeOutcomeForStage(AccessCertificationCaseType aCase, AccessCertificationCampaignType campaign, int stageNumber) { AccessCertificationStageDefinitionType stageDef = CertCampaignTypeUtil.findStageDefinition(campaign, stageNumber); List<AccessCertificationResponseType> allResponses = getResponses(aCase, stageNumber, norm(campaign.getIteration())); AccessCertificationResponseType outcome; String base; if (allResponses.isEmpty()) { outcome = stageDef.getOutcomeIfNoReviewers(); base = "<no reviewers available>"; } else { AccessCertificationCaseOutcomeStrategyType outcomeStrategy = defaultIfNull(stageDef.getOutcomeStrategy(), DEFAULT_CASE_STAGE_OUTCOME_STRATEGY); OutcomeStrategy strategyImpl = getOutcomeStrategy(outcomeStrategy); ResponsesSummary summary = summarize(allResponses); // TODO eventually merge extraction and summarizing outcome = strategyImpl.computeOutcome(summary); base = allResponses.toString(); } AccessCertificationResponseType rv = normalizeToNonNull(outcome); LOGGER.trace("computeOutcomeForStage for case {} (stageNumber: {}) returned {} based on {}", aCase.getId(), stageNumber, rv, base); return rv; }
void openNextStage(AccessCertificationCampaignType campaign, CertificationHandler handler, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException { boolean skipEmptyStages = norm(campaign.getIteration()) > 1; // TODO make configurable int requestedStageNumber = campaign.getStageNumber() + 1; for (;;) { OpeningContext openingContext = new OpeningContext(); AccessCertificationStageType stage = createStage(campaign, requestedStageNumber); ModificationsToExecute modifications = getDeltasForStageOpen(campaign, stage, handler, openingContext, task, result); if (!skipEmptyStages || openingContext.casesEnteringStage > 0) { updateHelper.modifyCampaignPreAuthorized(campaign.getOid(), modifications, task, result); afterStageOpen(campaign.getOid(), stage, task, result); // notifications, bookkeeping, ... return; } LOGGER.debug("No work items created, skipping to the next stage"); requestedStageNumber++; if (requestedStageNumber > CertCampaignTypeUtil.getNumberOfStages(campaign)) { result.recordWarning("No more (non-empty) stages available"); return; } } }
List<ItemDelta<?, ?>> deltas = new ArrayList<>(); for (AccessCertificationWorkItemType workItem : workItems) { AccessCertificationCaseType aCase = CertCampaignTypeUtil.getCaseChecked(workItem); AccessCertificationCampaignType campaign = CertCampaignTypeUtil.getCampaignChecked(aCase); if (!java.util.Objects.equals(campaign.getOid(), campaignOid)) { throw new IllegalArgumentException("Work item to delegate does not belong to specified campaign (" + campaignOid + ") but to " + campaign); if (norm(workItem.getIteration()) != norm(campaign.getIteration())) { throw new IllegalStateException("Couldn't delegate a work item that is not in a current iteration. Current iteration: " + norm(campaign.getIteration()) + ", work item iteration: " + norm(workItem.getIteration())); event.setEscalationLevel(workItem.getEscalationLevel()); event.setStageNumber(campaign.getStageNumber()); event.setIteration(norm(campaign.getIteration())); addDeltasForNewAssigneesAndEvent(deltas, workItem, aCase, newAssignees, event);
protected void assertSanityAfterStageClose(AccessCertificationCampaignType campaign, AccessCertificationDefinitionType definition, int stageNumber, int iteration, int expectedStages) { assertStateStageIteration(campaign, REVIEW_STAGE_DONE, stageNumber, iteration); assertDefinitionAndOwner(campaign, definition); assertNull("Unexpected end time", campaign.getEndTimestamp()); assertEquals("wrong # of stages", expectedStages, campaign.getStage().size()); AccessCertificationStageType stage = CertCampaignTypeUtil.getCurrentStage(campaign); assertNotNull(stage); assertEquals("wrong stage #", stageNumber, stage.getNumber()); assertEquals("wrong stage iteration #", iteration, norm(stage.getIteration())); assertApproximateTime("stage start", new Date(), stage.getStartTimestamp()); assertApproximateTime("stage end", new Date(), stage.getStartTimestamp()); for (AccessCertificationCaseType aCase : campaign.getCase()) { if (aCase.getStageNumber() != stageNumber || norm(aCase.getIteration()) != iteration) { continue; } checkCaseOutcomesSanity(aCase, campaign, stageNumber); } }
public static float getWorkItemsCompletedPercentageCurrStageCurrIteration(AccessCertificationCampaignType campaign) { return getWorkItemsCompletedPercentage(campaign.getCase(), accountForClosingStates(campaign.getStageNumber(), campaign.getState()), norm(campaign.getIteration())); }
public static float getCasesCompletedPercentageCurrStageCurrIteration(AccessCertificationCampaignType campaign) { return getCasesCompletedPercentage(campaign.getCase(), accountForClosingStates(campaign.getStageNumber(), campaign.getState()), norm(campaign.getIteration())); }
public static float getCasesDecidedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getCasesDecidedPercentage(campaign.getCase(), null, norm(campaign.getIteration()), null); }
void notifyReviewers(AccessCertificationCampaignType campaign, boolean unansweredOnly, Task task, OperationResult result) throws SchemaException { List<AccessCertificationCaseType> caseList = queryHelper.getAllCurrentIterationCases(campaign.getOid(), norm(campaign.getIteration()), null, result); Collection<String> reviewers = CertCampaignTypeUtil.getActiveReviewers(caseList); for (String reviewerOid : reviewers) { List<AccessCertificationCaseType> cases = queryHelper.getOpenCasesForReviewer(campaign, reviewerOid, result); boolean notify = !unansweredOnly || cases.stream() .flatMap(c -> c.getWorkItem().stream()) .anyMatch(wi -> ObjectTypeUtil.containsOid(wi.getAssigneeRef(), reviewerOid) && (wi.getOutput() == null || wi.getOutput().getOutcome() == null)); if (notify) { ObjectReferenceType actualReviewerRef = ObjectTypeUtil.createObjectRef(reviewerOid, ObjectTypes.USER); for (ObjectReferenceType reviewerOrDeputyRef : getReviewerAndDeputies(actualReviewerRef, task, result)) { eventHelper.onReviewRequested(reviewerOrDeputyRef, actualReviewerRef, cases, campaign, task, result); } } } }
protected AccessCertificationWorkItemType findWorkItem(Collection<AccessCertificationWorkItemType> workItems, String subjectOid, String targetOid, int iteration) { for (AccessCertificationWorkItemType workItem : workItems) { AccessCertificationCaseType aCase = CertCampaignTypeUtil.getCase(workItem); if (aCase != null && aCase.getTargetRef() != null && aCase.getTargetRef().getOid().equals(targetOid) && aCase.getObjectRef() != null && aCase.getObjectRef().getOid().equals(subjectOid) && norm(workItem.getIteration()) == iteration) { return workItem; } } return null; }
public static float getCasesCompletedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getCasesCompletedPercentage(campaign.getCase(), null, norm(campaign.getIteration())); }
display("CEO case after escalation", ceoCase); AccessCertificationWorkItemType workItem = CertCampaignTypeUtil.findWorkItem(ceoCase, 1, 1, USER_ADMINISTRATOR_OID); assertObjectRefs("assignees", false, workItem.getAssigneeRef(), USER_JACK_OID, USER_ADMINISTRATOR_OID); assertEquals("Wrong originalAssignee OID", USER_ADMINISTRATOR_OID, workItem.getOriginalAssigneeRef().getOid()); AccessCertificationWorkItemType superuserWorkItem = CertCampaignTypeUtil.findWorkItem(superuserCase, 1, 1, USER_ADMINISTRATOR_OID); assertPercentCompleteAll(campaign, Math.round(100.0f/7.0f), Math.round(100.0f/7.0f), Math.round(100.0f/7.0f)); // 1 reviewer per case (always administrator) AccessCertificationStageType currentStage = CertCampaignTypeUtil.getCurrentStage(campaign); assertNotNull(currentStage); assertEquals("Wrong new stage escalation level", NEW_ESCALATION_LEVEL, currentStage.getEscalationLevel());
if (!CertCampaignTypeUtil.isRemediationAutomatic(campaign)) { LOGGER.error("Automatic remediation is not configured."); opResult.recordFatalError("Automatic remediation is not configured."); int revokedError = 0; List<AccessCertificationCaseType> caseList = queryHelper.getAllCurrentIterationCases(campaignOid, norm(campaign.getIteration()), null, opResult); for (AccessCertificationCaseType _case : caseList) { if (OutcomeUtils.isRevoke(_case, campaign)) {
@Nullable public static String getEscalationLevelInfo(AccessCertificationCampaignType campaign) { if (campaign == null) { return null; } AccessCertificationStageType stage = getCurrentStage(campaign); return stage != null ? WfContextUtil.getEscalationLevelInfo(stage.getEscalationLevel()) : null; }
public String getStageShortName(AccessCertificationCampaignType campaign) { if (campaign.getState() == AccessCertificationCampaignStateType.IN_REMEDIATION) { return "remediation stage"; } else { return "stage " + campaign.getStageNumber() + "/" + CertCampaignTypeUtil.getNumberOfStages(campaign); } }