public <O extends ObjectType> Collection<ObjectDeltaOperation<? extends ObjectType>> mergeObjects(Class<O> type, String leftOid, String rightOid, String mergeConfigurationName, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ConfigurationException, ObjectAlreadyExistsException, ExpressionEvaluationException, CommunicationException, PolicyViolationException, SecurityViolationException { MergeDeltas<O> deltas = computeMergeDeltas(type, leftOid, rightOid, mergeConfigurationName, task, result); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Merge {} + {} = (computed deltas)\n{}", leftOid, rightOid, deltas.debugDump(1)); } Collection<ObjectDeltaOperation<? extends ObjectType>> executedDeltas = new ArrayList<>(); LOGGER.trace("Executing right link delta (raw): {}", deltas.getRightLinkDelta()); executeDelta(deltas.getRightLinkDelta(), ModelExecuteOptions.createRaw(), executedDeltas, task, result); LOGGER.trace("Executing left link delta (raw): {}", deltas.getLeftLinkDelta()); executeDelta(deltas.getLeftLinkDelta(), ModelExecuteOptions.createRaw(), executedDeltas, task, result); LOGGER.trace("Executing left object delta: {}", deltas.getLeftObjectDelta()); executeDelta(deltas.getLeftObjectDelta(), null, executedDeltas, task, result); result.computeStatus(); if (result.isSuccess()) { // Do not delete the other object if the execution was not success. // We might need to re-try the merge if it has failed and for that we need the right object. ObjectDelta<O> deleteDelta = prismContext.deltaFactory().object().createDeleteDelta(type, rightOid ); Collection<ObjectDeltaOperation<? extends ObjectType>> executedDeleteDeltas = modelController.executeChanges(MiscSchemaUtil.createCollection(deleteDelta), null, task, result); executedDeltas.addAll(executedDeleteDeltas); } return executedDeltas; }
@Override public <O extends ObjectType> PrismObject<O> mergeObjectsPreviewObject(Class<O> type, String leftOid, String rightOid, String mergeConfigurationName, Task task, OperationResult parentResult) throws ObjectNotFoundException, SchemaException, ConfigurationException, ExpressionEvaluationException, CommunicationException, SecurityViolationException { OperationResult result = parentResult.createMinorSubresult(MERGE_OBJECTS_PREVIEW_OBJECT); try { MergeDeltas<O> mergeDeltas = objectMerger.computeMergeDeltas(type, leftOid, rightOid, mergeConfigurationName, task, result); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Merge preview {} + {} deltas:\n{}", leftOid, rightOid, mergeDeltas.debugDump(1)); } final PrismObject<O> objectLeft = (PrismObject<O>) objectResolver.getObjectSimple(type, leftOid, null, task, result).asPrismObject(); if (mergeDeltas == null) { result.computeStatus(); return objectLeft; } mergeDeltas.getLeftObjectDelta().applyTo(objectLeft); mergeDeltas.getLeftLinkDelta().applyTo(objectLeft); result.computeStatus(); return objectLeft; } catch (ObjectNotFoundException | SchemaException | ConfigurationException | ExpressionEvaluationException | CommunicationException | SecurityViolationException | RuntimeException | Error e) { result.recordFatalError(e); throw e; } }
ObjectDelta<UserType> delta = deltas.getLeftObjectDelta(); PrismAsserts.assertIsModify(delta); assertEquals("Wrong delta OID", USER_JACK_OID, delta.getOid());
ObjectDelta<UserType> leftObjectdelta = deltas.getLeftObjectDelta(); PrismAsserts.assertIsModify(leftObjectdelta); assertEquals("Wrong delta OID", USER_JACK_OID, leftObjectdelta.getOid());
ObjectDelta<UserType> leftObjectdelta = deltas.getLeftObjectDelta(); PrismAsserts.assertIsModify(leftObjectdelta); assertEquals("Wrong delta OID", USER_JACK_OID, leftObjectdelta.getOid());
ObjectDelta<UserType> delta = deltas.getLeftObjectDelta(); PrismAsserts.assertIsModify(delta); assertEquals("Wrong delta OID", USER_GUYBRUSH_OID, delta.getOid());