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