net.sf.jasperreports.repo.JasperDesignCache.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jasperreports.repo.JasperDesignCache.java

Source

/*
 * 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 <http://www.gnu.org/licenses/>.
 */
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 (teodord@users.sourceforge.net)
 */
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<String, JasperDesignReportResource> cachedResourcesMap = new ConcurrentHashMap<String, JasperDesignReportResource>();
    private Map<Pair<String, UUID>, List<JRStyle>> reportStyles = new ConcurrentHashMap<Pair<String, UUID>, List<JRStyle>>();
    //private Map<UUID, String> cachedSubreportsMap = new HashMap<UUID, String>();

    /**
     * 
     */
    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<String, JasperDesignReportResource> getCachedResources() {
        return cachedResourcesMap;
    }

    public List<JRStyle> getStyles(String reportURI, UUID id) {
        return reportStyles.get(new Pair<String, UUID>(reportURI, id));
    }

    public void setStyles(String reportURI, UUID id, List<JRStyle> styles) {
        if (log.isDebugEnabled()) {
            log.debug("Setting " + styles.size() + " styles for " + reportURI + " and " + id);
        }

        reportStyles.put(new Pair<String, UUID>(reportURI, id), styles);
    }

    public String locateReport(JasperReport jasperReport) {
        for (Entry<String, JasperDesignReportResource> 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;
    }
}