org.opennms.reporting.availability.render.PDFReportRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.opennms.reporting.availability.render.PDFReportRenderer.java

Source

/*******************************************************************************
 * This file is part of OpenNMS(R).
 *
 * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
 * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 *
 * OpenNMS(R) 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with OpenNMS(R).  If not, see:
 *      http://www.gnu.org/licenses/
 *
 * For more information contact:
 *     OpenNMS(R) Licensing <license@opennms.org>
 *     http://www.opennms.org/
 *     http://www.opennms.com/
 *******************************************************************************/

package org.opennms.reporting.availability.render;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.util.concurrent.Callable;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.commons.io.IOUtils;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.opennms.core.logging.Logging;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;

/**
 * PDFReportRenderer will transform its input XML into PDF using the supplied
 * XSLT resource.
 *
 * @author <a href="mailto:jonathan@opennms.org">Jonathan Sartin</a>
 */
public class PDFReportRenderer implements ReportRenderer {
    private static final Logger LOG = LoggerFactory.getLogger(PDFReportRenderer.class);

    private static final String LOG4J_CATEGORY = "reports";

    private String m_outputFileName;

    private String m_inputFileName;

    private Resource m_xsltResource;

    private String m_baseDir;

    /**
     * <p>Constructor for PDFReportRenderer.</p>
     */
    public PDFReportRenderer() {
    }

    /**
     * <p>render</p>
     *
     * @throws org.opennms.reporting.availability.render.ReportRenderException if any.
     */
    @Override
    public void render() throws ReportRenderException {
        render(m_inputFileName, m_outputFileName, m_xsltResource);
    }

    /** {@inheritDoc} */
    @Override
    public byte[] render(final String inputFileName, final Resource xsltResource) throws ReportRenderException {
        try {
            return Logging.withPrefix(LOG4J_CATEGORY, new Callable<byte[]>() {
                @Override
                public byte[] call() throws Exception {
                    LOG.debug("Rendering {} with XSL File {} to byte array", inputFileName,
                            xsltResource.getDescription());

                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                    render(inputFileName, outputStream, xsltResource);

                    return outputStream.toByteArray();
                }
            });
        } catch (final Exception e) {
            if (e instanceof ReportRenderException)
                throw (ReportRenderException) e;
            throw new ReportRenderException(e);
        }
    }

    /** {@inheritDoc} */
    @Override
    public void render(final String inputFileName, final OutputStream outputStream, final Resource xsltResource)
            throws ReportRenderException {
        try {
            Logging.withPrefix(LOG4J_CATEGORY, new Callable<Void>() {
                @Override
                public Void call() throws Exception {
                    FileInputStream in = null, xslt = null;
                    Reader xsl = null, xml = null;

                    try {
                        LOG.debug("Rendering {} with XSL File {} to OutputStream", inputFileName,
                                xsltResource.getDescription());

                        in = new FileInputStream(xsltResource.getFile());
                        xsl = new InputStreamReader(in, "UTF-8");
                        xslt = new FileInputStream(inputFileName);
                        xml = new InputStreamReader(xslt, "UTF-8");

                        render(xml, outputStream, xsl);
                        return null;
                    } finally {
                        IOUtils.closeQuietly(xml);
                        IOUtils.closeQuietly(xslt);
                        IOUtils.closeQuietly(xsl);
                        IOUtils.closeQuietly(in);
                    }
                }
            });
        } catch (final Exception e) {
            if (e instanceof ReportRenderException)
                throw (ReportRenderException) e;
            throw new ReportRenderException(e);
        }
    }

