/******************************************************************************* | |
* 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; | |
} | |
} | |
} |