/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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 org.apereo.portal.utils.cache;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Statistics;
import net.sf.ehcache.Status;
import net.sf.ehcache.config.CacheConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* This class exposes some limited functions around the provided {@link CacheManager}. It is used
* within SpEL expressions by the Cache Manager portlet.
*/
@Service
public class CacheManagementHelper {
private static final class CaseInsenstivieStringComparator implements Comparator<String> {
public static final CaseInsenstivieStringComparator INSTANCE =
new CaseInsenstivieStringComparator();
@Override
public int compare(String o1, String o2) {
return o1.compareToIgnoreCase(o2);
}
}
protected final Log logger = LogFactory.getLog(this.getClass());
private CacheManager cacheManager;
/** @param cacheManager the cacheManager to set */
@Autowired
public void setCacheManager(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
public Map<String, CacheStatistics> getAllCacheStatistics() {
final Map<String, CacheStatistics> allCacheStatistics =
new TreeMap<String, CacheStatistics>(CaseInsenstivieStringComparator.INSTANCE);
for (final String cacheName : this.cacheManager.getCacheNames()) {
final Cache cache = this.cacheManager.getCache(cacheName);
if (null != cache && Status.STATUS_ALIVE.equals(cache.getStatus())) {
final CacheConfiguration cacheConfiguration = cache.getCacheConfiguration();
final Statistics statistics = cache.getStatistics();
final CacheStatistics cacheStatistics = new CacheStatistics();
cacheStatistics.hits = statistics.getCacheHits();
cacheStatistics.misses = statistics.getCacheMisses();
cacheStatistics.size = statistics.getObjectCount();
cacheStatistics.maxSize =
cacheConfiguration.getMaxElementsInMemory()
+ cacheConfiguration.getMaxElementsOnDisk();
allCacheStatistics.put(cacheName, cacheStatistics);
}
}
return allCacheStatistics;
}
/**
* @see Status#STATUS_ALIVE
* @see Cache#getStatus()
* @see Cache#getStatistics()
* @param cacheName
* @return the {@link Statistics} for the specified cache; returns null of cache is not alive or
* doesn't exist
*/
public Statistics getCacheStatistics(String cacheName) {
Cache cache = this.cacheManager.getCache(cacheName);
if (null != cache && Status.STATUS_ALIVE.equals(cache.getStatus())) {
Statistics result = cache.getStatistics();
return result;
}
return null;
}
/**
* Call {@link Cache#removeAll()} on the specified cache, if it exists and is alive.
*
* @see Status#STATUS_ALIVE
* @see Cache#getStatus()
* @param cacheName
*/
public void clearCache(String cacheName) {
Cache cache = this.cacheManager.getCache(cacheName);
if (null != cache && Status.STATUS_ALIVE.equals(cache.getStatus())) {
cache.removeAll();
logger.warn("finished removeAll for cache: " + cacheName);
}
}
/** Call {@link #clearCache(String)} on ALL caches. */
public void clearAllCaches() {
logger.warn("beginning request to clear all caches");
for (final String cacheName : this.cacheManager.getCacheNames()) {
clearCache(cacheName);
}
logger.warn("completed request to clear all caches");
}
public static class CacheStatistics {
public long hits;
public long misses;
public long size;
public long maxSize;
public long getHits() {
return hits;
}
public long getMisses() {
return misses;
}
public long getSize() {
return size;
}
public long getMaxSize() {
return maxSize;
}
public double getUsage() {
if (this.maxSize == 0) {
return 0;
}
return (double) this.size / (double) this.maxSize;
}
public double getEffectiveness() {
final double requests = this.hits + this.misses;
if (requests == 0) {
return 0;
}
return (double) this.hits / requests;
}
}
}