net.sf.jooreports.templates.TemplateAndModelMerger.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jooreports.templates.TemplateAndModelMerger.java

Source

//
// JOOReports - The Open Source Java/OpenOffice Report Engine
// Copyright (C) 2004-2006 - Mirko Nasato <mirko@artofsolving.com>
//
// This library 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 2.1 of the License, or (at your option) any later version.
//
// This library 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.
// http://www.gnu.org/copyleft/lesser.html
//
package net.sf.jooreports.templates;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;

import net.sf.jooreports.opendocument.ManifestSubDocument;
import net.sf.jooreports.opendocument.OpenDocumentArchive;
import net.sf.jooreports.opendocument.SettingsSubDocument;
import net.sf.jooreports.templates.image.ImageSource;

import org.apache.commons.io.IOUtils;

import freemarker.core.Environment;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * Merges a pre-processed template with the data model to
 * produce the output document.
 */
class TemplateAndModelMerger {

    private final Configuration freemarkerConfiguration;
    private final String[] xmlEntries;
    private final Map openDocumentSettings;
    private final Map configurations;

    public TemplateAndModelMerger(Configuration freemarkerConfiguration, String[] xmlEntries,
            Map openDocumentSettings, Map configurations) {
        this.freemarkerConfiguration = freemarkerConfiguration;
        this.xmlEntries = xmlEntries;
        this.openDocumentSettings = openDocumentSettings;
        this.configurations = configurations;
    }

    public void process(OpenDocumentArchive archive, Object model) throws IOException, DocumentTemplateException {
        TemplateFreemarkerNamespace predefinedNamespace = new TemplateFreemarkerNamespace();
        predefinedNamespace.applyConfigurations(configurations);

        for (Iterator it = archive.getEntryNames().iterator(); it.hasNext();) {
            String entryName = (String) it.next();
            if (Arrays.binarySearch(xmlEntries, entryName) >= 0) {
                Reader reader = archive.getEntryReader(entryName);
                Writer writer = archive.getEntryWriter(entryName);

                Template template = new Template(entryName, reader, freemarkerConfiguration);

                BeansWrapper beansWrapper = new BeansWrapper();
                try {
                    Environment environment = template.createProcessingEnvironment(model, writer);
                    environment.setGlobalVariable(TemplateFreemarkerNamespace.NAME,
                            beansWrapper.wrap(predefinedNamespace));
                    environment.process();
                } catch (TemplateException templateException) {
                    throw new DocumentTemplateException(templateException);
                } finally {
                    IOUtils.closeQuietly(reader);
                    IOUtils.closeQuietly(writer);
                }
            }
        }

        if (!predefinedNamespace.getImages().isEmpty()) {
            addRequiredImages(archive, predefinedNamespace.getImages());
        }
        if (openDocumentSettings.size() > 0) {
            changeOpenDocumentSettings(archive);
        }
    }

    private void addRequiredImages(OpenDocumentArchive archive, Map images) throws IOException {
        InputStream inputStream = archive.getEntryInputStream(OpenDocumentArchive.ENTRY_MANIFEST);
        ManifestSubDocument manifest = new ManifestSubDocument(inputStream);
        inputStream.close();

        for (Iterator it = images.keySet().iterator(); it.hasNext();) {
            ImageSource imageWriter = (ImageSource) it.next();
            String imageHref = (String) images.get(imageWriter);
            OutputStream imageOutputStream = archive.getEntryOutputStream(imageHref);
            imageWriter.write(imageOutputStream);
            IOUtils.closeQuietly(imageOutputStream);
            manifest.addFileEntry("image/png", imageHref);
        }

        OutputStream outputStream = archive.getEntryOutputStream(OpenDocumentArchive.ENTRY_MANIFEST);
        manifest.save(outputStream);
        outputStream.close();
    }

    private void changeOpenDocumentSettings(OpenDocumentArchive archive) throws IOException {
        InputStream inputStream = archive.getEntryInputStream(OpenDocumentArchive.ENTRY_SETTINGS);
        SettingsSubDocument settings = new SettingsSubDocument(inputStream);
        inputStream.close();

        settings.changeSettings(openDocumentSettings);

        OutputStream outputStream = archive.getEntryOutputStream(OpenDocumentArchive.ENTRY_SETTINGS);
        settings.save(outputStream);
        outputStream.close();
    }
}