net.sf.jasperreports.repo.JasperDesignCache Maven / Gradle / Ivy
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see .
*/
package net.sf.jasperreports.repo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import net.sf.jasperreports.engine.JRConstants;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JRStyle;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.ReportContext;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.util.Pair;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.engine.xml.JRXmlWriter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Teodor Danciu ([email protected])
*/
public class JasperDesignCache implements Serializable
{
private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
private static final Log log = LogFactory.getLog(JasperDesignCache.class);
public static final String EXCEPTION_MESSAGE_KEY_INVALID_ENTRY = "repo.invalid.entry";
/**
*
*/
private static final String PARAMETER_JASPER_DESIGN_CACHE = "net.sf.jasperreports.parameter.jasperdesign.cache";
/**
*
*/
private JasperReportsContext jasperReportsContext;
private ReportCompiler reportCompiler;
private Map cachedResourcesMap = new ConcurrentHashMap();
private Map, List> reportStyles =
new ConcurrentHashMap, List>();
//private Map cachedSubreportsMap = new HashMap();
/**
*
*/
public static JasperDesignCache getInstance(JasperReportsContext jasperReportsContext, ReportContext reportContext)//FIXMECONTEXT a jr context change would be inconsistent
{
JasperDesignCache cache = null;
if (reportContext != null)
{
cache = (JasperDesignCache)reportContext.getParameterValue(PARAMETER_JASPER_DESIGN_CACHE);
if (cache == null)
{
cache = new JasperDesignCache(jasperReportsContext);
reportContext.setParameterValue(PARAMETER_JASPER_DESIGN_CACHE, cache);
}
}
return cache;
}
public static JasperDesignCache getExistingInstance(ReportContext reportContext)
{
JasperDesignCache cache = null;
if (reportContext != null)
{
cache = (JasperDesignCache) reportContext.getParameterValue(PARAMETER_JASPER_DESIGN_CACHE);
}
return cache;
}
/**
*
*/
private JasperDesignCache(JasperReportsContext jasperReportsContext)
{
this.jasperReportsContext = jasperReportsContext;
this.reportCompiler = new DefaultReportCompiler(jasperReportsContext);
}
/**
*
*/
public JasperReport getJasperReport(String uri)
{
JasperDesignReportResource resource = getResource(uri);
if (resource != null)
{
return resource.getReport();
}
return null;
}
/**
*
*/
public JasperDesign getJasperDesign(String uri)
{
JasperDesignReportResource resource = getResource(uri);
if (resource != null)
{
return resource.getJasperDesign();
}
return null;
}
/**
*
*/
public void set(String uri, JasperReport jasperReport)
{
JasperDesignReportResource resource = new JasperDesignReportResource();
resource.setReport(jasperReport);
cachedResourcesMap.put(uri, resource);
}
/**
*
*/
public void set(String uri, JasperDesign jasperDesign)
{
JasperDesignReportResource resource = new JasperDesignReportResource();
resource.setJasperDesign(jasperDesign);
cachedResourcesMap.put(uri, resource);
}
/**
*
*/
public void resetJasperReport(String uri)
{
JasperDesignReportResource resource = cachedResourcesMap.get(uri);
if (resource != null)
{
resource.setReport(null);
}
//cachedResourcesMap.put(uri, resource);
}
public JasperDesignReportResource remove(String uri)
{
return cachedResourcesMap.remove(uri);
}
public void set(String uri, JasperDesignReportResource resource)
{
cachedResourcesMap.put(uri, resource);
}
public void clear()
{
cachedResourcesMap.clear();
}
/**
*
*/
private JasperDesignReportResource getResource(String uri)
{
JasperDesignReportResource resource = cachedResourcesMap.get(uri);
if (resource != null)
{
JasperDesign jasperDesign = resource.getJasperDesign();
JasperReport jasperReport = resource.getReport();
if (jasperDesign == null)
{
if (jasperReport == null)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_INVALID_ENTRY,
new Object[]{"JasperDesignCache"});
}
else
{
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
new JRXmlWriter(jasperReportsContext).write(jasperReport, baos, "UTF-8");
bais = new ByteArrayInputStream(baos.toByteArray());
jasperDesign = JRXmlLoader.load(bais);
resource.setJasperDesign(jasperDesign);
}
catch (JRException e)
{
throw new JRRuntimeException(e);
}
finally
{
try
{
baos.close();
if (bais != null)
{
bais.close();
}
}
catch (IOException e)
{
}
}
}
}
else
{
if (jasperReport == null)
{
try
{
jasperReport = reportCompiler.compile(jasperDesign);
resource.setReport(jasperReport);
}
catch (JRException e)
{
throw new JRRuntimeException(e);
}
}
else
{
//nothing to do?
}
}
}
return resource;
}
/**
*
*/
public Map getCachedResources()
{
return cachedResourcesMap;
}
public List getStyles(String reportURI, UUID id)
{
return reportStyles.get(new Pair(reportURI, id));
}
public void setStyles(String reportURI, UUID id, List styles)
{
if (log.isDebugEnabled())
{
log.debug("Setting " + styles.size() + " styles for " + reportURI + " and " + id);
}
reportStyles.put(new Pair(reportURI, id), styles);
}
public String locateReport(JasperReport jasperReport)
{
for (Entry reportEntry : cachedResourcesMap.entrySet())
{
JasperReport entryReport = reportEntry.getValue().getReport();
//testing for object identity.
//should we also check for UUID? it doesn't seem necessary for now.
if (entryReport == jasperReport)
{
return reportEntry.getKey();
}
}
return null;
}
public void setReportCompiler(ReportCompiler reportCompiler)
{
this.reportCompiler = reportCompiler;
}
}