net.sf.jasperreports.engine.xml.JRXmlTemplateLoader Maven / Gradle / Ivy
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2023 Cloud Software Group, 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 .
*/
/*
* Contributors:
* Artur Biesiadowski - [email protected]
*/
package net.sf.jasperreports.engine.xml;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;
import net.sf.jasperreports.engine.DefaultJasperReportsContext;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JRTemplate;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.repo.RepositoryContext;
import net.sf.jasperreports.repo.RepositoryUtil;
import net.sf.jasperreports.repo.SimpleRepositoryContext;
/**
* Utility class that loads {@link JRTemplate templates} from XML representations.
*
* @author Lucian Chirita ([email protected])
*/
public class JRXmlTemplateLoader
{
private static final Log log = LogFactory.getLog(JRXmlTemplateLoader.class);
public static final String EXCEPTION_MESSAGE_KEY_TEMPLATE_NOT_FOUND = "xml.template.loader.template.not.found";
public static final String EXCEPTION_MESSAGE_KEY_TEMPLATE_PARSING_ERROR = "xml.template.loader.template.parsing.error";
public static final String EXCEPTION_MESSAGE_KEY_TEMPLATE_READING_ERROR = "xml.template.loader.template.reading.error";
public static final String EXCEPTION_MESSAGE_KEY_URL_CONNECTION_ERROR = "xml.template.loader.url.connection.error";
private RepositoryContext repositoryContext;
/**
*
*/
private JRXmlTemplateLoader(RepositoryContext repositoryContext)
{
this.repositoryContext = repositoryContext;
}
/**
*
*/
private static JRXmlTemplateLoader getDefaultInstance()
{
return getInstance(DefaultJasperReportsContext.getInstance());
}
/**
*
*/
public static JRXmlTemplateLoader getInstance(JasperReportsContext jasperReportsContext)
{
return getInstance(SimpleRepositoryContext.of(jasperReportsContext));
}
public static JRXmlTemplateLoader getInstance(RepositoryContext repositoryContext)
{
return new JRXmlTemplateLoader(repositoryContext);
}
/**
* Parses a template XML found at a specified location into a {@link JRTemplate template object}.
*
* @param location the template XML location.
* Can be a URL, a file path or a classloader resource name.
* @return the template object
* @throws JRException when the location cannot be resolved or read
* @see RepositoryUtil#getBytesFromLocation(String)
*/
public JRTemplate loadTemplate(String location) throws JRException
{
byte[] data = RepositoryUtil.getInstance(repositoryContext).getBytesFromLocation(location);
return load(new ByteArrayInputStream(data));
}
/**
* Parses a template XML file into a {@link JRTemplate template object}.
*
* @param file the template XML file
* @return the template object
*/
public JRTemplate loadTemplate(File file)
{
BufferedInputStream fileIn;
try
{
fileIn = new BufferedInputStream(new FileInputStream(file));
}
catch (FileNotFoundException e)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_TEMPLATE_NOT_FOUND,
(Object[])null,
e);
}
try
{
return load(fileIn);
}
finally
{
try
{
fileIn.close();
}
catch (IOException e)
{
log.warn("Error closing XML file", e);
}
}
}
/**
* Parses a template XML located at a URL into a {@link JRTemplate template object}.
*
* @param url the location of the template XML
* @return the template object
*/
public JRTemplate loadTemplate(URL url)
{
InputStream input;
try
{
input = url.openStream();
}
catch (IOException e)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_URL_CONNECTION_ERROR,
new Object[]{url},
e);
}
try
{
return load(input);
}
finally
{
try
{
input.close();
}
catch (IOException e)
{
log.warn("Error closing connection to template URL " + url, e);
}
}
}
/**
* Parses a template XML data stream into a {@link JRTemplate template object}.
*
* @param data the data stream
* @return the template object
*/
public JRTemplate loadTemplate(InputStream data)
{
JRXmlDigester digester = JRXmlTemplateDigesterFactory.instance().createDigester(
repositoryContext.getJasperReportsContext());
try
{
return (JRTemplate) digester.parse(data);
}
catch (IOException e)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_TEMPLATE_READING_ERROR,
(Object[])null,
e);
}
catch (SAXException e)
{
throw
new JRRuntimeException(
EXCEPTION_MESSAGE_KEY_TEMPLATE_PARSING_ERROR,
(Object[])null,
e);
}
}
/**
* @see #loadTemplate(String)
*/
public static JRTemplate load(String location) throws JRException
{
return getDefaultInstance().loadTemplate(location);
}
/**
* @see #loadTemplate(File)
*/
public static JRTemplate load(File file)
{
return getDefaultInstance().loadTemplate(file);
}
/**
* @see #loadTemplate(URL)
*/
public static JRTemplate load(URL url)
{
return getDefaultInstance().loadTemplate(url);
}
/**
* @see #loadTemplate(InputStream)
*/
public static JRTemplate load(InputStream data)
{
return getDefaultInstance().loadTemplate(data);
}
}