/*
 * 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
<<<<<<< Updated upstream
 *
 *     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
=======
 * 
 *     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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

/*
 * DataStoreCache.java
 *
 */
package javax.jdo.datastore;

import java.util.Collection;

/**
 * Many JDO implementations allow instances to be cached in a second-level cache, and allow direct
 * management of the cache by knowledgeable applications. This interface standardizes this behavior.
 *
 * @since 2.0
 * @version 2.0
 */
public interface DataStoreCache {

  /**
   * Evict the parameter instance from the second-level cache.
   *
   * @param oid the object id of the instance to evict.
   * @since 2.0
   */
  void evict(Object oid);

  /**
   * Evict the parameter instances from the second-level cache. All instances in the
   * PersistenceManager's cache are evicted from the second-level cache.
   *
   * @since 2.0
   */
  void evictAll();

  /**
   * Evict the parameter instances from the second-level cache.
   *
   * @param oids the object ids of the instance to evict.
   * @since 2.0
   */
  void evictAll(Object... oids);

  /**
   * Evict the parameter instances from the second-level cache.
   *
   * @param oids the object ids of the instance to evict.
   * @since 2.0
   */
  void evictAll(Collection<?> oids);

  /**
   * Evict the parameter instances from the second-level cache.
   *
   * @param pcClass the class of instances to evict
   * @param subclasses if true, evict instances of subclasses also
   * @since 2.1
   */
  void evictAll(boolean subclasses, Class<?> pcClass);

  /**
   * Pin the parameter instance in the second-level cache.
   *
   * @param oid the object id of the instance to pin.
   * @since 2.0
   */
  void pin(Object oid);

  /**
   * Pin the parameter instances in the second-level cache.
   *
   * @param oids the object ids of the instances to pin.
   * @since 2.0
   */
  void pinAll(Collection<?> oids);

  /**
   * Pin the parameter instances in the second-level cache.
   *
   * @param oids the object ids of the instances to pin.
   * @since 2.0
   */
  void pinAll(Object... oids);

  /**
   * Pin instances in the second-level cache.
   *
   * @param pcClass the class of instances to pin
   * @param subclasses if true, pin instances of subclasses also
   * @since 2.1
   */
  void pinAll(boolean subclasses, Class<?> pcClass);

  /**
   * Unpin the parameter instance from the second-level cache.
   *
   * @param oid the object id of the instance to unpin.
   * @since 2.0
   */
  void unpin(Object oid);

  /**
   * Unpin the parameter instances from the second-level cache.
   *
   * @param oids the object ids of the instance to evict.
   * @since 2.0
   */
  void unpinAll(Collection<?> oids);

  /**
   * Unpin the parameter instance from the second-level cache.
   *
   * @param oids the object id of the instance to evict.
   * @since 2.0
   */
  void unpinAll(Object... oids);

  /**
   * Unpin instances from the second-level cache.
   *
   * @param pcClass the class of instances to unpin
   * @param subclasses if true, unpin instances of subclasses also
   * @since 2.1
   */
  void unpinAll(boolean subclasses, Class<?> pcClass);

  /**
   * This class is an empty implementation of the DataStoreCache interface. It can be used by an
   * implementation that does not support a second-level cache.
   *
   * @since 2.0
   */
  public class EmptyDataStoreCache implements DataStoreCache {

    public EmptyDataStoreCache() {}

    public void evict(Object oid) {}

    public void evictAll() {}

    public void evictAll(Object... oids) {}

    public void evictAll(Collection<?> oids) {}

    public void evictAll(boolean subclasses, Class<?> pcClass) {}

    public void pin(Object oid) {}

    public void pinAll(Object... oids) {}

    public void pinAll(Collection<?> oids) {}

    public void pinAll(boolean subclasses, Class<?> pcClass) {}

    public void unpin(Object oid) {}

    public void unpinAll(Object... oids) {}

    public void unpinAll(Collection<?> oids) {}

    public void unpinAll(boolean subclasses, Class<?> pcClass) {}
  }
}
