public ApprovalStageDefinitionType approverRef(ObjectReferenceType value) { getApproverRef().add(value); return this; }
private boolean shouldBeSkipped(ApprovalStageDefinitionType stage) { if (!stage.getApproverRelation().isEmpty()) { throw new IllegalStateException("Schema stage was not prepared correctly; contains unresolved approver relations: " + stage); } return stage.getOutcomeIfNoApprovers() == ApprovalLevelOutcomeType.SKIP && stage.getApproverRef().isEmpty() && stage.getApproverExpression().isEmpty(); } }
public List<ObjectReferenceType> createApproverRefList() { PrismForJAXBUtil.createReference(asPrismContainerValue(), F_APPROVER_REF); return getApproverRef(); }
public void prepareStage(ApprovalStageDefinitionType stageDef, RelationResolver relationResolver, ReferenceResolver referenceResolver) { try { // resolves filters in approvers List<ObjectReferenceType> resolvedApprovers = new ArrayList<>(); for (ObjectReferenceType ref : stageDef.getApproverRef()) { resolvedApprovers.addAll(referenceResolver.resolveReference(ref, "approver ref")); } // resolves approver relations resolvedApprovers.addAll(relationResolver.getApprovers(stageDef.getApproverRelation())); stageDef.getApproverRef().clear(); stageDef.getApproverRef().addAll(resolvedApprovers); stageDef.getApproverRelation().clear(); // default values if (stageDef.getOutcomeIfNoApprovers() == null) { stageDef.setOutcomeIfNoApprovers(ApprovalLevelOutcomeType.REJECT); } if (stageDef.getGroupExpansion() == null) { stageDef.setGroupExpansion(GroupExpansionType.BY_CLAIMING_WORK_ITEMS); } } catch (ExpressionEvaluationException | ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException e) { throw new SystemException("Couldn't prepare approval schema for execution: " + e.getMessage(), e); // todo propagate these exceptions? } }
private ApprovalSchemaType getSchema(ApprovalSchemaType schema, List<ObjectReferenceType> approverRef, List<ExpressionType> approverExpression, ExpressionType automaticallyApproved, @NotNull PrismContext prismContext) { if (schema != null) { return schema; } else { schema = new ApprovalSchemaType(prismContext); ApprovalStageDefinitionType stageDef = new ApprovalStageDefinitionType(prismContext); stageDef.getApproverRef().addAll(CloneUtil.cloneCollectionMembers(approverRef)); stageDef.getApproverExpression().addAll(approverExpression); stageDef.setAutomaticallyApproved(automaticallyApproved); schema.getStage().add(stageDef); return schema; } }
boolean addPredefined(PrismObject<?> targetObject, RelationKindType relationKind, OperationResult result) { RelationResolver resolver = primaryChangeAspect.createRelationResolver(targetObject, result); List<ObjectReferenceType> approvers = resolver.getApprovers(getRelationRegistry().getAllRelationsFor(relationKind)); if (!approvers.isEmpty()) { ApprovalStageDefinitionType stageDef = new ApprovalStageDefinitionType(); stageDef.getApproverRef().addAll(approvers); addPredefined(targetObject, stageDef); return true; } else { return false; } }
ApprovalSchemaType getSchemaFromAction(@NotNull ApprovalPolicyActionType approvalAction) { // TODO approval process if (approvalAction.getApprovalSchema() != null) { return approvalAction.getApprovalSchema().clone(); } else { ApprovalSchemaType rv = new ApprovalSchemaType(prismContext); ApprovalStageDefinitionType stageDef = new ApprovalStageDefinitionType(prismContext); stageDef.getApproverRef().addAll(CloneUtil.cloneCollectionMembers(approvalAction.getApproverRef())); stageDef.getApproverRelation().addAll(approvalAction.getApproverRelation()); stageDef.getApproverExpression().addAll(approvalAction.getApproverExpression()); stageDef.setAutomaticallyApproved(approvalAction.getAutomaticallyApproved()); // TODO maybe use name + description as well rv.getStage().add(stageDef); return rv; } }
private ApprovalStageExecutionPreviewType createStageExecutionPreview(WfContextType wfc, String requestChannel, ApprovalStageDefinitionType stageDef, Task opTask, OperationResult result) { ApprovalStageExecutionPreviewType rv = new ApprovalStageExecutionPreviewType(prismContext); try { WfStageComputeHelper.ComputationResult computationResult = computeHelper .computeStageApprovers(stageDef, () -> computeHelper.getDefaultVariables(wfc, requestChannel, result), opTask, result); rv.getExpectedApproverRef().addAll(computationResult.getApproverRefs()); rv.setExpectedAutomatedOutcome(computationResult.getPredeterminedOutcome()); rv.setExpectedAutomatedCompletionReason(computationResult.getAutomatedCompletionReason()); } catch (Throwable t) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't compute stage execution preview", t); rv.setErrorMessage(MiscUtil.formatExceptionMessageWithCause(t)); rv.getExpectedApproverRef().addAll(CloneUtil.cloneCollectionMembers(stageDef.getApproverRef())); // at least something here } return rv; }
} else if (!abstractRole.getApproverRef().isEmpty() || !abstractRole.getApproverExpression().isEmpty()) { ApprovalStageDefinitionType level = new ApprovalStageDefinitionType(prismContext); level.getApproverRef().addAll(CloneUtil.cloneCollectionMembers(abstractRole.getApproverRef())); level.getApproverExpression().addAll(CloneUtil.cloneCollectionMembers(abstractRole.getApproverExpression())); level.setAutomaticallyApproved(abstractRole.getAutomaticallyApproved());
rv.approverRefs.addAll(CloneUtil.cloneCollectionMembers(stageDef.getApproverRef()));
ObjectReferenceType approver = role2.getApprovalSchema().getStage().get(0).getApproverRef().get(0); assertEquals("Wrong OID of Role2's approver", R2BOSS_OID, approver.getOid());
assertEquals("Wrong definition stage number at " + pos, (Integer) (i+1), stagePreview.getDefinition().getNumber()); assertEquals("Stage definition approver ref info differs at " + pos, expectedStagePreview.definitionApproverOids, getOids(stagePreview.getDefinition().getApproverRef())); assertEquals("Stage expected approver ref info differs at " + pos, expectedStagePreview.expectedApproverOids, getOids(stagePreview.getExecutionPreview().getExpectedApproverRef())); assertEquals("Unexpected outcome at " + pos, expectedStagePreview.outcome, stagePreview.getExecutionPreview().getExpectedAutomatedOutcome());