net.sf.jasperreports.repo.JasperDesignCache Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jasperreports Show documentation
Show all versions of jasperreports Show documentation
Free Java Reporting Library
/*
* 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;
}
}