package org.apache.commons.jcs3.engine.control;

/*
 * 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
 *
 *   http://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.
 */

import java.util.Properties;

import org.apache.commons.jcs3.auxiliary.AuxiliaryCache;
import org.apache.commons.jcs3.engine.CompositeCacheAttributes;
import org.apache.commons.jcs3.engine.ElementAttributes;
import org.apache.commons.jcs3.engine.behavior.ICompositeCacheManager;
import org.apache.commons.jcs3.engine.behavior.IShutdownObserver;
import org.apache.commons.jcs3.engine.control.CompositeCache;

/** For testing. */
public class MockCompositeCacheManager
    implements ICompositeCacheManager
{
    /** The cache that was returned. */
    private CompositeCache<?, ?> cache;

    /** Properties with which this manager was configured. This is exposed for other managers. */
    private Properties configurationProperties;

    /**
     * @param cacheName
     * @return Returns a CompositeCache
     */
    @Override
    @SuppressWarnings("unchecked")
    public <K, V> CompositeCache<K, V> getCache( String cacheName )
    {
        if ( cache == null )
        {
//            System.out.println( "Creating mock cache" );
            CompositeCache<K, V> newCache =
                new CompositeCache<>( new CompositeCacheAttributes(), new ElementAttributes() );
            this.setCache( newCache );
        }

        return (CompositeCache<K, V>)cache;
    }

    @Override
    public <K, V> AuxiliaryCache<K, V> getAuxiliaryCache(String auxName, String cacheName)
    {
        return null;
    }

    /**
     * @param cache The cache to set.
     */
    public void setCache( CompositeCache<?, ?> cache )
    {
        this.cache = cache;
    }

    /**
     * @return Returns the cache.
     */
    public CompositeCache<?, ?> getCache()
    {
        return cache;
    }

    /**
     * This is exposed so other manager can get access to the props.
     * <p>
     * @param props
     */
    public void setConfigurationProperties( Properties props )
    {
        this.configurationProperties = props;
    }

    /**
     * This is exposed so other manager can get access to the props.
     * <p>
     * @return the configurationProperties
     */
    @Override
    public Properties getConfigurationProperties()
    {
        return configurationProperties;
    }

    /** @return Mock */
    @Override
    public String getStats()
    {
        return "Mock";
    }

	/**
	 * @see org.apache.commons.jcs3.engine.behavior.IShutdownObservable#registerShutdownObserver(org.apache.commons.jcs3.engine.behavior.IShutdownObserver)
	 */
	@Override
	public void registerShutdownObserver(IShutdownObserver observer)
	{
		// Do nothing
	}

	/**
	 * @see org.apache.commons.jcs3.engine.behavior.IShutdownObservable#deregisterShutdownObserver(org.apache.commons.jcs3.engine.behavior.IShutdownObserver)
	 */
	@Override
	public void deregisterShutdownObserver(IShutdownObserver observer)
	{
		// Do nothing
	}
}
