/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * InstanceCallbacks.java
 *
 */

package javax.jdo;

/**
 * A <code>PersistenceCapable</code> class that provides callback methods for life cycle events
 * implements this interface.
 *
 * <p>For JDO 2.0, <code>InstanceCallbacks</code> has been refactored to extend four other
 * interfaces, without changing any of the methods or semantics. This allows fine-grained control
 * over callbacks, for example to allow a class to implement the load callback without implementing
 * any of the other callbacks. For backward compatibility with JDO 1.0, the <code>InstanceCallbacks
 * </code> interface is preserved.
 *
 * <p>Classes which include non-persistent fields whose values depend on the values of persistent
 * fields require callbacks on specific JDO instance life cycle events in order to correctly
 * populate the values in these fields.
 *
 * <p>The callbacks might also be used if the persistent instances need to be put into the runtime
 * infrastructure of the application. For example, a persistent instance might notify other
 * instances on changes to state. The persistent instance might be in a list of managed instances.
 * When the persistent instance is made hollow, it can no longer generate change events, and the
 * persistent instance should be removed from the list of managed instances.
 *
 * <p>To implement this, the application programmer would implement <code>jdoPostLoad</code> to put
 * itself into the list of managed instances, and implement <code>jdoPreClear</code> to remove
 * itself from the list. With JDO 1.0, the domain class would be declared to implement <code>
 * InstanceCallbacks</code>. With JDO 2.0, the domain class would be declared to implement <code>
 * javax.jdo.listener.LoadCallback</code> and <code>javax.jdo.listener.ClearCallback</code>.
 *
 * <p>Note that JDO does not manage the state of non-persistent fields, and when a JDO instance
 * transitions to hollow, JDO clears the persistent fields. It is the programmer's responsibility to
 * clear non-persistent fields so that garbage collection of referred instances can occur.
 *
 * @since 1.0
 * @version 2.0
 */
public interface InstanceCallbacks
    extends javax.jdo.listener.ClearCallback,
        javax.jdo.listener.DeleteCallback,
        javax.jdo.listener.LoadCallback,
        javax.jdo.listener.StoreCallback {}
