/*
 *
 * Apache Geronimo JCache Spec 1.0
 *
 * Copyright (C) 2003 - 2014 The Apache Software Foundation
 *
 * Licensed 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.
 * 
 */
package javax.cache;

import javax.cache.configuration.Configuration;
import javax.cache.spi.CachingProvider;
import java.io.Closeable;
import java.net.URI;
import java.util.Properties;

/**
 * The CacheManager is the central part to manually access a JCache cache.
 *
 */
public interface CacheManager extends Closeable {
    CachingProvider getCachingProvider();


    URI getURI();


    ClassLoader getClassLoader();


    Properties getProperties();


    <K, V, C extends Configuration<K, V>> Cache<K, V> createCache(String cacheName,
                                                                  C configuration)
            throws IllegalArgumentException;


    <K, V> Cache<K, V> getCache(String cacheName, Class<K> keyType,
                                Class<V> valueType);


    <K, V> Cache<K, V> getCache(String cacheName);


    Iterable<String> getCacheNames();


    void destroyCache(String cacheName);


    void enableManagement(String cacheName, boolean enabled);


    void enableStatistics(String cacheName, boolean enabled);


    void close();


    boolean isClosed();


    <T> T unwrap(java.lang.Class<T> clazz);
}
