/* * 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.AbstractReportDefinition; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.PageDefinition; import org.pentaho.reporting.engine.classic.core.SimplePageDefinition; import org.pentaho.reporting.engine.classic.core.modules.parser.ext.ExtParserModule; import org.pentaho.reporting.engine.classic.core.util.PageFormatFactory; import org.pentaho.reporting.libraries.base.config.Configuration; import org.pentaho.reporting.libraries.xmlns.common.AttributeList; import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter; import org.pentaho.reporting.libraries.xmlns.writer.XmlWriterSupport; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.io.IOException; import java.util.Enumeration; /** * A report configuration writer. * * @author Thomas Morgner. */ public class ReportConfigWriter extends AbstractXMLDefinitionWriter { protected static final String PAGE_DEFINITION_TAG = "page-definition"; protected static final String SIMPLE_PAGE_DEFINITION_TAG = "simple-page-definition"; protected static final String PAGE_TAG = "page"; /** * Literal text for an XML attribute. */ public static final String ORIENTATION_ATT = "orientation"; /** * Literal text for an XML attribute. */ public static final String ORIENTATION_PORTRAIT_VAL = "portrait"; /** * Literal text for an XML attribute. */ public static final String ORIENTATION_LANDSCAPE_VAL = "landscape"; /** * Literal text for an XML attribute. */ public static final String ORIENTATION_REVERSE_LANDSCAPE_VAL = "reverse_landscape"; /** * Literal text for an XML attribute. */ public static final String PAGEFORMAT_ATT = "pageformat"; /** * Literal text for an XML attribute. */ public static final String LEFTMARGIN_ATT = "leftmargin"; /** * Literal text for an XML attribute. */ public static final String RIGHTMARGIN_ATT = "rightmargin"; /** * Literal text for an XML attribute. */ public static final String TOPMARGIN_ATT = "topmargin"; /** * Literal text for an XML attribute. */ public static final String BOTTOMMARGIN_ATT = "bottommargin"; /** * A constant for the top border. */ private static final int TOP_BORDER = 0; /** * A constant for the left border. */ private static final int LEFT_BORDER = 1; /** * A constant for the bottom border. */ private static final int BOTTOM_BORDER = 2; /** * A constant for the right border. */ private static final int RIGHT_BORDER = 3; /** * A report configuration writer. * * @param reportWriter * the report writer. * @param xmlWriter * the current indention level. */ public ReportConfigWriter( final ReportWriterContext reportWriter, final XmlWriter xmlWriter ) { super( reportWriter, xmlWriter ); } /** * Writes the report configuration element. * * @throws java.io.IOException * if there is an I/O problem. */ public void write() throws IOException, ReportWriterException { final XmlWriter xmlWriter = getXmlWriter(); xmlWriter .writeTag( ExtParserModule.NAMESPACE, AbstractXMLDefinitionWriter.REPORT_CONFIG_TAG, XmlWriterSupport.OPEN ); final AbstractReportDefinition report = getReport(); if ( report instanceof MasterReport ) { final MasterReport masterReport = (MasterReport) report; final DataFactoryWriter writer = new DataFactoryWriter( getReportWriter(), getXmlWriter() ); writer.write(); writePageDefinition(); writeReportConfig( masterReport.getConfiguration() ); } xmlWriter.writeCloseTag(); } private void writeReportConfig( final Configuration config ) throws IOException { final XmlWriter writer = getXmlWriter(); final Enumeration properties = config.getConfigProperties(); if ( properties.hasMoreElements() ) { writer.writeTag( ExtParserModule.NAMESPACE, AbstractXMLDefinitionWriter.CONFIGURATION_TAG, XmlWriterSupport.OPEN ); while ( properties.hasMoreElements() ) { final String key = (String) properties.nextElement(); final String value = config.getConfigProperty( key ); if ( value != null ) { writer.writeTag( ExtParserModule.NAMESPACE, "property", "name", key, XmlWriterSupport.OPEN ); writer.writeTextNormalized( value, false ); writer.writeCloseTag(); } } writer.writeCloseTag(); } } private void writePageDefinition() throws IOException { final XmlWriter xmlWriter = getXmlWriter(); final PageDefinition pageDefinition = getReport().getPageDefinition(); if ( pageDefinition instanceof SimplePageDefinition ) { final SimplePageDefinition spdef = (SimplePageDefinition) pageDefinition; final AttributeList attr = new AttributeList(); attr.setAttribute( ExtParserModule.NAMESPACE, "width", String.valueOf( spdef.getPageCountHorizontal() ) ); attr.setAttribute( ExtParserModule.NAMESPACE, "height", String.valueOf( spdef.getPageCountVertical() ) ); xmlWriter.writeTag( ExtParserModule.NAMESPACE, ReportConfigWriter.SIMPLE_PAGE_DEFINITION_TAG, attr, XmlWriterSupport.OPEN ); final AttributeList attributes = buildPageFormatProperties( spdef.getPageFormat( 0 ) ); xmlWriter.writeTag( ExtParserModule.NAMESPACE, ReportConfigWriter.PAGE_TAG, attributes, XmlWriterSupport.CLOSE ); xmlWriter.writeCloseTag(); } else { xmlWriter.writeTag( ExtParserModule.NAMESPACE, ReportConfigWriter.PAGE_DEFINITION_TAG, XmlWriterSupport.OPEN ); final int max = pageDefinition.getPageCount(); for ( int i = 0; i < max; i++ ) { final PageFormat fmt = pageDefinition.getPageFormat( i ); final AttributeList attributes = buildPageFormatProperties( fmt ); xmlWriter.writeTag( ExtParserModule.NAMESPACE, ReportConfigWriter.PAGE_TAG, attributes, XmlWriterSupport.CLOSE ); } xmlWriter.writeCloseTag(); } } /** * Compiles a collection of page format properties. * * @return The properties. */ private AttributeList buildPageFormatProperties( final PageFormat fmt ) { final AttributeList retval = new AttributeList(); final int[] borders = getBorders( fmt.getPaper() ); if ( fmt.getOrientation() == PageFormat.LANDSCAPE ) { retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.ORIENTATION_ATT, ReportConfigWriter.ORIENTATION_LANDSCAPE_VAL ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.TOPMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.RIGHT_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.LEFTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.TOP_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.BOTTOMMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.LEFT_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.RIGHTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.BOTTOM_BORDER] ) ); } else if ( fmt.getOrientation() == PageFormat.PORTRAIT ) { retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.ORIENTATION_ATT, ReportConfigWriter.ORIENTATION_PORTRAIT_VAL ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.TOPMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.TOP_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.LEFTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.LEFT_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.BOTTOMMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.BOTTOM_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.RIGHTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.RIGHT_BORDER] ) ); } else { retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.ORIENTATION_ATT, ReportConfigWriter.ORIENTATION_REVERSE_LANDSCAPE_VAL ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.TOPMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.LEFT_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.LEFTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.BOTTOM_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.BOTTOMMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.RIGHT_BORDER] ) ); retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.RIGHTMARGIN_ATT, String .valueOf( borders[ReportConfigWriter.TOP_BORDER] ) ); } final int w = (int) fmt.getPaper().getWidth(); final int h = (int) fmt.getPaper().getHeight(); final String pageDefinition = PageFormatFactory.getInstance().getPageFormatName( w, h ); if ( pageDefinition != null ) { retval.setAttribute( ExtParserModule.NAMESPACE, ReportConfigWriter.PAGEFORMAT_ATT, pageDefinition ); } else { retval.setAttribute( ExtParserModule.NAMESPACE, AbstractXMLDefinitionWriter.WIDTH_ATT, String.valueOf( w ) ); retval.setAttribute( ExtParserModule.NAMESPACE, AbstractXMLDefinitionWriter.HEIGHT_ATT, String.valueOf( h ) ); } return retval; } /** * Returns the borders for the given paper. * * @param p * the paper. * @return The borders. */ private int[] getBorders( final Paper p ) { final int[] retval = new int[4]; retval[ReportConfigWriter.TOP_BORDER] = (int) p.getImageableY(); retval[ReportConfigWriter.LEFT_BORDER] = (int) p.getImageableX(); retval[ReportConfigWriter.BOTTOM_BORDER] = (int) ( p.getHeight() - ( p.getImageableY() + p.getImageableHeight() ) ); retval[ReportConfigWriter.RIGHT_BORDER] = (int) ( p.getWidth() - ( p.getImageableX() + p.getImageableWidth() ) ); return retval; } }