/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. 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/>.
*/
/*
* Contributors:
* Artur Biesiadowski - abies@users.sourceforge.net
*/
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 net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JRTemplate;
import net.sf.jasperreports.engine.util.JRLoader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;
/**
* Utility class that loads {@link JRTemplate templates} from XML representations.
*
* @author Lucian Chirita (lucianc@users.sourceforge.net)
* @version $Id: JRXmlTemplateLoader.java 3690 2010-04-06 12:23:17Z shertage $
*/
public class JRXmlTemplateLoader
{
private static final Log log = LogFactory.getLog(JRXmlTemplateLoader.class);
protected JRXmlTemplateLoader()
{
}
/**
* 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 JRLoader#loadBytesFromLocation(String)
*/
public static JRTemplate load(String location) throws JRException
{
byte[] data = JRLoader.loadBytesFromLocation(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 static JRTemplate load(File file)
{
BufferedInputStream fileIn;
try
{
fileIn = new BufferedInputStream(new FileInputStream(file));
}
catch (FileNotFoundException e)
{
throw new JRRuntimeException("Template XML file not found", 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 static JRTemplate load(URL url)
{
InputStream input;
try
{
input = url.openStream();
}
catch (IOException e)
{
throw new JRRuntimeException("Error opening connection to template URL " + 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 static JRTemplate load(InputStream data)
{
JRXmlTemplateLoader loader = new JRXmlTemplateLoader();
return loader.loadTemplate(data);
}
protected JRTemplate loadTemplate(InputStream data)
{
JRXmlDigester digester = JRXmlTemplateDigesterFactory.instance().createDigester();
try
{
return (JRTemplate) digester.parse(data);
}
catch (IOException e)
{
throw new JRRuntimeException("Error reading template XML", e);
}
catch (SAXException e)
{
throw new JRRuntimeException("Error parsing template XML", e);
}
}
}