/** * INTERNAL: * Merge changes from the source to the target object. */ public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager) { ContainerPolicy containerPolicy = getContainerPolicy(); AbstractSession session = mergeManager.getSession(); // Iterate over the changes and merge the collections Vector aggregateObjects = ((AggregateCollectionChangeRecord)changeRecord).getChangedValues(); Object valueOfTarget = containerPolicy.containerInstance(); // Next iterate over the changes and add them to the container ObjectChangeSet objectChanges = null; int size = aggregateObjects.size(); for (int index = 0; index < size; ++index) { objectChanges = (ObjectChangeSet)aggregateObjects.get(index); // Since the CompositeCollectionMapping only registers an all or none // change set, we can simply replace the entire collection; containerPolicy.addInto(buildElementFromChangeSet(objectChanges, mergeManager), valueOfTarget, session); } setRealAttributeValueInObject(target, valueOfTarget); }
/** * INTERNAL: * Merge changes from the source to the target object. * Simply replace the entire target collection. */ public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager) { if (!mergeManager.shouldCascadeReferences()) { // This is only going to happen on mergeClone, and we should not attempt to merge the reference return; } ContainerPolicy containerPolicy = getContainerPolicy(); Object valueOfSource = getRealCollectionAttributeValueFromObject(source, mergeManager.getSession()); Object valueOfTarget = containerPolicy.containerInstance(containerPolicy.sizeFor(valueOfSource)); for (Object sourceValuesIterator = containerPolicy.iteratorFor(valueOfSource); containerPolicy.hasNext(sourceValuesIterator);) { Object sourceValue = containerPolicy.next(sourceValuesIterator, mergeManager.getSession()); //CR#2896 - TW Object originalValue = getReferenceDescriptor(sourceValue.getClass(), mergeManager.getSession()).getObjectBuilder().buildNewInstance(); getReferenceDescriptor(sourceValue.getClass(), mergeManager.getSession()).getObjectBuilder().mergeIntoObject(originalValue, true, sourceValue, mergeManager); containerPolicy.addInto(originalValue, valueOfTarget, mergeManager.getSession()); } // Must re-set variable to allow for set method to re-morph changes if the collection is not being stored directly. setRealAttributeValueInObject(target, valueOfTarget); }