public static <O extends Objectable> void fillInModificationReplaceReference(ObjectDelta<O> objectDelta, ItemPath refPath, PrismReferenceValue... refValues) { ReferenceDelta refDelta = objectDelta.createReferenceModification(refPath); if (refValues != null) { refDelta.setValuesToReplace(refValues); objectDelta.addModification(refDelta); } }
/** * Convenience method for quick creation of object deltas that replace a single object property. This is used quite often * to justify a separate method. */ @Override public <O extends Objectable> ObjectDelta<O> createModificationAddReference(Class<O> type, String oid, QName propertyName, PrismObject<?>... referenceObjects) { ObjectDelta<O> objectDelta = create(type, ChangeType.MODIFY); objectDelta.setOid(oid); PrismObjectDefinition<O> objDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type); PrismReferenceDefinition refDef = objDef.findReferenceDefinition(ItemName.fromQName(propertyName)); ReferenceDelta referenceDelta = objectDelta.createReferenceModification(ItemName.fromQName(propertyName), refDef); Collection<PrismReferenceValue> valuesToReplace = new ArrayList<>(referenceObjects.length); for (PrismObject<?> refObject: referenceObjects) { valuesToReplace.add(prismContext.itemFactory().createReferenceValue(refObject)); } referenceDelta.setValuesToReplace(valuesToReplace); return objectDelta; }
private <F extends ObjectType> void setReferences(LensFocusContext<F> focusContext, QName name, Collection<PrismReferenceValue> targetState) throws SchemaException { ItemName itemName = ItemName.fromQName(name); PrismObject<F> focusOld = focusContext.getObjectOld(); if (focusOld == null) { if (targetState.isEmpty()) { return; } } else { PrismReference existingState = focusOld.findReference(itemName); if (existingState == null || existingState.isEmpty()) { if (targetState.isEmpty()) { return; } } else { // we don't use QNameUtil.match here, because we want to ensure we store qualified values there // (and newValues are all qualified) Comparator<PrismReferenceValue> comparator = (a, b) -> 2*a.getOid().compareTo(b.getOid()) + (Objects.equals(a.getRelation(), b.getRelation()) ? 0 : 1); if (MiscUtil.unorderedCollectionCompare(targetState, existingState.getValues(), comparator)) { return; } } } PrismReferenceDefinition itemDef = focusContext.getObjectDefinition().findItemDefinition(itemName, PrismReferenceDefinition.class); ReferenceDelta itemDelta = prismContext.deltaFactory().reference().create(itemName, itemDef); itemDelta.setValuesToReplace(targetState); focusContext.swallowToSecondaryDelta(itemDelta); }