private ObjectDelta createAddingObjectDelta() throws SchemaException { PrismObject object = this.object.clone(); List<ContainerWrapper> containers = getContainers(); // sort containers by path size Collections.sort(containers, new PathSizeComparator()); for (ContainerWrapper containerWrapper : getContainers()) { if (containerWrapper.getItemDefinition().getName().equals(ShadowType.F_ASSOCIATION)) { PrismContainer associationContainer = object.findOrCreateContainer(ShadowType.F_ASSOCIATION); List<AssociationWrapper> associationItemWrappers = (List<AssociationWrapper>) containerWrapper.getItems(); for (AssociationWrapper associationItemWrapper : associationItemWrappers) { List<ValueWrapper> assocValueWrappers = associationItemWrapper.getValues(); for (ValueWrapper assocValueWrapper : assocValueWrappers) { PrismContainerValue<ShadowAssociationType> assocValue = (PrismContainerValue<ShadowAssociationType>) assocValueWrapper.getValue(); associationContainer.add(assocValue.clone()); } } continue; } if (!containerWrapper.hasChanged()) { continue; } PrismContainer container = containerWrapper.getItem(); ItemPath path = containerWrapper.getPath(); if (containerWrapper.getPath() != null) { container = container.clone(); if (path.size() > 1) { ItemPath parentPath = path.allExceptLast(); PrismContainer parent = object.findOrCreateContainer(parentPath); parent.add(container); } else { PrismContainer existing = object.findContainer(container.getElementName()); if (existing == null) { object.add(container); } else { continue; } } } else { container = object; } for (ItemWrapper propertyWrapper : (List<ItemWrapper>) containerWrapper.getItems()) { if (!propertyWrapper.hasChanged()) { continue; } Item property = propertyWrapper.getItem().clone(); if (container.findProperty(property.getElementName()) != null) { continue; } for (ValueWrapper valueWrapper : propertyWrapper.getValues()) { valueWrapper.normalize(object.getPrismContext()); if (!valueWrapper.hasValueChanged() || ValueStatus.DELETED.equals(valueWrapper.getStatus())) { continue; } if (property.hasRealValue(valueWrapper.getValue())) { continue; } PrismValue cloned = clone(valueWrapper.getValue()); if (cloned != null) { property.add(cloned); } } if (!property.isEmpty()) { container.add(property); } } } // cleanup empty containers cleanupEmptyContainers(object); ObjectDelta delta = ObjectDelta.createAddDelta(object); // returning container to previous order Collections.sort(containers, new ItemWrapperComparator()); if (InternalsConfig.consistencyChecks) { delta.checkConsistence(true, true, true, ConsistencyCheckScope.THOROUGH); } return delta; }
public ObjectDelta getObjectDelta() throws SchemaException { if (ContainerStatus.ADDING.equals(getStatus())) { return createAddingObjectDelta(); } ObjectDelta delta = new ObjectDelta(object.getCompileTimeClass(), ChangeType.MODIFY, object.getPrismContext()); delta.setOid(object.getOid()); List<ContainerWrapper> containers = getContainers(); // sort containers by path size Collections.sort(containers, new PathSizeComparator()); for (ContainerWrapper containerWrapper : getContainers()) { // create ContainerDelta for association container // HACK HACK HACK create correct procession for association container data // according to its structure if (containerWrapper.getItemDefinition().getName().equals(ShadowType.F_ASSOCIATION)) { ContainerDelta<ShadowAssociationType> associationDelta = ContainerDelta.createDelta( ShadowType.F_ASSOCIATION, containerWrapper.getItemDefinition()); List<AssociationWrapper> associationItemWrappers = (List<AssociationWrapper>) containerWrapper.getItems(); for (AssociationWrapper associationItemWrapper : associationItemWrappers) { List<ValueWrapper> assocValueWrappers = associationItemWrapper.getValues(); for (ValueWrapper assocValueWrapper : assocValueWrappers) { PrismContainerValue<ShadowAssociationType> assocValue = (PrismContainerValue<ShadowAssociationType>) assocValueWrapper.getValue(); if (assocValueWrapper.getStatus() == ValueStatus.DELETED) { associationDelta.addValueToDelete(assocValue.clone()); } else if (assocValueWrapper.getStatus().equals(ValueStatus.ADDED)) { associationDelta.addValueToAdd(assocValue.clone()); } } } delta.addModification(associationDelta); } else { if (!containerWrapper.hasChanged()) { continue; } for (ItemWrapper itemWrapper : (List<ItemWrapper>) containerWrapper.getItems()) { if (!itemWrapper.hasChanged()) { continue; } ItemPath containerPath = containerWrapper.getPath() != null ? containerWrapper.getPath() : new ItemPath(); if (itemWrapper instanceof PropertyWrapper) { ItemDelta pDelta = computePropertyDeltas((PropertyWrapper) itemWrapper, containerPath); if (!pDelta.isEmpty()) { delta.addModification(pDelta); } } if (itemWrapper instanceof ReferenceWrapper) { ReferenceDelta pDelta = computeReferenceDeltas((ReferenceWrapper) itemWrapper, containerPath); if (!pDelta.isEmpty()) { delta.addModification(pDelta); } } } } } // returning container to previous order Collections.sort(containers, new ItemWrapperComparator()); // Make sure we have all the definitions if (object.getPrismContext() != null) { object.getPrismContext().adopt(delta); } return delta; }