/*******************************************************************************
* Copyright (c) 2015 Development Gateway, Inc and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the MIT License (MIT)
* which accompanies this distribution, and is available at
* https://opensource.org/licenses/MIT
*
* Contributors:
* Development Gateway - initial API and implementation
*******************************************************************************/
package org.devgateway.toolkit.forms.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.Statistics;
import org.apache.commons.io.FileUtils;
import org.apache.wicket.markup.Markup;
import org.apache.wicket.markup.MarkupCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
/**
* @author idobre
* @since 3/3/16
*
* Class the removes the cache created in
* org.devgateway.ccrs.web.wicket.page.reports.AbstractReportPage#ResourceStreamPanel#getCacheKey
* function
*/
@Component
@Profile("reports")
public class MarkupCacheService {
protected static Logger logger = LoggerFactory.getLogger(MarkupCacheService.class);
/**
* start-key used to identify the reports markup
*/
private static final String START_NAME_REPORT_KEY = "REPORTMARKUP";
/**
* Flush markup cache for reports page
*/
public final void flushMarkupCache() {
final MarkupCache markupCacheClass = (MarkupCache) MarkupCache.get();
final MarkupCache.ICache<String, Markup> markupCache = markupCacheClass.getMarkupCache();
final Collection<String> keys = markupCache.getKeys();
for (String key : keys) {
// The key for reports markup cache contains the class name so it
// should end in "ReportPage"
if (key.startsWith(START_NAME_REPORT_KEY)) {
markupCacheClass.removeMarkup(key);
}
}
}
/**
* Add the content of a report (PDF, Excel, RTF) to cache
*
* @param outputType
* @param reportName
* @param parameters
* @param buffer
*/
public void addReportToCache(final String outputType, final String reportName, final String parameters,
final byte[] buffer) {
CacheManager cm = CacheManager.getInstance();
// get the reports cache "reportsCache", declared in ehcache.xml
Cache cache = cm.getCache("reportsCache");
cache.put(new Element(createCacheKey(outputType, reportName, parameters), buffer));
}
/**
* Fetch the content of a report from cache
*
* @param outputType
* @param reportName
* @param parameters
* @return
*/
public byte[] getReportFromCache(final String outputType, final String reportName, final String parameters) {
CacheManager cm = CacheManager.getInstance();
// get the reports cache "reportsCache", declared in ehcache.xml
Cache cache = cm.getCache("reportsCache");
String key = createCacheKey(outputType, reportName, parameters);
if (cache.isKeyInCache(key)) {
return (byte[]) cache.get(key).getObjectValue();
}
return null;
}
/**
* Display some statistics about reports cache
*/
public void getReportsStat() {
CacheManager cm = CacheManager.getInstance();
// get the reports cache "reportsCache", declared in ehcache.xml
Cache cache = cm.getCache("reportsCache");
@SuppressWarnings("unchecked")
List<String> cacheKeys = cache.getKeys();
long size = 0;
for (String k : cacheKeys) {
logger.info("key: " + k);
byte[] buf = (byte[]) cache.get(k).getObjectValue();
size += buf.length;
}
Statistics stats = cache.getStatistics();
StringBuffer sb = new StringBuffer();
sb.append(String.format("%s objects, %s hits, %s misses\n", stats.getObjectCount(), stats.getCacheHits(),
stats.getCacheMisses()));
logger.info(String.valueOf(sb));
logger.info("cache total size: " + FileUtils.byteCountToDisplaySize(size));
}
/**
* Remove from cache all reports content
*/
public void clearReportsCache() {
CacheManager cm = CacheManager.getInstance();
// get the reports cache "reportsCache", declared in ehcache.xml
Cache cache = cm.getCache("reportsCache");
if (cache != null) {
cache.removeAll();
}
}
/**
* Remove from cache all reports api content
*/
public void clearReportsApiCache() {
CacheManager cm = CacheManager.getInstance();
// get the reports cache "reportsApiCache", declared in ehcache.xml
Cache cache = cm.getCache("reportsApiCache");
if (cache != null) {
cache.removeAll();
}
}
private String createCacheKey(final String outputType, final String reportName, final String parameters) {
return reportName + "-" + parameters + "-" + outputType;
}
}