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; } }
public static String getStageDiagName(ApprovalStageDefinitionType level) { return level.getNumber() + ":" + level.getName() + (level.getDisplayName() != null ? " (" + level.getDisplayName() + ")" : ""); }
@Override protected PrismContainerValue getValueFrom(ApprovalStageDefinitionType value) { return value.asPrismContainerValue(); }
@Override protected ApprovalStageDefinitionType createItem(PrismContainerValue value) { ApprovalStageDefinitionType level = new ApprovalStageDefinitionType(); level.setupContainerValue(value); return level; }
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 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(); } }
/** * Create an instance of {@link ApprovalStageDefinitionType } * */ public ApprovalStageDefinitionType createApprovalStageDefinitionType() { return new ApprovalStageDefinitionType(); }
if (stageDef.getAutomaticallyApproved() != null) { try { expressionVariables = enhancedVariablesProvider.get(); boolean preApproved = evaluationHelper.evaluateBooleanExpression(stageDef.getAutomaticallyApproved(), expressionVariables, "automatic approval expression", opTask, opResult); LOGGER.trace("Pre-approved = {} for stage {}", preApproved, stageDef); if (rv.predeterminedOutcome == null && stageDef.getAutomaticallyCompleted() != null) { try { if (expressionVariables == null) { rv.approverRefs.addAll(CloneUtil.cloneCollectionMembers(stageDef.getApproverRef())); if (!stageDef.getApproverExpression().isEmpty()) { try { if (expressionVariables == null) { expressionVariables = enhancedVariablesProvider.get(); rv.approverRefs.addAll(evaluationHelper.evaluateRefExpressions(stageDef.getApproverExpression(), expressionVariables, "resolving approver expression", opTask, opResult)); } catch (ExpressionEvaluationException | ObjectNotFoundException | SchemaException | RuntimeException | CommunicationException | ConfigurationException | SecurityViolationException e) { if (stageDef.getGroupExpansion() == GroupExpansionType.ON_WORK_ITEM_CREATION) { if (stageDef.getOutcomeIfNoApprovers() != null) { // should be always the case (default is REJECT) rv.predeterminedOutcome = stageDef.getOutcomeIfNoApprovers(); rv.automatedCompletionReason = NO_ASSIGNEES_FOUND;
public ApprovalStageDefinitionType clone() { ApprovalStageDefinitionType object = new ApprovalStageDefinitionType(); PrismContainerValue value = asPrismContainerValue().clone(); object.setupContainerValue(value); return object; }
Task wfTask = ActivitiUtil.getTask(execution, opResult); ApprovalStageDefinitionType stageDef = ActivitiUtil.getAndVerifyCurrentStage(execution, wfTask, false, prismContext); int stageNumber = stageDef.getNumber(); execution.setVariable(CommonProcessVariableNames.VARIABLE_STAGE_NAME, stageDef.getName()); execution.setVariable(CommonProcessVariableNames.VARIABLE_STAGE_DISPLAY_NAME, stageDef.getDisplayName()); execution.setVariableLocal(ProcessVariableNames.APPROVERS_IN_STAGE, ActivitiUtil.toLightweightReferences(approverRefs)); execution.setVariableLocal(ProcessVariableNames.LOOP_APPROVERS_IN_STAGE_STOP, stop); LOGGER.debug("No approvers at the stage '{}' for process {} (id {}) - response is {}", stageDef.getName(), execution.getVariable(CommonProcessVariableNames.VARIABLE_PROCESS_INSTANCE_NAME), execution.getProcessInstanceId(), stageDef.getOutcomeIfNoApprovers());
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; } }
int i = from; for (ApprovalStageDefinitionType stageDef : fragmentStageDefs) { stageDef.asPrismContainerValue().setId(null); // to avoid ID collision stageDef.setOrder(null); stageDef.setNumber(i++); approvalSchemaHelper.prepareStage(stageDef, relationResolver, referenceResolver); resultingSchemaType.getStage().add(stageDef);
public List<ObjectReferenceType> createApproverRefList() { PrismForJAXBUtil.createReference(asPrismContainerValue(), F_APPROVER_REF); return getApproverRef(); }
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());
public ApprovalStageDefinitionType approverRef(ObjectReferenceType value) { getApproverRef().add(value); return this; }
public List<WorkItemTimedActionsType> createTimedActionsList() { PrismForJAXBUtil.createContainer(asPrismContainerValue(), F_TIMED_ACTIONS); return getTimedActions(); }
public List<QName> createApproverRelationList() { PrismForJAXBUtil.createProperty(asPrismContainerValue(), F_APPROVER_RELATION); return getApproverRelation(); }
public List<ExpressionType> createApproverExpressionList() { PrismForJAXBUtil.createProperty(asPrismContainerValue(), F_APPROVER_EXPRESSION); return getApproverExpression(); }
public static ApprovalStageDefinitionType getStageDefinition(WfContextType wfc, int stageNumber) { ItemApprovalProcessStateType info = getItemApprovalProcessInfo(wfc); if (info == null || info.getApprovalSchema() == null) { return null; } ApprovalSchemaType approvalSchema = info.getApprovalSchema(); List<ApprovalStageDefinitionType> stages = approvalSchema.getStage().stream() .filter(level -> level.getNumber() != null && level.getNumber() == stageNumber) .collect(Collectors.toList()); if (stages.size() > 1) { throw new IllegalStateException("More than one level with order of " + stageNumber + ": " + stages); } else if (stages.isEmpty()) { return null; } else { return stages.get(0); } }