/** * Cascade private parts, this can be used to merge clone when using RMI. */ public void cascadePrivateParts() { setCascadePolicy(CASCADE_PRIVATE_PARTS); }
/** * Merge only direct parts, this can be used to merge clone when using RMI. */ public void dontCascadeParts() { setCascadePolicy(NO_CASCADE); }
/** * Cascade all parts, this is the default for the merge. */ public void cascadeAllParts() { setCascadePolicy(CASCADE_ALL_PARTS); }
/** * INTERNAL: * Clear changes in the ChangeListener of the clone */ public void updateWithChanges(Object clone, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow, ClassDescriptor descriptor) { if (objectChangeSet == null) { return; } Object backupClone = uow.getCloneMapping().get(clone); if (backupClone != null) { MergeManager mergeManager = new MergeManager(uow); mergeManager.setCascadePolicy(MergeManager.NO_CASCADE); descriptor.getObjectBuilder().mergeChangesIntoObject(backupClone, objectChangeSet, clone, mergeManager); } clearChanges(clone, uow, descriptor); }
/** * INTERNAL: * Revert the object's attributes from the parent. * This uses merging to merge the object changes. */ public Object revertObject(Object clone, int cascadeDepth) { if (clone == null) { return null; } //CR#2272 logDebugMessage(clone, "revert"); ClassDescriptor descriptor = getDescriptor(clone); ObjectBuilder builder = descriptor.getObjectBuilder(); Object implementation = builder.unwrapObject(clone, this); MergeManager manager = new MergeManager(this); manager.mergeOriginalIntoWorkingCopy(); manager.setCascadePolicy(cascadeDepth); try { manager.mergeChanges(implementation, null); } catch (RuntimeException exception) { return handleException(exception); } return clone; }
/** * INTERNAL: * Merge the attributes of the clone into the unit of work copy. */ public Object mergeClone(Object rmiClone, int cascadeDepth) { if (rmiClone == null) { return null; } //CR#2272 logDebugMessage(rmiClone, "merge_clone"); startOperationProfile(SessionProfiler.Merge); ObjectBuilder builder = getDescriptor(rmiClone).getObjectBuilder(); Object implementation = builder.unwrapObject(rmiClone, this); MergeManager manager = new MergeManager(this); manager.mergeCloneIntoWorkingCopy(); manager.setCascadePolicy(cascadeDepth); Object merged = null; try { merged = manager.mergeChanges(implementation, null); } catch (RuntimeException exception) { merged = handleException(exception); } endOperationProfile(SessionProfiler.Merge); return merged; }
manager.setCascadePolicy(cascadePolicy); manager.setForceCascade(forceCascade); Object mergedObject = manager.mergeChanges(implementation, null);