/* * 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) 2006 - 2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.modules.output.table.html.helper; import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlPrinter; import org.pentaho.reporting.libraries.base.util.MemoryStringWriter; import org.pentaho.reporting.libraries.xmlns.writer.DefaultTagDescription; import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class WriterService { public static final String XHTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; private MemoryStringWriter bufferWriter; private BufferedWriter writer; private XmlWriter xmlWriter; private WriterService( final BufferedWriter bufferedWriter ) { this.writer = bufferedWriter; } public WriterService( final BufferedWriter bufferedWriter, final MemoryStringWriter bufferWriter ) { this.writer = bufferedWriter; this.bufferWriter = bufferWriter; } public XmlWriter getXmlWriter() { return xmlWriter; } public MemoryStringWriter getBufferWriter() { return bufferWriter; } public XmlWriter createHeaderXmlWriter() { if ( isBuffered() == false ) { throw new IllegalStateException(); } final XmlWriter docWriter = new XmlWriter( writer, xmlWriter.getTagDescription() ); docWriter.addImpliedNamespace( HtmlPrinter.XHTML_NAMESPACE, "" ); docWriter.setHtmlCompatiblityMode( true ); return docWriter; } private void setXmlWriter( final XmlWriter xmlWriter ) { this.xmlWriter = xmlWriter; } private static DefaultTagDescription createTagDefinitions() { final DefaultTagDescription td = new DefaultTagDescription(); td.setDefaultNamespace( XHTML_NAMESPACE ); td.setNamespaceHasCData( XHTML_NAMESPACE, true ); td.setNamespaceHasCData( XHTML_NAMESPACE, true ); td.setElementHasCData( XHTML_NAMESPACE, "body", false ); td.setElementHasCData( XHTML_NAMESPACE, "br", true ); td.setElementHasCData( XHTML_NAMESPACE, "col", false ); td.setElementHasCData( XHTML_NAMESPACE, "colgroup", false ); td.setElementHasCData( XHTML_NAMESPACE, "div", true ); td.setElementHasCData( XHTML_NAMESPACE, "head", false ); td.setElementHasCData( XHTML_NAMESPACE, "html", false ); td.setElementHasCData( XHTML_NAMESPACE, "img", true ); td.setElementHasCData( XHTML_NAMESPACE, "input", true ); td.setElementHasCData( XHTML_NAMESPACE, "meta", true ); td.setElementHasCData( XHTML_NAMESPACE, "p", true ); td.setElementHasCData( XHTML_NAMESPACE, "pre", true ); td.setElementHasCData( XHTML_NAMESPACE, "span", true ); td.setElementHasCData( XHTML_NAMESPACE, "style", false ); td.setElementHasCData( XHTML_NAMESPACE, "table", false ); td.setElementHasCData( XHTML_NAMESPACE, "tbody", false ); td.setElementHasCData( XHTML_NAMESPACE, "td", true ); td.setElementHasCData( XHTML_NAMESPACE, "tfoot", false ); td.setElementHasCData( XHTML_NAMESPACE, "th", false ); td.setElementHasCData( XHTML_NAMESPACE, "thead", false ); td.setElementHasCData( XHTML_NAMESPACE, "title", true ); td.setElementHasCData( XHTML_NAMESPACE, "tr", false ); return td; } public boolean isBuffered() { return bufferWriter != null; } public static WriterService createPassThroughService( OutputStream out, String encoding ) throws UnsupportedEncodingException { BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter( out, encoding ) ); XmlWriter xmlWriter = new XmlWriter( bufferedWriter, createTagDefinitions() ); xmlWriter.addImpliedNamespace( HtmlPrinter.XHTML_NAMESPACE, "" ); xmlWriter.setHtmlCompatiblityMode( true ); WriterService writerService = new WriterService( bufferedWriter ); writerService.setXmlWriter( xmlWriter ); return writerService; } public static WriterService createBufferedService( OutputStream out, String encoding ) throws UnsupportedEncodingException { MemoryStringWriter bufferWriter = new MemoryStringWriter( 1024 * 512 ); XmlWriter xmlWriter = new XmlWriter( bufferWriter, createTagDefinitions() ); xmlWriter.setAdditionalIndent( 1 ); xmlWriter.addImpliedNamespace( HtmlPrinter.XHTML_NAMESPACE, "" ); xmlWriter.setHtmlCompatiblityMode( true ); BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter( out, encoding ) ); WriterService writerService = new WriterService( bufferedWriter, bufferWriter ); writerService.setXmlWriter( xmlWriter ); return writerService; } public void close() throws IOException { this.writer.close(); } }