    /** {@inheritDoc} */
    @Override
    public void render(final InputStream inputStream, final OutputStream outputStream, final Resource xsltResource)
            throws ReportRenderException {
        try {
            Logging.withPrefix(LOG4J_CATEGORY, new Callable<Void>() {
                @Override
                public Void call() throws Exception {
                    LOG.debug("Rendering InputStream with XSL File {} to OutputStream",
                            xsltResource.getDescription());

                    FileInputStream xslt = null;
                    Reader xsl = null, xml = null;
                    try {
                        xslt = new FileInputStream(xsltResource.getFile());
                        xsl = new InputStreamReader(xslt, "UTF-8");
                        xml = new InputStreamReader(inputStream, "UTF-8");

                        render(xml, outputStream, xsl);
                        return null;
                    } finally {
                        IOUtils.closeQuietly(xml);
                    }
                }
            });
        } catch (final Exception e) {
            if (e instanceof ReportRenderException)
                throw (ReportRenderException) e;
            throw new ReportRenderException(e);
        }
    }

    /** {@inheritDoc} */
    @Override
    public void render(final String inputFileName, final String outputFileName, final Resource xsltResource)
            throws ReportRenderException {
        try {
            Logging.withPrefix(LOG4J_CATEGORY, new Callable<Void>() {
                @Override
                public Void call() throws Exception {

                    LOG.debug("Rendering {} with XSL File {} to {} with base directory of {}", m_baseDir,
                            inputFileName, xsltResource.getDescription(), outputFileName);

                    FileInputStream in = null, xslt = null;
                    FileOutputStream out = null;
                    Reader xsl = null, xml = null;
                    try {

                        xslt = new FileInputStream(xsltResource.getFile());
                        xsl = new InputStreamReader(xslt, "UTF-8");
                        in = new FileInputStream(m_baseDir + "/" + inputFileName);
                        xml = new InputStreamReader(in, "UTF-8");

                        out = new FileOutputStream(new File(m_baseDir + "/" + outputFileName));

                        render(xml, out, xsl);
                        return null;
                    } finally {
                        IOUtils.closeQuietly(out);
                        IOUtils.closeQuietly(xml);
                        IOUtils.closeQuietly(in);
                        IOUtils.closeQuietly(xsl);
                        IOUtils.closeQuietly(xslt);
                    }
                }
            });
        } catch (final Exception e) {
            if (e instanceof ReportRenderException)
                throw (ReportRenderException) e;
            throw new ReportRenderException(e);
        }
    }

    /**
     * <p>render</p>
     *
     * @param in a {@link java.io.Reader} object.
     * @param out a {@link java.io.OutputStream} object.
     * @param xslt a {@link java.io.Reader} object.
     * @throws org.opennms.reporting.availability.render.ReportRenderException if any.
     */
    public void render(final Reader in, final OutputStream out, final Reader xslt) throws ReportRenderException {
        try {
            final FopFactory fopFactory = FopFactory.newInstance();
            fopFactory.setStrictValidation(false);
            final Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

            final TransformerFactory tfact = TransformerFactory.newInstance();
            final Transformer transformer = tfact.newTransformer(new StreamSource(xslt));
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            final StreamSource streamSource = new StreamSource(in);
            transformer.transform(streamSource, new SAXResult(fop.getDefaultHandler()));
        } catch (final Exception e) {
            throw new ReportRenderException(e);
        }
    }

    /** {@inheritDoc} */
    @Override
    public void setXsltResource(Resource xsltResource) {
        this.m_xsltResource = xsltResource;
    }

    /** {@inheritDoc} */
    @Override
    public void setOutputFileName(String outputFileName) {
        this.m_outputFileName = outputFileName;
    }

    /**
     * <p>getOutputFileName</p>
     *
     * @return a {@link java.lang.String} object.
     */
    @Override
    public String getOutputFileName() {
        return m_outputFileName;
    }

    /** {@inheritDoc} */
    @Override
    public void setInputFileName(String inputFileName) {
        this.m_inputFileName = inputFileName;
    }

    /** {@inheritDoc} */
    @Override
    public void setBaseDir(String baseDir) {
        this.m_baseDir = baseDir;
    }

    /**
     * <p>getBaseDir</p>
     *
     * @return a {@link java.lang.String} object.
     */
    @Override
    public String getBaseDir() {
        return m_baseDir;
    }
}