/*
 * 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
//     12/14/2017-3.0 Tomas Kraus
//       - 522635: ConcurrentModificationException when triggering lazy load from conforming query
package org.eclipse.persistence.internal.identitymaps;

import java.util.*;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.indirection.ValueHolderInterface;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.mappings.ForeignReferenceMapping;


/**
 * <p><b>Purpose</b>: Provide the capability to not cache objects at all.
 * <p><b>Responsibilities</b>:<ul>
 * <li> Do nothing when an object is cached.
 * </ul>
 * @since TOPLink/Java 1.0
 */
public class NoIdentityMap extends AbstractIdentityMap {

    public NoIdentityMap(int size, ClassDescriptor descriptor, AbstractSession session, boolean isolated) {
        super(size, descriptor, session, isolated);
    }

    /**
     * NoIdentityMap has no locks.
     */
    @Override
    public void collectLocks(HashMap threadList) {
        return;
    }

    /**
     * Return an empty enumerator.
     */
    @Override
    public Enumeration elements() {
        return Collections.<Object>emptyEnumeration();
    }

    /**
     * Return null as no objects are cached.
     */
    @Override
    public Object get(Object primaryKey) {
        return null;
    }

    /**
     * Return null as no objects are cached.
     */
    @Override
    public CacheKey getCacheKey(Object searchKey, boolean forMerge) {
        return null;
    }

    /**
     * Return null as no objects are cached.
     */
    @Override
    protected CacheKey putCacheKeyIfAbsent(CacheKey cacheKey) {
        return null;
    }

    /**
     * Return 0 as no objects are cached.
     */
    @Override
    public int getSize() {
        return 0;
    }

    /**
     * Return 0 as no objects are cached.
     */
    @Override
    public int getSize(Class<?> myClass, boolean recurse) {
        return 0;
    }

    /**
     * Return null as no objects are cached.
     */
    @Override
    public Object getWriteLockValue(Object primaryKey) {
        return null;
    }

    /**
     * Return an empty enumerator.
     */
    @Override
    public Enumeration<CacheKey> keys() {
        return Collections.<CacheKey>emptyEnumeration();
    }

    /**
     * Return an empty enumerator.
     */
    @Override
    public Enumeration<CacheKey> cloneKeys() {
        return Collections.<CacheKey>emptyEnumeration();
    }

    /**
     * Return an empty enumerator.
     */
    @Override
    public Enumeration<CacheKey> keys(boolean checkReadLocks) {
        return Collections.<CacheKey>emptyEnumeration();
    }

    /**
     * Notify the cache that a lazy relationship has been triggered in the object
     * and the cache may need to be updated
     */
    @Override
    public void lazyRelationshipLoaded(Object object, ValueHolderInterface valueHolder, ForeignReferenceMapping mapping){
        //NO-OP
    }

    /**
     * Do Nothing.
     */
    @Override
    public CacheKey put(Object primaryKey, Object object, Object writeLockValue, long readTime) {
        return null;
    }

    /**
     * Do Nothing.
     * Return null, since no objects are cached.
     */
    @Override
    public Object remove(Object primaryKey, Object object) {
        return null;
    }

    /**
     * Do Nothing.
     * Return null, since no objects are cached.
     */
    @Override
    public Object remove(CacheKey searchKey) {
        return null;
    }

    /**
     * Do Nothing.
     */
    @Override
    public void setWriteLockValue(Object primaryKey, Object writeLockValue) {
        return;
    }
}
