public <X> ItemDeltaItem<PrismPropertyValue<X>,PrismPropertyDefinition<X>> resolveStructuredProperty( ItemPath resolvePath, PrismPropertyDefinition outputDefinition, ItemPath outputPath, PrismContext prismContext) { ItemDeltaItem<PrismPropertyValue<Structured>,PrismPropertyDefinition<Structured>> thisIdi = (ItemDeltaItem<PrismPropertyValue<Structured>,PrismPropertyDefinition<Structured>>)this; PrismProperty<X> outputPropertyNew = resolveStructuredPropertyItem((PrismProperty<Structured>) thisIdi.getItemNew(), resolvePath, outputDefinition); PrismProperty<X> outputPropertyOld = resolveStructuredPropertyItem((PrismProperty<Structured>) thisIdi.getItemOld(), resolvePath, outputDefinition); PropertyDelta<X> outputDelta = resolveStructuredPropertyDelta((PropertyDelta<Structured>) thisIdi.getDelta(), resolvePath, outputDefinition, outputPath, prismContext); return new ItemDeltaItem<>(outputPropertyOld, outputDelta, outputPropertyNew); }
private ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> createAssignmentIdiInternalChange( PrismContainerValue<AssignmentType> cval, Collection<? extends ItemDelta<?, ?>> subItemDeltas) throws SchemaException { ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> idi = new ItemDeltaItem<>(); idi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(cval.asContainerable())); idi.setSubItemDeltas(subItemDeltas); idi.recompute(); return idi; }
/** * @return */ public boolean isStructuredProperty() { if (!isProperty()) { return false; } PrismProperty<?> property = (PrismProperty<?>) getAnyItem(); Object realValue = property.getAnyRealValue(); if (realValue != null) { return realValue instanceof Structured; } PropertyDelta<?> delta = (PropertyDelta<?>) getDelta(); realValue = delta.getAnyRealValue(); if (realValue != null) { return realValue instanceof Structured; } return false; }
public ItemDeltaItem(ItemDeltaItem<V,D> idi) { super(); this.itemOld = idi.getItemOld(); this.itemNew = idi.getItemNew(); this.delta = idi.getDelta(); }
public boolean isContainer() { Item<V,D> item = getAnyItem(); if (item != null) { return item instanceof PrismContainer<?>; } if (getDelta() != null) { return getDelta() instanceof ContainerDelta<?>; } return false; }
private ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> createAssignmentIdiNoChange( PrismContainerValue<AssignmentType> cval) throws SchemaException { ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> idi = new ItemDeltaItem<>(); idi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(cval.asContainerable())); idi.recompute(); return idi; }
private static void convertToLegacy( ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> idi) { if (idi == null || idi.getDelta() == null || idi.getSubItemDeltas() != null) { return; } // Legacy approach (when adding/removing assignments) was: itemOld+itemNew = value, delta = null // This was recently changed, to provide precise information (add = null->itemNew, delete = itemOld->null). // However, to not break scripts before 3.6 release we provide imitation of old behavior here. // (Moreover, for magic assignment the delta is not correct anyway.) if (idi.getDelta().isAdd() || idi.getDelta().isReplace()) { idi.setItemOld(idi.getItemNew().clone()); } else { idi.setItemNew(idi.getItemOld().clone()); } idi.setDelta(null); }
@Test public void testResolvePathPolyStringOdo() throws Exception { final String TEST_NAME = "testResolvePathPolyStringOdo"; System.out.println("\n===[ "+TEST_NAME+" ]===\n"); // GIVEN // WHEN ItemDeltaItem<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> idi = resolvePathOdo("$user/fullName", TEST_NAME); // THEN assertEquals("Wrong resolved idi old value", PrismTestUtil.createPolyString("Jack Sparrow"), ((PrismProperty<PolyString>)idi.getItemOld()).getRealValue()); assertEquals("Wrong resolved idi new value", PrismTestUtil.createPolyString("Captain Jack Sparrow"), ((PrismProperty<PolyString>)idi.getItemNew()).getRealValue()); assertTrue("Wrong residual path: "+idi.getResidualPath(), idi.getResidualPath() == null || idi.getResidualPath().isEmpty()); }
private static void mergeExtension(ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> destIdi, ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> srcIdi) throws SchemaException { mergeExtension(destIdi.getItemOld(), srcIdi.getItemOld()); mergeExtension(destIdi.getItemNew(), srcIdi.getItemNew()); if (srcIdi.getDelta() != null || srcIdi.getSubItemDeltas() != null) { throw new UnsupportedOperationException("Merge of IDI with deltas not supported"); } }
if (sourceObject instanceof ItemDeltaItem<?,?>) { itemOld = ((ItemDeltaItem<IV,ID>)sourceObject).getItemOld(); delta = ((ItemDeltaItem<IV,ID>)sourceObject).getDelta(); itemNew = ((ItemDeltaItem<IV,ID>)sourceObject).getItemNew(); residualPath = ((ItemDeltaItem<IV,ID>)sourceObject).getResidualPath(); resolvePath = ((ItemDeltaItem<IV,ID>)sourceObject).getResolvePath(); subItemDeltas = ((ItemDeltaItem<IV,ID>)sourceObject).getSubItemDeltas(); } else if (sourceObject instanceof Item<?,?>) {
if (resolveContext.isContainer()) { resolveContext = resolveContext.findIdi(resolvePath.firstAsPath()); resolvePath = resolvePath.rest(); if (resolveContext == null) { throw new ExpressionEvaluationException("Cannot find item using path "+path+" in "+ context.getContextDescription()); } else if (resolveContext.isStructuredProperty()) { resolveContext = resolveContext.resolveStructuredProperty(resolvePath, (PrismPropertyDefinition) outputDefinition, ItemPath.EMPTY_PATH, prismContext); break; } else if (resolveContext.isNull()){ break; } else { PrismValueDeltaSetTriple<V> outputTriple = ItemDeltaUtil.toDeltaSetTriple((Item<V,D>)resolveContext.getItemOld(), (ItemDelta<V,D>)resolveContext.getDelta(), prismContext);
private ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> createAssignmentIdiAdd( PrismContainerValue<AssignmentType> cval) throws SchemaException { ItemDeltaItem<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> idi = new ItemDeltaItem<>(); idi.setItemOld(null); @SuppressWarnings({"unchecked", "raw"}) ItemDelta<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>> itemDelta = (ItemDelta<PrismContainerValue<AssignmentType>, PrismContainerDefinition<AssignmentType>>) getDeltaItemFragment(cval) .add(cval.asContainerable().clone()) .asItemDelta(); idi.setDelta(itemDelta); idi.recompute(); return idi; }
ItemDeltaItem<IV,ID> subIdi = new ItemDeltaItem<>(subItemOld, subDelta, subItemNew); subIdi.setResidualPath(subResidualPath); subIdi.resolvePath = newResolvePath; Item<IV,ID> subAnyItem = subIdi.getAnyItem(); Collection<ItemDelta<?,?>> subSubItemDeltas = new ArrayList<>(); for (ItemDelta<?,?> subItemDelta: subItemDeltas) { if (subSubItemDelta.isApplicableTo(subAnyItem)) { subDelta = (ItemDelta<IV,ID>) subSubItemDelta; subIdi.setDelta(subDelta); } else { subIdi.setSubItemDeltas(subSubItemDeltas); subIdi.setSubItemDeltas(subSubItemDeltas);
private static <O extends ObjectType> void mergeExtension(ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> destIdi, PrismObject<O> srcObject) throws SchemaException { if (srcObject == null) { return; } PrismContainer<Containerable> srcExtension = srcObject.findContainer(ObjectType.F_EXTENSION); mergeExtensionContainers(destIdi.getItemNew(), srcExtension); mergeExtensionContainers(destIdi.getItemOld(), srcExtension); }
/** * @return mode (adding, deleting, keeping) with respect to the *current* object (not the old one) */ @NotNull public PlusMinusZero getMode() { if (assignmentIdi.getItemNew() == null || assignmentIdi.getItemNew().isEmpty()) { return MINUS; } else if (presentInCurrentObject) { return ZERO; } else { return PLUS; } }
public static <IV extends PrismValue, ID extends ItemDefinition> ItemDeltaItem<IV, ID> toItemDeltaItem( Object object, ObjectResolver objectResolver, String string, OperationResult result) { if (object == null) { return null; } if (object instanceof ItemDeltaItem<?, ?>) { return (ItemDeltaItem<IV, ID>) object; } if (object instanceof PrismObject<?>) { return (ItemDeltaItem<IV, ID>) new ObjectDeltaObject((PrismObject<?>) object, null, (PrismObject<?>) object); } else if (object instanceof Item<?, ?>) { return new ItemDeltaItem<>((Item<IV, ID>) object, null, (Item<IV, ID>) object); } else if (object instanceof ItemDelta<?, ?>) { return new ItemDeltaItem<>(null, (ItemDelta<IV, ID>) object, null); } else { throw new IllegalArgumentException("Unexpected object " + object + " " + object.getClass()); } }
ItemDeltaItem<IV,ID> subIdi = new ItemDeltaItem<>(subItemOld, itemDelta, subItemNew); subIdi.setSubItemDeltas(subSubItemDeltas); subIdi.setResolvePath(path); subIdi.setResidualPath(subResidualPath); return subIdi;
specialAttributeDelta = sourceIdi.getDelta(); Source<PrismPropertyValue<?>,PrismPropertyDefinition<?>> source = new Source<>(sourceIdi.getItemOld(), specialAttributeDelta, sourceIdi.getItemOld(), ExpressionConstants.VAR_INPUT); builder = builder.defaultSource(source) .addVariableDefinition(ExpressionConstants.VAR_USER, newUser)
public ItemDeltaItem<V,D> clone() { ItemDeltaItem<V,D> clone = new ItemDeltaItem<>(); copyValues(clone); return clone; }
/** * Adds map of extra variables to the expression. * If there are variables with deltas (ObjectDeltaObject) it takes the "old" version * of the object. */ public void addVariableDefinitionsOld(Map<QName, Object> extraVariables) { for (Entry<QName, Object> entry : extraVariables.entrySet()) { Object value = entry.getValue(); if (value instanceof ObjectDeltaObject<?>) { ObjectDeltaObject<?> odo = (ObjectDeltaObject<?>)value; value = odo.getOldObject(); } else if (value instanceof ItemDeltaItem<?,?>) { ItemDeltaItem<?,?> idi = (ItemDeltaItem<?,?>)value; value = idi.getItemOld(); } variables.put(entry.getKey(), value); } }