view artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceExporter.java @ 8202:e4606eae8ea5

sed src/**/*.java 's/logger/log/g'
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 05 Sep 2014 12:58:17 +0200
parents 6fef38a526c7
children 8a14605fb64a
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.exports.minfo;

import java.io.IOException;
import java.io.OutputStream;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Locale;
import java.util.Date;
import java.text.DateFormat;

import org.apache.log4j.Logger;
import org.apache.commons.lang.StringUtils;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JRException;

import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.BedDifferencesAccess;
import org.dive4elements.river.artifacts.access.RiverAccess;
import org.dive4elements.artifacts.common.utils.Config;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult;
import org.dive4elements.river.artifacts.model.minfo.BedDifferencesResult;
import org.dive4elements.river.artifacts.model.minfo.BedDifferenceJRDataSource;
import org.dive4elements.river.exports.AbstractExporter;
import org.dive4elements.river.utils.Formatter;

import au.com.bytecode.opencsv.CSVWriter;

public class BedDifferenceExporter
extends AbstractExporter
{

    /** Private log. */
    private static Logger log =
        Logger.getLogger(BedDifferenceExporter.class);

    private static final String CSV_HEADER_KM =
        "export.minfo.beddifference.km";

    private static final String CSV_HEADER_DIFF =
        "export.minfo.beddifference.diff";

    private static final String CSV_HEADER_DIFF_PAIR =
        "export.minfo.beddifference.diff.pair";

    private static final String CSV_HEADER_MORPH1 =
        "export.minfo.beddifference.morph1";

    private static final String CSV_HEADER_MORPH2 =
        "export.minfo.beddifference.morph2";

    public static final String JASPER_FILE =
        "export.minfo.beddifference.pdf.file";

    public static final String PDF_TITLE=
        "export.minfo.beddifference.pdf.title";

    public static final String PDF_HEADER_MODE=
        "export.minfo.beddifference.pdf.mode";

    private BedDifferencesResult[] results;

    public BedDifferenceExporter() {
        results = new BedDifferencesResult[0];
    }

    @Override
    protected void writeCSVData(CSVWriter writer) throws IOException {
        writeCSVHeader(writer);

        NumberFormat kmf = Formatter.getCalculationKm(context.getMeta());
        NumberFormat mf = Formatter.getMeterFormat(context);
        for (BedDifferencesResult result : results) {
            if (result instanceof BedDiffYearResult) {
                BedDiffYearResult yResult = (BedDiffYearResult) result;
                String desc = result.getDiffDescription();
                double[][] kms = yResult.getDifferencesData();
                double[][] morph1 = yResult.getMorphWidth1Data();
                double[][] morph2 = yResult.getMorphWidth2Data();
                for (int j = 0; j < kms[0].length; j++) {
                    writer.writeNext(new String[] {
                        kmf.format(kms[0][j]),
                        desc,
                        mf.format(kms[1][j]),
                        mf.format(morph1[1][j]),
                        mf.format(morph2[1][j]),
                        });
                }
            }
            else {
                double[][] kms = result.getDifferencesData();
                String desc = result.getDiffDescription();
                for (int j = 0; j < kms[0].length; j++) {
                    writer.writeNext(new String[] {
                        kmf.format(kms[0][j]),
                        desc,
                        mf.format(kms[1][j]),
                        });
                }
            }
        }
    }

    @Override
    protected void addData(Object data) {
        if (!(data instanceof CalculationResult)) {
            log.warn("Invalid data type.");
            return;
        }
        Object[] d = (Object[])((CalculationResult)data).getData();

        if (!(d instanceof BedDifferencesResult[])) {
            log.warn("Invalid result object.");
            return;
        }
        results = (BedDifferencesResult[])d;
    }

    protected void addMetaData(BedDifferenceJRDataSource source) {
        CallMeta meta = context.getMeta();

        D4EArtifact arti = (D4EArtifact) master;

        //source.addMetaData ("river", RiverUtils.getRivername(arti));
        source.addMetaData ("river", new RiverAccess(arti).getRiverName());

        Locale locale = Resources.getLocale(meta);
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);

        source.addMetaData("date", df.format(new Date()));

        source.addMetaData("calculation", Resources.getMsg(
                                            locale,
                                            PDF_HEADER_MODE,
                                            "Bedheight difference"));

        // Now the dynamic parts

        BedDifferencesAccess access = new BedDifferencesAccess(arti);

        source.addMetaData("differences", StringUtils.join(
                access.getDifferenceArtifactNamePairs(), "\n"));

        source.addMetaData("kmheader",
                msg(CSV_HEADER_KM, "km"));
        source.addMetaData("diffpairheader",
                msg(CSV_HEADER_DIFF_PAIR, "Difference pair"));
        source.addMetaData("diffheader", msg(CSV_HEADER_DIFF, "cm"));
        source.addMetaData("morph1header", 
                msg(CSV_HEADER_MORPH1, "Morph. active width minuend"));
        source.addMetaData("morph2header", 
                msg(CSV_HEADER_MORPH2, "Morph. active width subtrahend"));
    }


    protected void writeCSVHeader(CSVWriter writer) {
        log.debug("writeCSVHeader()");

        List<String> header = new ArrayList<String>();
        if (results != null)  {
            header.add(msg(CSV_HEADER_KM, "km"));
            header.add(msg(CSV_HEADER_DIFF_PAIR, "difference pair"));
            header.add(msg(CSV_HEADER_DIFF, "cm"));
            if (results.length > 0 &&
                results[0] instanceof BedDiffYearResult) {
                header.add(msg(CSV_HEADER_MORPH1, "morph width minuend [m]"));
                header.add(msg(CSV_HEADER_MORPH2, "morph width subtrahend [m]"));
            }
        }
        writer.writeNext(header.toArray(new String[header.size()]));
    }

    protected BedDifferenceJRDataSource createJRData() {
        BedDifferenceJRDataSource source = new BedDifferenceJRDataSource();

        addMetaData(source);
        NumberFormat kmf = Formatter.getCalculationKm(context.getMeta());
        NumberFormat mf = Formatter.getMeterFormat(context);
        for (BedDifferencesResult result: results) {
            BedDiffYearResult yResult = (BedDiffYearResult) result;
            double[][] kms = result.getDifferencesData();
            String desc = result.getDiffDescription();
            double[][] morph1 = yResult.getMorphWidth1Data();
            double[][] morph2 = yResult.getMorphWidth2Data();
            for (int j = 0; j < kms[0].length; j++) {
                source.addData(new String[] {
                    kmf.format(kms[0][j]),
                    desc,
                    mf.format(kms[1][j]),
                    mf.format(morph1[1][j]),
                    mf.format(morph2[1][j])
                    });
            }
        }
        return source;
    }

    @Override
    protected void writePDF(OutputStream out) {
        log.debug("write PDF");
        BedDifferenceJRDataSource source = createJRData();

        String jasperFile = Resources.getMsg(
                                context.getMeta(),
                                JASPER_FILE,
                                "/jasper/beddifference_en.jasper");
        String confPath = Config.getConfigDirectory().toString();


        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("ReportTitle", Resources.getMsg(
                    context.getMeta(), PDF_TITLE, "Exported Data"));
        try {
            JasperPrint print = JasperFillManager.fillReport(
                confPath + jasperFile,
                parameters,
                source);
            JasperExportManager.exportReportToPdfStream(print, out);
        }
        catch(JRException je) {
            log.warn("Error generating PDF Report!", je);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org