@Override public String debugDump(int indent) { StringBuilder sb = new StringBuilder(); DebugUtil.indentDebugDump(sb, indent); sb.append(debugName()); sb.append("<").append(objectTypeClass.getSimpleName()).append(">("); sb.append(debugIdentifiers()).append(",").append(changeType); if (changeType == ChangeType.DELETE) { // Nothing to print for delete sb.append(")"); } else { sb.append("):\n"); if (objectToAdd == null) { if (changeType == ChangeType.ADD) { DebugUtil.indentDebugDump(sb, indent + 1); sb.append("null"); } } else { sb.append(objectToAdd.debugDump(indent + 1)); } Iterator<? extends ItemDelta> i = modifications.iterator(); while (i.hasNext()) { sb.append(i.next().debugDump(indent + 1)); if (i.hasNext()) { sb.append("\n"); } } } return sb.toString(); }
@NotNull @Override public List<PcpChildWfTaskCreationInstruction> prepareTasks(@NotNull ObjectTreeDeltas objectTreeDeltas, ModelInvocationContext ctx, @NotNull OperationResult result) throws SchemaException { List<ApprovalRequest<String>> approvalRequestList = new ArrayList<>(); List<PcpChildWfTaskCreationInstruction> instructions = new ArrayList<>(); ObjectDelta changeRequested = objectTreeDeltas.getFocusChange(); if (changeRequested == null || changeRequested.getChangeType() != ChangeType.MODIFY) { return Collections.emptyList(); } Iterator<? extends ItemDelta> deltaIterator = changeRequested.getModifications().iterator(); while (deltaIterator.hasNext()) { ItemDelta delta = deltaIterator.next(); // this needs to be customized and enhanced; e.g. to start wf process only when not enough authentication info is present in the request // also, what if we replace whole 'credentials' container? if (PATH_CREDENTIALS_PASSWORD_VALUE.equivalent(delta.getPath())) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Found password-changing delta, moving it into approval request. Delta = " + delta.debugDump()); } ApprovalRequest<String> approvalRequest = createApprovalRequest(delta, ctx.modelContext, ctx.taskFromModel, result); approvalRequestList.add(approvalRequest); instructions.add(createStartProcessInstruction(ctx.modelContext, delta, approvalRequest, ctx.taskFromModel, result)); deltaIterator.remove(); } } return instructions; }
@Test public void testDiffSameValues() throws Exception { PrismObject<ResourceType> before = PrismTestUtil.parseObject(new File(TEST_DIR, "resource-white-before.xml")); PrismObject<ResourceType> after = PrismTestUtil.parseObject(new File(TEST_DIR, "resource-white-after.xml")); Collection<? extends ItemDelta> differences = before.diffModifications(after, EquivalenceStrategy.LITERAL_IGNORE_METADATA); assertEquals(1, differences.size()); System.out.println(differences.iterator().next().debugDump()); PrismObject<ResourceType> differencesApplied = before.clone(); ItemDeltaCollectionsUtil.applyTo(differences, differencesApplied); System.out.println(differencesApplied.debugDump()); assertEquals("'after' is different from the object with differences applied", after, differencesApplied); }
@Test public void testItemDeltaReplaceEmptyString() throws Exception { System.out.println("===[ testItemDeltaReplaceEmptyString ]===="); // GIVEN PrismObjectDefinition<UserType> userDef = getUserDefinition(); PropertyDelta<String> deltaBefore = getPrismContext().deltaFactory().property().createReplaceEmptyDelta(userDef, UserType.F_COST_CENTER); // deltaBefore.setValueToReplace(new PrismPropertyValue<String>("")); // WHEN Collection<ItemDeltaType> itemDeltaTypes = DeltaConvertor.toItemDeltaTypes(deltaBefore); // THEN System.out.println("Serialized"); System.out.println(itemDeltaTypes); // WHEN ItemDelta<?,?> deltaAfter = DeltaConvertor.createItemDelta(itemDeltaTypes.iterator().next(), userDef); // THEN System.out.println("Parsed"); System.out.println(deltaAfter.debugDump()); assertEquals("Deltas do not match", deltaBefore, deltaAfter); }
@Test // MID-4689 public void testObjectDeltaFindItemDeltaModifyNonExistentPropertyInReplacedContainer() throws Exception { final String TEST_NAME="testObjectDeltaFindItemDeltaModifyNonExistentPropertyInReplacedContainer"; displayTestTitle(TEST_NAME); // GIVEN ObjectDelta<UserType> userDelta = createDeltaForFindItem(true); System.out.println("Object delta:\n"+userDelta.debugDump()); ItemPath itemDeltaPath = ItemPath.create(UserType.F_ACTIVATION, ActivationType.F_VALID_TO); // not present in the delta // WHEN ItemDelta<PrismValue, ItemDefinition> itemDelta = userDelta.findItemDelta(itemDeltaPath); // THEN System.out.println("Item delta:\n"+(itemDelta==null?"null":itemDelta.debugDump())); assertNull("Found delta even if it shouldn't", itemDelta); }
@Test public void testItemDeltaReplaceNil() throws Exception { System.out.println("===[ testItemDeltaReplaceNil ]===="); // GIVEN PrismObjectDefinition<UserType> userDef = getUserDefinition(); PropertyDelta<String> deltaBefore = getPrismContext().deltaFactory().property().createReplaceEmptyDelta(userDef, UserType.F_COST_CENTER); // The delta remains empty // WHEN Collection<ItemDeltaType> itemDeltaTypes = DeltaConvertor.toItemDeltaTypes(deltaBefore); // THEN System.out.println("Serialized"); System.out.println(itemDeltaTypes); ItemDeltaType itemDeltaType = itemDeltaTypes.iterator().next(); String xml = PrismTestUtil.serializeAtomicValue(itemDeltaType, new QName("wherever","whatever")); System.out.println(xml); // WHEN ItemDelta<?,?> deltaAfter = DeltaConvertor.createItemDelta(itemDeltaType, userDef); // THEN System.out.println("Parsed"); System.out.println(deltaAfter.debugDump()); assertEquals("Deltas do not match", deltaBefore, deltaAfter); }
@Test public void testObjectDeltaFindItemDeltaModifyNonExistentPropertyInAddedContainer() throws Exception { final String TEST_NAME="testObjectDeltaFindItemDeltaModifyNonExistentPropertyInAddedContainer"; displayTestTitle(TEST_NAME); // GIVEN ObjectDelta<UserType> userDelta = createDeltaForFindItem(false); System.out.println("Object delta:\n"+userDelta.debugDump()); ItemPath itemDeltaPath = ItemPath.create(UserType.F_ACTIVATION, ActivationType.F_VALID_TO); // not present in the delta // WHEN ItemDelta<PrismValue, ItemDefinition> itemDelta = userDelta.findItemDelta(itemDeltaPath); // THEN System.out.println("Item delta:\n"+(itemDelta==null?"null":itemDelta.debugDump())); assertNull("Found delta even if it shouldn't", itemDelta); }
@Test public void testItemDeltaReplace() throws Exception { System.out.println("===[ testItemDeltaReplace ]===="); // GIVEN PrismObjectDefinition<UserType> userDef = getUserDefinition(); PropertyDelta<String> deltaBefore = getPrismContext().deltaFactory().property().createReplaceEmptyDelta(userDef, UserType.F_COST_CENTER); deltaBefore.setRealValuesToReplace("foo"); // WHEN Collection<ItemDeltaType> itemDeltaTypes = DeltaConvertor.toItemDeltaTypes(deltaBefore); // THEN System.out.println("Serialized"); System.out.println(itemDeltaTypes); // WHEN ItemDelta<?,?> deltaAfter = DeltaConvertor.createItemDelta(itemDeltaTypes.iterator().next(), userDef); // THEN System.out.println("Parsed"); System.out.println(deltaAfter.debugDump()); assertEquals("Deltas do not match", deltaBefore, deltaAfter); assertNull(deltaAfter.getEstimatedOldValues()); }
private void singleModify(CarefulAnt<ResourceType> ant, int iteration, OperationResult result) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException { // GIVEN ItemDelta<?,?> itemDelta = ant.createDelta(iteration); Collection<? extends ItemDelta<?,?>> modifications = MiscSchemaUtil.createCollection(itemDelta); System.out.println("itemDelta: " + itemDelta.debugDump()); // WHEN repositoryService.modifyObject(ResourceType.class, RESOURCE_OPENDJ_OID, modifications, result); // THEN PrismObject<ResourceType> resourceAfter = repositoryService.getObject(ResourceType.class, RESOURCE_OPENDJ_OID, null, result); SqlRepoTestUtil.assertVersionProgress(lastVersion, resourceAfter.getVersion()); lastVersion = resourceAfter.getVersion(); System.out.println("Version: "+lastVersion); ant.assertModification(resourceAfter, iteration); }
@Test public void testItemDeltaReplaceOldValue() throws Exception { System.out.println("===[ testItemDeltaReplaceOldValue ]===="); // GIVEN PrismObjectDefinition<UserType> userDef = getUserDefinition(); PropertyDelta<String> deltaBefore = getPrismContext().deltaFactory().property().createReplaceEmptyDelta(userDef, UserType.F_COST_CENTER); deltaBefore.setRealValuesToReplace("foo"); deltaBefore.addEstimatedOldValue(getPrismContext().itemFactory().createPropertyValue("BAR")); // WHEN Collection<ItemDeltaType> itemDeltaTypes = DeltaConvertor.toItemDeltaTypes(deltaBefore); // THEN System.out.println("Serialized"); System.out.println(itemDeltaTypes); // WHEN ItemDelta<?,?> deltaAfter = DeltaConvertor.createItemDelta(itemDeltaTypes.iterator().next(), userDef); // THEN System.out.println("Parsed"); System.out.println(deltaAfter.debugDump()); assertEquals("Deltas do not match", deltaBefore, deltaAfter); PropertyDelta<String> propDeltaAfter = (PropertyDelta<String>)deltaAfter; PrismAsserts.assertValues("Wrong old value", propDeltaAfter.getEstimatedOldValues(), "BAR"); }
@Test public void testObjectDeltaFindItemDeltaModifyPropertyInReplacedContainer() throws Exception { final String TEST_NAME="testObjectDeltaFindItemDeltaModifyPropertyInReplacedContainer"; displayTestTitle(TEST_NAME); // GIVEN ObjectDelta<UserType> userDelta = createDeltaForFindItem(true); System.out.println("Object delta:\n"+userDelta.debugDump()); ItemPath itemDeltaPath = ItemPath.create(UserType.F_ACTIVATION, ActivationType.F_ENABLED); // WHEN ItemDelta<PrismValue, ItemDefinition> itemDelta = userDelta.findItemDelta(itemDeltaPath); // THEN System.out.println("Item delta:\n"+(itemDelta==null?"null":itemDelta.debugDump())); PrismAsserts.assertInstanceOf(PropertyDelta.class, itemDelta); assertEquals(itemDeltaPath, itemDelta.getPath()); // TODO // What kind of delta should we return? Currently we return REPLACE one. But this can // cause problems when finding deltas during delta merge operation. FindItemDelta should // be specified more precisely. // // See MID-4689 // // PrismAsserts.assertPropertyValues("Wrong replace values in "+itemDelta, // ((PropertyDelta)itemDelta).getValuesToReplace(), Boolean.TRUE); }
@Test public void testObjectDeltaFindItemDeltaModifyPropertyInAddedContainer() throws Exception { final String TEST_NAME="testObjectDeltaFindItemDeltaModifyPropertyInAddedContainer"; displayTestTitle(TEST_NAME); // GIVEN ObjectDelta<UserType> userDelta = createDeltaForFindItem(false); System.out.println("Object delta:\n"+userDelta.debugDump()); ItemPath itemDeltaPath = ItemPath.create(UserType.F_ACTIVATION, ActivationType.F_ENABLED); // WHEN ItemDelta<PrismValue, ItemDefinition> itemDelta = userDelta.findItemDelta(itemDeltaPath); // THEN System.out.println("Item delta:\n"+(itemDelta==null?"null":itemDelta.debugDump())); PrismAsserts.assertInstanceOf(PropertyDelta.class, itemDelta); assertEquals(itemDeltaPath, itemDelta.getPath()); PrismAsserts.assertPropertyValues("Wrong add values in "+itemDelta, ((PropertyDelta)itemDelta).getValuesToAdd(), Boolean.TRUE); }
if (LOGGER.isTraceEnabled()) { LOGGER.trace("Removing empty replace part of the diff delta because mapping is tolerant:\n{}", diffDelta.debugDump()); LOGGER.trace( "Making sure that the replace part of the diff contains old values delta because mapping is tolerant:\n{}", diffDelta.debugDump()); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Removing delete part of the diff delta because mapping settings are tolerant={}, hasRange={}:\n{}", tolerant, hasRange, diffDelta.debugDump());
new Object[]{itemPath, leftValuesToLeave, rightValuesToTake, leftValuesToRemove, itemDelta.debugDump(2)});
ItemDelta itemDelta = DeltaConvertor .createItemDelta(itemDeltaType, TaskType.class, taskManager.getPrismContext()); LOGGER.trace("Applying ItemDelta to task extension; task = {}; itemDelta = {}", this, itemDelta.debugDump()); this.modifyExtension(itemDelta);
if (focusItemDelta != null && !focusItemDelta.isEmpty()) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Created delta (from inbound expression for {} on {})\n{}", focusItemDelta.getElementName(), projContext.getResource(), focusItemDelta.debugDump(1));
LOGGER.trace("Item delta:\n{}", itemDelta.debugDump(1));