/** * INTERNAL: * This method is called from clone and register. It includes the processing * required to clone an object, including populating attributes, putting in * UOW identitymap and building a backupclone */ protected void populateAndRegisterObject(Object original, Object workingClone, CacheKey unitOfWorkCacheKey, CacheKey parentCacheKey, ClassDescriptor descriptor) { // This must be registered before it is built to avoid cycles. unitOfWorkCacheKey.setObject(workingClone); unitOfWorkCacheKey.setReadTime(parentCacheKey.getReadTime()); unitOfWorkCacheKey.setWriteLockValue(parentCacheKey.getWriteLockValue()); //Set ChangeListener for ObjectChangeTrackingPolicy and AttributeChangeTrackingPolicy, //but not DeferredChangeDetectionPolicy. Build backup clone for DeferredChangeDetectionPolicy //or ObjectChangeTrackingPolicy, but not for AttributeChangeTrackingPolicy. // - Set listener before populating attributes so aggregates can find the parent's listener ObjectChangePolicy changePolicy = descriptor.getObjectChangePolicy(); changePolicy.setChangeListener(workingClone, this, descriptor); changePolicy.dissableEventProcessing(workingClone); ObjectBuilder builder = descriptor.getObjectBuilder(); builder.populateAttributesForClone(original, parentCacheKey, workingClone, null, this); Object backupClone = changePolicy.buildBackupClone(workingClone, builder, this); // PERF: Avoid put if no backup clone. if (workingClone != backupClone) { getCloneMapping().put(workingClone, backupClone); } changePolicy.enableEventProcessing(workingClone); }
/** * INTERNAL: * This method creates a records change set for a particular object. * It should only be used by aggregates. * @return ObjectChangeSet */ public ObjectChangeSet compareForChange(Object clone, Object backUp, UnitOfWorkChangeSet changeSet, AbstractSession session) { // delegate the change comparison to this objects ObjectChangePolicy - TGW return descriptor.getObjectChangePolicy().calculateChanges(clone, backUp, backUp == null, changeSet, ((UnitOfWorkImpl)session), this.descriptor, true); }
if (isNew || descriptor.getObjectChangePolicy().shouldCompareExistingObjectForChange(object, this, descriptor)) { ObjectChangeSet changes = null; if (isNew) { changes = descriptor.getObjectChangePolicy().calculateChangesForNewObject(object, changeSet, this, descriptor, true); } else { changes = descriptor.getObjectChangePolicy().calculateChangesForExistingObject(object, changeSet, this, descriptor, true); Object object = newObjectsEnum.next(); ClassDescriptor descriptor = getDescriptor(object); ObjectChangeSet changes = descriptor.getObjectChangePolicy().calculateChangesForNewObject(object, changeSet, this, descriptor, true);
/** * Merge the attribute values. */ protected void mergeAttributeValue(Object targetAttributeValue, boolean isTargetUnInitialized, Object sourceAttributeValue, MergeManager mergeManager, AbstractSession targetSession) { // don't merge read-only attributes if (mergeManager.getSession().isClassReadOnly(sourceAttributeValue.getClass())) { return; } if (mergeManager.getSession().isClassReadOnly(targetAttributeValue.getClass())) { return; } // Toggle change tracking during the merge. ClassDescriptor descriptor = getReferenceDescriptor(sourceAttributeValue, mergeManager.getSession()); descriptor.getObjectChangePolicy().dissableEventProcessing(targetAttributeValue); try { descriptor.getObjectBuilder().mergeIntoObject(targetAttributeValue, isTargetUnInitialized, sourceAttributeValue, mergeManager, targetSession); } finally { descriptor.getObjectChangePolicy().enableEventProcessing(targetAttributeValue); } }
descriptor.getObjectChangePolicy().dissableEventProcessing(clone); try { descriptor.getObjectChangePolicy().enableEventProcessing(clone); descriptor.getObjectChangePolicy().revertChanges(clone, descriptor, (UnitOfWorkImpl)this.session, ((UnitOfWorkImpl)this.session).getCloneMapping()); Vector primaryKey = this.session.keyFromObject(clone); if (descriptor.usesOptimisticLocking()) {
if ((this.getDescriptor().getObjectChangePolicy().isObjectChangeTrackingPolicy()) && (target instanceof ChangeTracker) && (((ChangeTracker)target)._persistence_getPropertyChangeListener() != null)) { fireChangeEvents = true; if (fireChangeEvents && (getDescriptor().getObjectChangePolicy().isAttributeChangeTrackingPolicy())) {
if ( newValue == null ) { // attribute set to null changeRecord.setChangedObject(null); if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ if(oldValue != null) { changeRecord.setChangedObject(referenceDescriptor.getObjectChangePolicy().createObjectChangeSetThroughComparison(newValue,oldValue, uowChangeSet, (oldValue == null), uow, referenceDescriptor)); referenceDescriptor.getObjectChangePolicy().setChangeSetOnListener((ObjectChangeSet)changeRecord.getChangedObject(), newValue); if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ changeRecord.setChangedObject(referenceDescriptor.getObjectChangePolicy().createObjectChangeSetThroughComparison(sourceClone, null, (UnitOfWorkChangeSet)objectChangeSet.getUOWChangeSet(), true, uow, referenceDescriptor));
/** * Create the identity map for the unit of work. * PERF: UOW uses a special map to avoid locks, always full, and can use special weak refs. */ public IdentityMap buildNewIdentityMapForUnitOfWork(UnitOfWorkImpl unitOfwork, ClassDescriptor descriptor) { ReferenceMode mode = unitOfwork.getReferenceMode(); if (mode == ReferenceMode.FORCE_WEAK) { return new WeakUnitOfWorkIdentityMap(32, descriptor); } else if ((mode == ReferenceMode.WEAK) // Only allow weak if using change tracking. && descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()) { return new WeakUnitOfWorkIdentityMap(32, descriptor); } else { return new UnitOfWorkIdentityMap(32, descriptor); } }
if ((this.descriptor.getObjectChangePolicy().isObjectChangeTrackingPolicy()) && (target instanceof ChangeTracker) && (((ChangeTracker)target)._persistence_getPropertyChangeListener() != null)) { this.descriptor.getObjectChangePolicy().updateListenerForSelfMerge(listener, this, object, mergedObject, (UnitOfWorkImpl) mergeManager.getSession()); if (fireChangeEvents && (this.descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy())) {
if (!descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy() ){ writeQuery.getObjectChangeSet().clear(); if (descriptor.getObjectChangePolicy().calculateChangesForExistingObject(object, uowChangeSet, ((UnitOfWorkImpl)session), descriptor, false) == null) {
Object backupClone = descriptor.getObjectChangePolicy().buildBackupClone(clone, builder, this);
getObjectChangePolicy().initialize(session, this);
descriptor.getObjectChangePolicy().dissableEventProcessing(clone); try { descriptor.getObjectChangePolicy().enableEventProcessing(clone); descriptor.getObjectChangePolicy().revertChanges(clone, descriptor, (UnitOfWorkImpl)this.session, ((UnitOfWorkImpl)this.session).getCloneMapping(), true); if (primaryKey == null) { return clone;
/** * Merge the attribute values. */ protected void mergeAttributeValue(Object targetAttributeValue, boolean isTargetUnInitialized, Object sourceAttributeValue, MergeManager mergeManager) { // don't merge read-only attributes if (mergeManager.getSession().isClassReadOnly(sourceAttributeValue.getClass())) { return; } if (mergeManager.getSession().isClassReadOnly(targetAttributeValue.getClass())) { return; } // Toggle change tracking during the merge. ClassDescriptor descriptor = getReferenceDescriptor(sourceAttributeValue, mergeManager.getSession()); descriptor.getObjectChangePolicy().dissableEventProcessing(targetAttributeValue); try { descriptor.getObjectBuilder().mergeIntoObject(targetAttributeValue, isTargetUnInitialized, sourceAttributeValue, mergeManager); } finally { descriptor.getObjectChangePolicy().enableEventProcessing(targetAttributeValue); } }
if ((this.getDescriptor().getObjectChangePolicy().isObjectChangeTrackingPolicy()) && (target instanceof ChangeTracker) && (((ChangeTracker)target)._persistence_getPropertyChangeListener() != null)) { fireChangeEvents = true; if (fireChangeEvents && (getDescriptor().getObjectChangePolicy().isAttributeChangeTrackingPolicy())) {
if ( newValue == null ) { // attribute set to null changeRecord.setChangedObject(null); if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ if(((ChangeTracker)oldValue)._persistence_getPropertyChangeListener() != null) { if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ if(oldValue != null && ((ChangeTracker)oldValue)._persistence_getPropertyChangeListener() != null) { changeRecord.setChangedObject(referenceDescriptor.getObjectChangePolicy().createObjectChangeSetThroughComparison(newValue,oldValue, uowChangeSet, (oldValue == null), uow, referenceDescriptor)); referenceDescriptor.getObjectChangePolicy().setChangeSetOnListener((ObjectChangeSet)changeRecord.getChangedObject(), newValue); if (referenceDescriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()){ changeRecord.setChangedObject(referenceDescriptor.getObjectChangePolicy().createObjectChangeSetThroughComparison(sourceClone, null, (UnitOfWorkChangeSet)objectChangeSet.getUOWChangeSet(), true, uow, referenceDescriptor));
if (!descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy()) { backupClone = builder.buildNewInstance();
if ((this.descriptor.getObjectChangePolicy().isObjectChangeTrackingPolicy()) && (target instanceof ChangeTracker) && (((ChangeTracker)target)._persistence_getPropertyChangeListener() != null)) { this.descriptor.getObjectChangePolicy().updateListenerForSelfMerge(listener, this, object, mergedObject, (UnitOfWorkImpl) mergeManager.getSession()); if (fireChangeEvents && (this.descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy())) {
if (!descriptor.getObjectChangePolicy().isAttributeChangeTrackingPolicy() ){ if (descriptor.getObjectChangePolicy().calculateChangesForExistingObject(object, uowChangeSet, ((UnitOfWorkImpl)session), descriptor, false) == null) {
Object backupClone = descriptor.getObjectChangePolicy().buildBackupClone(clone, builder, this);