org.eclipse.persistence.descriptors.changetracking.ObjectChangePolicy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eclipselink Show documentation
Show all versions of eclipselink Show documentation
EclipseLink build based upon Git transaction f2b9fc5
/*
* Copyright (c) 1998, 2019 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.descriptors.changetracking;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
import org.eclipse.persistence.internal.descriptors.*;
import org.eclipse.persistence.internal.descriptors.changetracking.ObjectChangeListener;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
import org.eclipse.persistence.mappings.ForeignReferenceMapping;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import java.util.*;
/**
* INTERNAL:
* Implementers of ObjectChangePolicy implement the code which computes changes sets
* for the UnitOfWork commit process. An ObjectChangePolicy is stored on an
* Object's descriptor.
* @see DeferredChangeDetectionPolicy
* @see ObjectChangeTrackingPolicy
* @see AttributeChangeTrackingPolicy
* @author Tom Ware
*/
public interface ObjectChangePolicy extends Serializable {
/**
* INTERNAL:
* CalculateChanges creates a change set for a new object.
* @return ObjectChangeSet an object change set describing the changes to this object
* @param clone the Object to compute a change set for
* @param changes the change set to add changes to
* @param unitOfWork the current session
* @param descriptor the descriptor for this object
* @param shouldRaiseEvent indicates whether PreUpdate event should be risen (usually true)
*/
ObjectChangeSet calculateChangesForNewObject(Object clone, UnitOfWorkChangeSet changes, UnitOfWorkImpl unitOfWork, ClassDescriptor descriptor, boolean shouldRaiseEvent);
/**
* INTERNAL:
* CalculateChanges creates a change set for an existing object.
* @return ObjectChangeSet an object change set describing the changes to this object
* @param clone the Object to compute a change set for
* @param changes the change set to add changes to
* @param unitOfWork the current session
* @param descriptor the descriptor for this object
* @param shouldRaiseEvent indicates whether PreUpdate event should be risen (usually true)
*/
ObjectChangeSet calculateChangesForExistingObject(Object clone, UnitOfWorkChangeSet changes, UnitOfWorkImpl unitOfWork, ClassDescriptor descriptor, boolean shouldRaiseEvent);
/**
* INTERNAL:
* CalculateChanges creates a change set for an existing object.
* @return ObjectChangeSet an object change set describing the changes to this object
* @param clone the object to compute a change set for
* @param backupClone the object used to compute changes from
* @param isNew determines if the object is new
* @param changes the change set to add changes to
* @param unitOfWork the current session
* @param descriptor the descriptor for this object
* @param shouldRaiseEvent indicates whether PreUpdate event should be risen (usually true)
*/
ObjectChangeSet calculateChanges(Object clone, Object backupClone, boolean isNew, UnitOfWorkChangeSet changes, UnitOfWorkImpl unitOfWork, ClassDescriptor descriptor, boolean shouldRaiseEvent);
/**
* INTERNAL:
* Create ObjectChangeSet through comparison. Used in cases where we need to force change calculation (ie aggregates)
*/
ObjectChangeSet createObjectChangeSetThroughComparison(Object clone, Object backUp, org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet changeSet, boolean isNew, AbstractSession session, ClassDescriptor descriptor);
/**
* INTERNAL:
* In cases where a relationship with detached or new entities is merged into itself previous changes may have been recorded for
* the detached/new entity that need to be updated.
*/
void updateListenerForSelfMerge(ObjectChangeListener listener, ForeignReferenceMapping mapping, Object source, Object target, UnitOfWorkImpl unitOfWork);
/**
* INTERNAL:
* This method is used to disable changetracking temporarily
*/
void dissableEventProcessing(Object changeTracker);
/**
* INTERNAL:
* This method is used to enable changetracking temporarily
*/
void enableEventProcessing(Object changeTracker);
/**
* INTERNAL:
* This may cause a property change event to be raised to a listener in the case that a listener exists.
* If there is no listener then this call is a no-op
*/
void raiseInternalPropertyChangeEvent(Object source, String propertyName, Object oldValue, Object newValue);
/**
* INTERNAL:
* This method is used to revert an object within the unit of work
*/
void revertChanges(Object clone, ClassDescriptor descriptor, UnitOfWorkImpl uow, Map cloneMapping, boolean forRefresh);
/**
* INTERNAL:
* This is a place holder for reseting the listener on one of the subclasses
*/
void clearChanges(Object object, UnitOfWorkImpl uow, ClassDescriptor descriptor, boolean forRefresh);
/**
* INTERNAL:
* This method is used internally to rest the policies back to original state
* This is used when the clones are to be reused.
*/
void updateWithChanges(Object clone, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow, ClassDescriptor descriptor);
/**
* INTERNAL:
* Return true if the Object should be compared, false otherwise. This method is implemented to allow
* run time determination of whether a change set should be computed for an object. In general, calculateChanges()
* will only be executed in a UnitOfWork if this method returns true.
* @param object the object that will be compared
* @param unitOfWork the active unitOfWork
* @param descriptor the descriptor for the current object
*/
boolean shouldCompareExistingObjectForChange(Object object, UnitOfWorkImpl unitOfWork, ClassDescriptor descriptor);
/**
* INTERNAL:
* Assign Changelistener to an aggregate object
*/
void setAggregateChangeListener(Object parent, Object aggregate, UnitOfWorkImpl uow, ClassDescriptor descriptor, String mappingAttribute);
/**
* INTERNAL:
* Assign appropriate ChangeListener to PropertyChangeListener based on the policy.
*/
PropertyChangeListener setChangeListener(Object clone, UnitOfWorkImpl uow, ClassDescriptor descriptor);
/**
* INTERNAL:
* Set the ObjectChangeSet on the Listener, initially used for aggregate support
*/
void setChangeSetOnListener(ObjectChangeSet objectChangeSet, Object clone);
/**
* INTERNAL:
* Build back up clone.
*/
Object buildBackupClone(Object clone, ObjectBuilder builder, UnitOfWorkImpl uow);
/**
* INTERNAL:
* initialize the Policy
*/
void initialize(AbstractSession session, ClassDescriptor descriptor);
/**
* Used to track instances of the change policies without doing an instance of check
*/
boolean isDeferredChangeDetectionPolicy();
/**
* Used to track instances of the change policies without doing an instance of check
*/
boolean isObjectChangeTrackingPolicy();
/**
* Used to track instances of the change policies without doing an instance of check
*/
boolean isAttributeChangeTrackingPolicy();
}