public Collection<ObjectReferenceType> getApprovedByFromTaskTree(Task task, OperationResult result) throws SchemaException { // we use a OID-keyed map to (1) keep not only the OID, but whole reference, but (2) eliminate uncertainty in comparing references Map<String,ObjectReferenceType> approvers = new HashMap<>(); List<Task> tasks = task.listSubtasksDeeply(result); tasks.add(task); for (Task aTask : tasks) { List<ObjectReferenceType> approvedBy = getApprovedBy(WfContextUtil.getWorkflowContext(aTask.getTaskPrismObject())); approvedBy.forEach(ort -> approvers.put(ort.getOid(), ort)); } return CloneUtil.cloneCollectionMembers(approvers.values()); // to ensure these are parent-less }
return cloneArray(orig); T clone = javaLangClone(orig); if (clone != null) { return clone;
public static void normalizeStages(ApprovalSchemaType schema) { // Sorting uses set(..) method which is not available on prism structures. So we do sort on a copy (ArrayList). List<ApprovalStageDefinitionType> stages = getSortedStages(schema); for (int i = 0; i < stages.size(); i++) { stages.get(i).setOrder(null); stages.get(i).setNumber(i+1); } schema.getLevel().clear(); schema.getStage().clear(); schema.getStage().addAll(CloneUtil.cloneCollectionMembers(stages)); }
private Map<String, Collection<String>> cloneParams(Map<String, Collection<String>> map) { // TODO: implement more efficient clone return CloneUtil.clone(map); }
private ApprovalStageExecutionRecordType createStageExecutionRecord(WfContextType wfc, Integer stageNumberObject, int currentStageNumber) { int stageNumber = stageNumberObject; ApprovalStageExecutionRecordType rv = new ApprovalStageExecutionRecordType(prismContext); wfc.getEvent().stream() .filter(e -> e.getStageNumber() != null && e.getStageNumber() == stageNumber) .forEach(e -> rv.getEvent().add(e)); if (stageNumber == currentStageNumber) { rv.getWorkItem().addAll(CloneUtil.cloneCollectionMembers(wfc.getWorkItem())); } return rv; } }
private void addAssignmentCreationApprovalMetadata(AssignmentType assignment, Collection<ObjectReferenceType> approvedBy, Collection<String> comments) { MetadataType metadata = assignment.getMetadata(); if (metadata == null) { assignment.setMetadata(metadata = new MetadataType(prismContext)); } metadata.getCreateApproverRef().clear(); metadata.getCreateApproverRef().addAll(CloneUtil.cloneCollectionMembers(approvedBy)); metadata.getCreateApprovalComment().clear(); metadata.getCreateApprovalComment().addAll(comments); }
public static <T> List<T> cloneListMembers(List<T> list) { List<T> clonedCollection = new ArrayList<>(list.size()); for (T element : list) { clonedCollection.add(clone(element)); } return clonedCollection; }
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 <T> List<T> cloneCollectionMembers(Collection<T> collection) { if (collection == null) { return null; } List<T> clonedCollection = new ArrayList<>(collection.size()); for (T element : collection) { clonedCollection.add(clone(element)); } return clonedCollection; }
private List<ApprovalStageDefinitionType> cloneAndMergeStages(List<Fragment> fragments) throws SchemaException { if (fragments.size() == 1) { return CloneUtil.cloneCollectionMembers(getStages(fragments.get(0).schema)); } PrismContext prismContext = primaryChangeAspect.getChangeProcessor().getPrismContext(); ApprovalStageDefinitionType resultingStageDef = new ApprovalStageDefinitionType(prismContext); fragments.sort((f1, f2) -> Comparator.nullsLast(Comparator.<Integer>naturalOrder()) .compare(f1.compositionStrategy.getMergePriority(), f2.compositionStrategy.getMergePriority())); for (Fragment fragment : fragments) { mergeStageDefFromFragment(resultingStageDef, fragment); } return Collections.singletonList(resultingStageDef); }
private Collection<SelectorOptions<GetOperationOptions>> updateSearchOptionsWithIterationMethod( Collection<SelectorOptions<GetOperationOptions>> searchOptions, Task localCoordinatorTask) { Collection<SelectorOptions<GetOperationOptions>> rv; IterationMethodType iterationMethod = getIterationMethodFromTask(localCoordinatorTask); if (iterationMethod != null) { rv = CloneUtil.cloneCollectionMembers(searchOptions); return SelectorOptions.updateRootOptions(rv, o -> o.setIterationMethod(iterationMethod), GetOperationOptions::new); } else { return searchOptions; } }
public ExpressionWrapper clone() { // todo call super.clone? Object expressionClone = CloneUtil.clone(expression); return new ExpressionWrapper(elementName, expressionClone); }
private List<ObjectReferenceType> computeDelegateTo(DelegateWorkItemActionType delegateAction, WorkItemType workItem, Task wfTask, Task triggerScannerTask, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { List<ObjectReferenceType> rv = new ArrayList<>(); rv.addAll(CloneUtil.cloneCollectionMembers(delegateAction.getApproverRef())); if (!delegateAction.getApproverExpression().isEmpty()) { ExpressionVariables variables = stageComputeHelper.getDefaultVariables(null, wfTask, result); variables.addVariableDefinition(SchemaConstants.C_WORK_ITEM, workItem); rv.addAll(evaluationHelper.evaluateRefExpressions(delegateAction.getApproverExpression(), variables, "computing delegates", triggerScannerTask, result)); } // if (!delegateAction.getApproverRelation().isEmpty()) { // throw new UnsupportedOperationException("Approver relation in delegate/escalate action is not supported yet."); // } return rv; }
public SearchResultList<T> clone() { SearchResultList<T> clone = new SearchResultList<>(); clone.metadata = this.metadata; // considered read-only object if (this.list != null) { clone.list = new ArrayList(this.list.size()); for (T item : this.list) { clone.list.add(CloneUtil.clone(item)); } } return clone; }
public static void computeAssignees(List<ObjectReferenceType> newAssignees, List<ObjectReferenceType> delegatedTo, List<ObjectReferenceType> delegates, WorkItemDelegationMethodType method, AbstractWorkItemType workItem) { newAssignees.clear(); delegatedTo.clear(); switch (method) { case ADD_ASSIGNEES: newAssignees.addAll(CloneUtil.cloneCollectionMembers(workItem.getAssigneeRef())); break; case REPLACE_ASSIGNEES: break; default: throw new UnsupportedOperationException("Delegation method " + method + " is not supported yet."); } for (ObjectReferenceType delegate : delegates) { if (delegate.getType() != null && !QNameUtil.match(UserType.COMPLEX_TYPE, delegate.getType())) { throw new IllegalArgumentException("Couldn't use non-user object as a delegate: " + delegate); } if (delegate.getOid() == null) { throw new IllegalArgumentException("Couldn't use no-OID reference as a delegate: " + delegate); } if (!ObjectTypeUtil.containsOid(newAssignees, delegate.getOid())) { newAssignees.add(delegate.clone()); delegatedTo.add(delegate.clone()); } } }
@Nullable public static Object cloneIfNecessary(String name, Object value) { if (value == null) { return null; } Object immutableOrNull = tryMakingImmutable(value); if (immutableOrNull != null) { return immutableOrNull; } else { try { return CloneUtil.clone(value); } catch (Throwable t) { LOGGER.warn("Scripting variable value {} of type {} couldn't be cloned. Using original.", name, value.getClass()); return value; } } }
private Collection<ItemDelta<?, ?>> bucketsAddDeltas(List<WorkBucketType> buckets) throws SchemaException { return prismContext.deltaFor(TaskType.class) .item(TaskType.F_WORK_STATE, TaskWorkStateType.F_BUCKET) .addRealValues(CloneUtil.cloneCollectionMembers(buckets)).asItemDeltas(); }