blob: 1d0c388b3d54310315e73e0e92568b5d1e9e5e06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.internal.sessions;
/**
* This change Record is used to record the changes for AggregateObjectMapping.
*/
public class AggregateChangeRecord extends ChangeRecord implements org.eclipse.persistence.sessions.changesets.AggregateChangeRecord {
protected org.eclipse.persistence.sessions.changesets.ObjectChangeSet changedObject;
protected transient Object oldValue;
// assign NULL to oldValue to indicate that it has been set to null.
protected static final String NULL = "NULL";
/**
* This default constructor.
*/
public AggregateChangeRecord() {
super();
}
/**
* This constructor returns an ChangeRecord representing an AggregateMapping.
*/
public AggregateChangeRecord(ObjectChangeSet owner) {
this.owner = owner;
}
/**
* ADVANCED:
* This method is used to return the ObjectChangeSet representing the changed Aggregate.
*/
public org.eclipse.persistence.sessions.changesets.ObjectChangeSet getChangedObject() {
return changedObject;
}
/**
* INTERNAL:
* This method will be used to merge one record into another
*/
public void mergeRecord(ChangeRecord mergeFromRecord, UnitOfWorkChangeSet mergeToChangeSet, UnitOfWorkChangeSet mergeFromChangeSet) {
if (this.changedObject == null) {
this.changedObject = ((AggregateChangeRecord)mergeFromRecord).getChangedObject();
if(this.changedObject == null) {
return;
} else {
mergeToChangeSet.addObjectChangeSetForIdentity((ObjectChangeSet)this.changedObject, mergeFromChangeSet.getUOWCloneForObjectChangeSet(this.changedObject));
((ObjectChangeSet)this.changedObject).updateReferences(mergeToChangeSet, mergeFromChangeSet);
return;
}
}
((ObjectChangeSet)this.changedObject).mergeObjectChanges((ObjectChangeSet)((AggregateChangeRecord)mergeFromRecord).getChangedObject(), mergeToChangeSet, mergeFromChangeSet);
}
/**
* INTERNAL:
* This method is used to set the changed value or values.
*/
public void setChangedObject(org.eclipse.persistence.sessions.changesets.ObjectChangeSet newValue) {
changedObject = newValue;
if(this.oldValue == null) {
this.oldValue = newValue;
}
}
/**
* INTERNAL:
* This method will be used to update the objectsChangeSets references
* If this is an aggregate change set then there is no need to update the
* reference as the ChangeSet has no identity outside of this record
* Check to see if it exists here already to prevent us from creating a little
* extra garbage.
*/
public void updateReferences(UnitOfWorkChangeSet mergeToChangeSet, UnitOfWorkChangeSet mergeFromChangeSet) {
Object localChangeSet = mergeToChangeSet.getUOWCloneForObjectChangeSet(this.changedObject);
if (localChangeSet == null) {
mergeToChangeSet.addObjectChangeSetForIdentity((ObjectChangeSet)this.changedObject, mergeFromChangeSet.getUOWCloneForObjectChangeSet(this.changedObject));
}
}
/**
* ADVANCED:
* If the owning UnitOfWork has shouldChangeRecordKeepOldValue set to true,
* then return the old value of the attribute represented by this ChangeRecord.
*/
public Object getOldValue() {
if (oldValue == NULL) {
return null;
} else if (oldValue instanceof ObjectChangeSet) {
ObjectChangeSet changeSet = (ObjectChangeSet)oldValue;
return changeSet.getOldValue();
} else {
return this.oldValue;
}
}
/**
* INTERNAL:
* Set the old value of the attribute represented by this ChangeRecord.
*/
public void setOldValue(Object oldValue) {
if (oldValue == null) {
this.oldValue = NULL;
} else {
this.oldValue = oldValue;
}
}
}