/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.parser.extwriter;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.base.ClassFactory;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.base.ClassFactoryCollector;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.datasource.DataSourceCollector;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.datasource.DataSourceFactory;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.elements.ElementFactory;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.elements.ElementFactoryCollector;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.stylekey.StyleKeyFactory;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.stylekey.StyleKeyFactoryCollector;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.templates.TemplateCollection;
import org.pentaho.reporting.engine.classic.core.modules.parser.ext.factory.templates.TemplateCollector;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.config.HierarchicalConfiguration;
import org.pentaho.reporting.libraries.base.config.ModifiableConfiguration;
import org.pentaho.reporting.libraries.resourceloader.ResourceKey;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import org.pentaho.reporting.libraries.xmlns.parser.AbstractXmlResourceFactory;
import org.pentaho.reporting.libraries.xmlns.writer.DefaultTagDescription;
import org.pentaho.reporting.libraries.xmlns.writer.TagDescription;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
/**
* A report writer.
*
* @author Thomas Morgner
*/
public class ReportWriter extends ReportWriterContext {
/**
* A data-source collector.
*/
private DataSourceCollector dataSourceCollector;
/**
* An element factory collector.
*/
private ElementFactoryCollector elementFactoryCollector;
/**
* A class factory collector.
*/
private ClassFactoryCollector classFactoryCollector;
/**
* A style-key factory collector.
*/
private StyleKeyFactoryCollector styleKeyFactoryCollector;
/**
* A template collector.
*/
private TemplateCollector templateCollector;
/**
* The encoding.
*/
private String encoding;
/**
* The report writer configuration used during writing.
*/
private Configuration configuration;
/**
* Builds a default configuration from a given report definition object.
* <p/>
* This will only create a valid definition, if the report has a valid content base object set.
*
* @param report
* the report for which to create the writer configuration.
* @return the generated configuration.
*/
public static Configuration createDefaultConfiguration( final MasterReport report ) {
final ModifiableConfiguration repConf = new HierarchicalConfiguration( report.getReportConfiguration() );
final ResourceKey contentBase = report.getContentBase();
if ( contentBase != null ) {
final ResourceManager resourceManager = report.getResourceManager();
final URL value = resourceManager.toURL( contentBase );
if ( value != null ) {
repConf.setConfigProperty( AbstractXmlResourceFactory.CONTENTBASE_KEY, value.toExternalForm() );
}
}
return repConf;
}
public ReportWriter( final MasterReport reportDefinition, final String encoding ) {
this( reportDefinition, encoding, ReportWriter.createDefaultConfiguration( reportDefinition ) );
}
/**
* Creates a new report writer for a report.
*
* @param report
* the report.
* @param encoding
* the encoding.
* @param config
* the write configuration.
*/
public ReportWriter( final MasterReport report, final String encoding, final Configuration config ) {
super( report );
if ( encoding == null ) {
throw new NullPointerException( "Encoding is null." );
}
if ( config == null ) {
throw new NullPointerException( "Configuration is null." );
}
// if (config.getConfigProperty(AbstractXmlResourceFactory.CONTENTBASE_KEY) == null)
// {
// throw new IllegalStateException
// ("This report writer configuration does not define a content base.");
// }
this.encoding = encoding;
this.configuration = config;
dataSourceCollector = new DataSourceCollector();
elementFactoryCollector = new ElementFactoryCollector();
classFactoryCollector = new ClassFactoryCollector();
classFactoryCollector.addFactory( dataSourceCollector );
styleKeyFactoryCollector = new StyleKeyFactoryCollector();
templateCollector = new TemplateCollector();
// configure all factories with the current report configuration ...
dataSourceCollector.configure( configuration );
classFactoryCollector.configure( configuration );
templateCollector.configure( configuration );
}
/**
* Returns the encoding.
*
* @return The encoding.
*/
public String getEncoding() {
return encoding;
}
/**
* Adds a data-source factory.
*
* @param dsf
* the data-source factory.
*/
public void addDataSourceFactory( final DataSourceFactory dsf ) {
dataSourceCollector.addFactory( dsf );
}
/**
* Returns the data-source collector.
*
* @return The data-source collector.
*/
public DataSourceCollector getDataSourceCollector() {
return dataSourceCollector;
}
/**
* Adds an element factory.
*
* @param ef
* the element factory.
*/
public void addElementFactory( final ElementFactory ef ) {
elementFactoryCollector.addFactory( ef );
}
/**
* Returns the element factory collector.
*
* @return The element factory collector.
*/
public ElementFactoryCollector getElementFactoryCollector() {
return elementFactoryCollector;
}
/**
* Adds a class factory.
*
* @param cf
* the class factory.
*/
public void addClassFactoryFactory( final ClassFactory cf ) {
classFactoryCollector.addFactory( cf );
}
/**
* Returns the class factory collector.
*
* @return The class factory collector.
*/
public ClassFactoryCollector getClassFactoryCollector() {
return classFactoryCollector;
}
/**
* Adds a style-key factory.
*
* @param skf
* the style-key factory.
*/
public void addStyleKeyFactory( final StyleKeyFactory skf ) {
styleKeyFactoryCollector.addFactory( skf );
}
/**
* Returns the style-key factory collector.
*
* @return The style-key factory collector.
*/
public StyleKeyFactoryCollector getStyleKeyFactoryCollector() {
return styleKeyFactoryCollector;
}
/**
* Adds a template collection.
*
* @param collection
* the template collection.
*/
public void addTemplateCollection( final TemplateCollection collection ) {
templateCollector.addTemplateCollection( collection );
}
/**
* Returns the template collector.
*
* @return The template collector.
*/
public TemplateCollector getTemplateCollector() {
return templateCollector;
}
/**
* Writes a report to a character stream writer.
*
* @param w
* the character stream writer.
* @throws IOException
* if there is an I/O problem.
* @throws ReportWriterException
* if there is a problem writing the report.
*/
public void write( final Writer w ) throws IOException, ReportWriterException {
final XmlWriter xmlWriter = new XmlWriter( w, createTagDescription() );
xmlWriter.writeXmlDeclaration( getEncoding() );
final ReportDefinitionWriter writer = new ReportDefinitionWriter( this, xmlWriter );
writer.write();
}
private TagDescription createTagDescription() {
final DefaultTagDescription defaultTagDescription = new DefaultTagDescription();
defaultTagDescription.configure( ClassicEngineBoot.getInstance().getGlobalConfig(),
"org.pentaho.reporting.engine.classic.core.modules.parser.extwriter." );
return defaultTagDescription;
}
/**
* Returns the configuration used to write the report.
*
* @return the writer configuration.
*/
public Configuration getConfiguration() {
return configuration;
}
}