private boolean limitReached(AccessCertificationCampaignType campaign, Integer limit) { return limit != null && norm(campaign.getIteration()) >= limit; }
@NotNull public static AccessCertificationStageType findStage(AccessCertificationCampaignType campaign, int stageNumber) { for (AccessCertificationStageType stage : campaign.getStage()) { if (stage.getNumber() == stageNumber && norm(stage.getIteration()) == norm(campaign.getIteration())) { return stage; } } throw new IllegalStateException("No stage " + stageNumber + " (iteration " + norm(campaign.getIteration()) + " in " + ObjectTypeUtil.toShortString(campaign)); }
public static float getWorkItemsCompletedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getWorkItemsCompletedPercentage(campaign.getCase(), null, norm(campaign.getIteration())); }
public static float getCasesCompletedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getCasesCompletedPercentage(campaign.getCase(), null, norm(campaign.getIteration())); }
public static float getCasesDecidedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getCasesDecidedPercentage(campaign.getCase(), null, norm(campaign.getIteration()), null); }
public String formatState(AccessCertificationEvent event) { AccessCertificationCampaignType campaign = event.getCampaign(); String i = norm(campaign.getIteration()) > 1 ? " (iteration " + norm(campaign.getIteration()) + ")" : ""; switch(campaign.getState()) { case CREATED: return "Created" + i; case IN_REVIEW_STAGE: return "In review stage " + formatStage(campaign) + i; case REVIEW_STAGE_DONE: return "Done review stage " + formatStage(campaign) + i; case IN_REMEDIATION: return "Remediation in progress" + i; case CLOSED: return "Closed + i"; default: return "" + i; // should not occur } }
protected void assertIteration(AccessCertificationCampaignType campaign, int iteration) { assertEquals("Unexpected campaign iteration", iteration, norm(campaign.getIteration())); }
public static float getCasesDecidedPercentageCurrStageCurrIteration(AccessCertificationCampaignType campaign) { return getCasesDecidedPercentage(campaign.getCase(), campaign.getStageNumber(), norm(campaign.getIteration()), campaign.getState()); }
public static AccessCertificationStageType getCurrentStage(AccessCertificationCampaignType campaign) { for (AccessCertificationStageType stage : campaign.getStage()) { if (stage.getNumber() == campaign.getStageNumber() && norm(stage.getIteration()) == norm(campaign.getIteration())) { return stage; } } return null; }
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())); }
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); } } } }
public static boolean isReiterable(AccessCertificationCampaignType campaign) { return campaign.getState() == AccessCertificationCampaignStateType.CLOSED && (campaign.getReiterationDefinition() == null || campaign.getReiterationDefinition().getLimit() == null || norm(campaign.getIteration()) < campaign.getReiterationDefinition().getLimit()); } }
@SuppressWarnings("unused") public List<PrismContainerValue<AccessCertificationWorkItemType>> getCertificationCampaignNonResponders(String campaignName, Integer stageNumber) throws SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException { List<AccessCertificationWorkItemType> workItems = new ArrayList<>(); AccessCertificationCampaignType campaign = getCampaignByName(campaignName); if (campaign != null) { List<AccessCertificationCaseType> cases = getCertificationCampaignNotRespondedCasesAsBeans(campaignName); for (AccessCertificationCaseType aCase : cases) { for (AccessCertificationWorkItemType workItem : aCase.getWorkItem()) { if (norm(workItem.getIteration()) == norm(campaign.getIteration()) && (workItem.getOutput() == null || workItem.getOutput().getOutcome() == null) && (stageNumber == null || Objects.equals(workItem.getStageNumber(), stageNumber))) { workItems.add(workItem); } } } } else { LOGGER.debug("No campaign named '{}' was found", campaignName); } return PrismContainerValue.toPcvList(workItems); }
@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; }
private void checkCaseOutcomesSanity(AccessCertificationCaseType aCase, AccessCertificationCampaignType campaign, int stageNumber) { assertEquals("Wrong # of completed stage outcomes", stageNumber, CertCampaignTypeUtil.getCompletedStageEvents(aCase, norm(campaign.getIteration())).size()); AccessCertificationResponseType expectedOverall = computationHelper.computeOverallOutcome(aCase, campaign); assertEquals("Inconsistent overall outcome", OutcomeUtils.toUri(expectedOverall), aCase.getOutcome()); }
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; } } }
private AccessCertificationStageType createStage(AccessCertificationCampaignType campaign, int requestedStageNumber) { AccessCertificationStageType stage = new AccessCertificationStageType(prismContext); stage.setIteration(norm(campaign.getIteration())); stage.setNumber(requestedStageNumber); stage.setStartTimestamp(clock.currentTimeXMLGregorianCalendar()); AccessCertificationStageDefinitionType stageDef = CertCampaignTypeUtil.findStageDefinition(campaign, stage.getNumber()); XMLGregorianCalendar deadline = computeDeadline(stage.getStartTimestamp(), stageDef.getDuration(), stageDef.getDeadlineRounding()); stage.setDeadline(deadline); stage.setName(stageDef.getName()); stage.setDescription(stageDef.getDescription()); return stage; }
private void afterStageOpen(String campaignOid, AccessCertificationStageType newStage, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException { // notifications final AccessCertificationCampaignType campaign = generalHelper.getCampaign(campaignOid, null, task, result); if (campaign.getStageNumber() == 1) { eventHelper.onCampaignStart(campaign, task, result); } eventHelper.onCampaignStageStart(campaign, task, result); updateHelper.notifyReviewers(campaign, false, task, result); if (newStage.getNumber() == 1 && norm(campaign.getIteration()) == 1 && campaign.getDefinitionRef() != null) { List<ItemDelta<?,?>> deltas = prismContext.deltaFor(AccessCertificationDefinitionType.class) .item(F_LAST_CAMPAIGN_STARTED_TIMESTAMP).replace(clock.currentTimeXMLGregorianCalendar()) .asItemDeltas(); updateHelper.modifyObjectPreAuthorized(AccessCertificationDefinitionType.class, campaign.getDefinitionRef().getOid(), deltas, task, result); } }
public static void copyFromJAXB(AccessCertificationCampaignType jaxb, RAccessCertificationCampaign repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { copyAssignmentHolderInformationFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); repo.setDefinitionRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getDefinitionRef(), repositoryContext.relationRegistry)); List<AccessCertificationCaseType> cases = jaxb.getCase(); if (!cases.isEmpty()) { for (AccessCertificationCaseType case1 : cases) { RAccessCertificationCase rCase = RAccessCertificationCase.toRepo(repo, case1, repositoryContext); rCase.setTransient(generatorResult.isTransient(case1.asPrismContainerValue())); // redundant? repo.getCase().add(rCase); } } repo.setOwnerRefCampaign(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.relationRegistry)); repo.setHandlerUri(jaxb.getHandlerUri()); repo.setStart(jaxb.getStartTimestamp()); repo.setEnd(jaxb.getEndTimestamp()); repo.setState(RUtil.getRepoEnumValue(jaxb.getState(), RAccessCertificationCampaignState.class)); repo.setIteration(norm(jaxb.getIteration())); repo.setStageNumber(jaxb.getStageNumber()); } }