/*
 * Copyright (c) 1998, 2021 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.internal.descriptors.changetracking;

import java.beans.*;
import java.io.Serializable;

/**
 * <p>
 * <b>Purpose</b>: Define a listener for object change tracking.
 * </p>
 * <p>
 * <b>Description</b>: Listener is notified on a PropertyChangeEvent from the object it belongs to.
 * </p>
 * <p>
 * <b>Responsibilities</b>: Set the flag to true when there is any change in the object.
 * </p>
 */
public class ObjectChangeListener implements PropertyChangeListener, Serializable {
    // when EclipseLink merges events should be ignored that are not issued by EclipseLink
    // ie when EclipseLink call setters.
    protected boolean ignoreEvents = false;

    // this is used to treat ignoreEvents as a nestable call. In numerous
    // places EclipseLink will disable events, do some work and re-enable. Within
    // that work there may be other disable/enable pairs. This flag will allow EclipseLink
    // to nest the disable/enable pairs and ensure the event is only enabled when the original
    // caller finally enables the events.
    protected int ignoreDepth = 0;

    protected boolean hasChanges;

    /**
     * INTERNAL:
     * Create a ObjectChangeListener
     */
    public ObjectChangeListener() {
        hasChanges = false;
    }

    /**
     * INTERNAL:
     * This method will set this listener to ignore events not issues by EclipseLink
     */
    public void ignoreEvents(){
        ++ignoreDepth;
        this.ignoreEvents = true;
    }

    /**
     * INTERNAL:
     * This method will set this listener to ignore events not issues by EclipseLink
     */
    public void processEvents(){
        --ignoreDepth;
        if (ignoreDepth == 0) {
            this.ignoreEvents = false;
        }
    }

    /**
     * PUBLIC:
     * This method turns marks the object as changed.
     */
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (this.ignoreEvents){
            return;
        }
        internalPropertyChange(evt);
    }

    /**
     * INTERNAL:
     * This method turns marks the object as changed.  This method is only
     * called by EclipseLink
     */
    public void internalPropertyChange(PropertyChangeEvent evt) {
        if (evt.getNewValue() == evt.getOldValue()) {
            return;
        }
        hasChanges = true;
    }

    /**
     * INTERNAL:
     * This method should return true if the object has been changed and false otherwise.  Changed
     * Objects will be compared for changes in the UnitOfWork commit process.  Unchanged objects
     * will not be compared.
     */
    public boolean hasChanges() {
        return hasChanges;
    }

    /**
     * INTERNAL:
     * Clear a change flag used in this method.  This will be called in TopLink's UnitOfWork
     * commit process when a change set has been calculated for an object.
     */
    public void clearChanges(boolean forRefresh) {
        hasChanges = false;
    }
}
