public static float getCasesDecidedPercentageCurrStageCurrIteration(AccessCertificationCampaignType campaign) { return getCasesDecidedPercentage(campaign.getCase(), campaign.getStageNumber(), norm(campaign.getIteration()), campaign.getState()); }
private AccessCertificationCampaignType createCampaignObject(AccessCertificationDefinitionType definition, Task task, OperationResult result) throws SchemaException, SecurityViolationException { AccessCertificationCampaignType newCampaign = new AccessCertificationCampaignType(prismContext); newCampaign.setName(generateCampaignName(definition, task, result)); } else { throw new SchemaException("Couldn't create a campaign without name"); newCampaign.setDescription(definition.getDescription()); newCampaign.setOwnerRef(securityContextManager.getPrincipal().toObjectReference()); newCampaign.setTenantRef(definition.getTenantRef()); newCampaign.setDefinitionRef(ObjectTypeUtil.createObjectRef(definition, prismContext)); newCampaign.setHandlerUri(definition.getHandlerUri()); } else { throw new SchemaException("Couldn't create a campaign without handlerUri"); newCampaign.setScopeDefinition(definition.getScopeDefinition()); newCampaign.setRemediationDefinition(definition.getRemediationDefinition()); newCampaign.setReiterationDefinition(definition.getReiterationDefinition()); newCampaign.getStageDefinition().addAll(CloneUtil.cloneCollectionMembers(definition.getStageDefinition())); CertCampaignTypeUtil.checkStageDefinitionConsistency(newCampaign.getStageDefinition()); newCampaign.setReviewStrategy(definition.getReviewStrategy()); newCampaign.setStartTimestamp(null); newCampaign.setEndTimestamp(null); newCampaign.setState(CREATED);
public static AccessCertificationDefinitionType getDefinition(AccessCertificationCampaignType campaign) { if (campaign.getDefinitionRef() == null) { throw new IllegalStateException("No definition reference in " + ObjectTypeUtil.toShortString(campaign)); } PrismReferenceValue referenceValue = campaign.getDefinitionRef().asReferenceValue(); if (referenceValue.getObject() == null) { throw new IllegalStateException("No definition object in " + ObjectTypeUtil.toShortString(campaign)); } return (AccessCertificationDefinitionType) (referenceValue.getObject().asObjectable()); }
public AccessCertificationCampaignType clone() { AccessCertificationCampaignType object = new AccessCertificationCampaignType(); PrismObject value = asPrismObject().clone(); object.setupContainer(value); return object; }
public AccessCertificationStageDefinitionType getCurrentStageDefinition() { if (campaign.getState() != IN_REVIEW_STAGE && campaign.getState() != REVIEW_STAGE_DONE) { return null; } return CertCampaignTypeUtil.findStageDefinition(campaign, campaign.getStageNumber()); }
public static float getCasesDecidedPercentageCurrStageAllIterations(AccessCertificationCampaignType campaign) { return getCasesDecidedPercentage(campaign.getCase(), campaign.getStageNumber(), null, campaign.getState()); }
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()); } }
assertTrue("wrong campaign state: " + campaign.getState(), campaign.getState() == CLOSED || campaign.getState() == IN_REMEDIATION); .item(TaskType.F_OBJECT_REF).ref(campaign.getOid()) .build(); List<PrismObject<TaskType>> tasks = taskManager.searchObjects(TaskType.class, query, null, result); assertEquals("wrong campaign state", CLOSED, campaign.getState()); assertEquals("wrong campaign stage", 2, campaign.getStageNumber()); assertDefinitionAndOwner(campaign, certificationDefinition, USER_BOB_OID); assertApproximateTime("end time", new Date(), campaign.getEndTimestamp()); assertEquals("wrong # of stages", 1, campaign.getStage().size()); assertApproximateTime("stage 1 end", new Date(), campaign.getStage().get(0).getEndTimestamp());
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; } } }
LOGGER.info("Automatically closing current stage of {}", ObjectTypeUtil.toShortString(campaign)); if (campaign.getState() != IN_REVIEW_STAGE) { LOGGER.warn("Campaign {} is not in a review stage; this 'close stage' trigger will be ignored.", ObjectTypeUtil.toShortString(campaign)); return; int currentStageNumber = campaign.getStageNumber(); certificationManager.closeCurrentStage(campaign.getOid(), task, result); if (currentStageNumber < CertCampaignTypeUtil.getNumberOfStages(campaign)) { LOGGER.info("Automatically opening next stage of {}", ObjectTypeUtil.toShortString(campaign)); certificationManager.openNextStage(campaign.getOid(), task, result); } else { LOGGER.info("Automatically starting remediation for {}", ObjectTypeUtil.toShortString(campaign)); certificationManager.startRemediation(campaign.getOid(), task, result);
AuthorizationParameters.Builder.buildObject(campaign.asPrismObject()), null, task, result); final int currentStageNumber = campaign.getStageNumber(); final int stages = CertCampaignTypeUtil.getNumberOfStages(campaign); final AccessCertificationCampaignStateType state = campaign.getState(); LOGGER.trace("openNextStage: iteration={}, currentStageNumber={}, stages={}, state={}", norm(campaign.getIteration()), currentStageNumber, stages, state); if (IN_REVIEW_STAGE.equals(state)) { result.recordFatalError("Couldn't advance to the next review stage as the stage " + currentStageNumber + " is currently open.");
AuthorizationParameters.Builder.buildObject(campaign.asPrismObject()), null, task, result); final int currentStageNumber = campaign.getStageNumber(); final int stages = CertCampaignTypeUtil.getNumberOfStages(campaign); final AccessCertificationCampaignStateType state = campaign.getState(); LOGGER.trace("closeCurrentStage: currentStageNumber={}, stages={}, state={}", currentStageNumber, stages, state);
void reiterateCampaign(AccessCertificationCampaignType campaign, Task task, OperationResult result) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { LOGGER.info("Reiterating campaign {}", ObjectTypeUtil.toShortString(campaign)); if (campaign.getState() != CLOSED) { throw new IllegalStateException("Campaign is not in CLOSED state"); } if (campaign.getReiterationDefinition() != null && campaign.getReiterationDefinition().getLimit() != null && norm(campaign.getIteration()) >= campaign.getReiterationDefinition().getLimit()) { throw new IllegalStateException("Campaign cannot be reiterated: maximum number of iterations (" + campaign.getReiterationDefinition().getLimit() + ") was reached."); } ModificationsToExecute modifications = new ModificationsToExecute(); modifications.add(updateHelper.createStageNumberDelta(0)); modifications.add(updateHelper.createStateDelta(CREATED)); modifications.add(updateHelper.createTriggerDeleteDelta()); modifications.add(updateHelper.createStartTimeDelta(null)); modifications.add(updateHelper.createEndTimeDelta(null)); int newIteration = norm(campaign.getIteration()) + 1; modifications.add(prismContext.deltaFor(AccessCertificationCampaignType.class) .item(AccessCertificationCampaignType.F_ITERATION).replace(newIteration) .asItemDelta()); createCasesReiterationDeltas(campaign, newIteration, modifications, result); updateHelper.modifyCampaignPreAuthorized(campaign.getOid(), modifications, 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()); } }
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); } }
if (campaign.getState() != AccessCertificationCampaignStateType.IN_REVIEW_STAGE) { LOGGER.warn("Campaign is not in review stage; exiting"); return; List<AccessCertificationCaseType> caseList = queryHelper.getAllCurrentIterationCases(campaign.getOid(), norm(campaign.getIteration()), null, result); Collection<String> reviewers = CertCampaignTypeUtil.getActiveReviewers(caseList); for (String reviewerOid : reviewers) {
protected void assertSanityAfterCampaignStart(AccessCertificationCampaignType campaign, AccessCertificationDefinitionType definition, int cases, int iteration, int expectedStages, Date expectedStartTime) throws ConfigurationException, ObjectNotFoundException, SchemaException, CommunicationException, SecurityViolationException, ExpressionEvaluationException { assertStateStageIteration(campaign, IN_REVIEW_STAGE, 1, iteration); assertDefinitionAndOwner(campaign, definition); assertApproximateTime("start time", expectedStartTime, campaign.getStartTimestamp()); assertNull("Unexpected end time", campaign.getEndTimestamp()); assertEquals("wrong # of defined stages", definition.getStageDefinition().size(), campaign.getStageDefinition().size()); assertEquals("wrong # of stages", expectedStages, campaign.getStage().size()); AccessCertificationStageType stage = campaign.getStage().stream().filter(s -> norm(s.getIteration()) == iteration && s.getNumber() == 1).findFirst().orElse(null); assertNotNull("No stage #1 for current iteration", stage); assertEquals("wrong stage #", 1, stage.getNumber()); assertApproximateTime("stage 1 start", expectedStartTime, stage.getStartTimestamp()); assertNotNull("stage 1 deadline", stage.getDeadline()); // too lazy to compute exact datetime assertNull("unexpected stage 1 end", stage.getEndTimestamp()); assertEquals("Wrong number of certification cases", cases, campaign.getCase().size()); PrismObject<AccessCertificationDefinitionType> def = getObjectViaRepo(AccessCertificationDefinitionType.class, definition.getOid()); if (iteration == 1) { assertApproximateTime("last campaign started", expectedStartTime, def.asObjectable().getLastCampaignStartedTimestamp()); assertNull("unexpected last campaign closed", def.asObjectable().getLastCampaignClosedTimestamp()); } else { assertNotNull("last campaign closed", def.asObjectable().getLastCampaignClosedTimestamp()); } assertCasesCount(campaign.getOid(), cases); }
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 getWorkItemsCompletedPercentageAllStagesCurrIteration(AccessCertificationCampaignType campaign) { return getWorkItemsCompletedPercentage(campaign.getCase(), null, norm(campaign.getIteration())); }
@NotNull public static AccessCertificationStageDefinitionType getCurrentStageDefinition(AccessCertificationCampaignType campaign) { return findStageDefinition(campaign, campaign.getStageNumber()); }