/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.util; import java.io.Serializable; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.GeoServerExtensions.MultipleBeansException; import org.geotools.util.logging.Logging; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; public class DefaultCacheProvider implements CacheProvider { private static final Logger LOGGER = Logging.getLogger(DefaultCacheProvider.class); public static final int DEFAULT_CONCURRENCY_LEVEL = 4; public static final int DEFAULT_EXPIRATION_MINUTES = 20; public static final int DEFAULT_MAX_ENTRIES = 25000; public static final String BEAN_NAME_PROPERTY = "GEOSERVER_DEFAULT_CACHE_PROVIDER"; @Override public <K extends Serializable, V extends Serializable> Cache<K, V> getCache(String cacheName) { Cache<K, V> cache = CacheBuilder.newBuilder().weakValues() .concurrencyLevel(DEFAULT_CONCURRENCY_LEVEL) .expireAfterAccess(DEFAULT_EXPIRATION_MINUTES, TimeUnit.MINUTES) .maximumSize(DEFAULT_MAX_ENTRIES).build(); return cache; } public static CacheProvider findProvider() { CacheProvider cacheProvider = null; // Check for a named bean String providerNames = GeoServerExtensions.getProperty(BEAN_NAME_PROPERTY); if(providerNames!=null) { for(String providerName: providerNames.split("\\s*,\\s*")) { cacheProvider = (CacheProvider) (CacheProvider) GeoServerExtensions.bean(providerName); if(cacheProvider!=null) { LOGGER.log(Level.INFO, "Using specified Cache Provider ", providerName); break; } } if(cacheProvider == null) { LOGGER.log(Level.INFO, "{0} was specified but no beans matched it.", BEAN_NAME_PROPERTY); } } // Find a bean by interface if (cacheProvider == null) { try { cacheProvider = GeoServerExtensions.bean(CacheProvider.class); } catch (MultipleBeansException ex) { String providerName = ex.getAvailableBeans().iterator().next(); if(LOGGER.isLoggable(Level.WARNING)){ String available = StringUtils.join(ex.getAvailableBeans(), ", "); LOGGER.log(Level.WARNING, "Multiple Cache Providers in context: {0}\n\tUsing {1}. Override by setting system property {2}", new Object[]{available, providerName, BEAN_NAME_PROPERTY}); } cacheProvider = (CacheProvider) (CacheProvider) GeoServerExtensions.bean(providerName); } } // Use the default if (cacheProvider == null) { cacheProvider = new DefaultCacheProvider(); } return cacheProvider; } }