[Dive4elements-commits] [PATCH 2 of 2] Implement PDF export for SQ Relation
Wald Commits
scm-commit at wald.intevation.org
Mon Jun 3 17:15:33 CEST 2013
# HG changeset patch
# User Andre Heinecke <aheinecke at intevation.de>
# Date 1370272509 -7200
# Node ID 58a6137983864ff371a65bca7c15c1efecd69e80
# Parent 4a1af135885aebad3dc94208345835b0bf005b58
Implement PDF export for SQ Relation
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java Mon Jun 03 17:15:09 2013 +0200
@@ -11,21 +11,43 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Date;
+import java.util.Locale;
+import java.text.DateFormat;
import org.w3c.dom.Document;
+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 au.com.bytecode.opencsv.CSVWriter;
import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.model.CalculationResult;
-
import org.dive4elements.river.artifacts.model.sq.SQFractionResult;
import org.dive4elements.river.artifacts.model.sq.SQResult;
+import org.dive4elements.river.artifacts.model.sq.SQRelationJRDataSource;
import org.dive4elements.river.artifacts.model.Parameters;
+import org.dive4elements.river.artifacts.model.DateRange;
+import org.dive4elements.river.artifacts.access.SQRelationAccess;
+
+import org.dive4elements.river.artifacts.resources.Resources;
+
+import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.exports.AbstractExporter;
+import org.dive4elements.river.utils.RiverUtils;
+import org.dive4elements.river.utils.Formatter;
+
+import org.dive4elements.artifacts.common.utils.Config;
+
import org.apache.log4j.Logger;
/**
@@ -80,6 +102,14 @@
public static final String CSV_VARIANCE =
"export.sqrelation.csv.header.variance";
+ public static final String PDF_TITLE=
+ "export.sqrelation.pdf.title";
+
+ public static final String PDF_HEADER_MODE =
+ "export.sqrelation.pdf.mode";
+
+ public static final String JASPER_FILE =
+ "export.sqrelation.pdf.file";
protected List<SQResult []> data;
@@ -120,16 +150,14 @@
for (SQResult [] results: data) {
for (SQResult result: results) {
- data2CSV(writer, result);
+ writer.writeAll(data2StringArrays(result));
}
}
}
- protected void data2CSV(CSVWriter writer, SQResult result) {
- logger.debug("data2CSV");
-
- // TODO: i18n
+ protected List<String[]> data2StringArrays(SQResult result) {
String km = String.valueOf(result.getKm());
+ List<String[]> retval = new ArrayList<String[]>();
for (int i = 0; i < SQResult.NUMBER_FRACTIONS; ++i) {
SQFractionResult fraction = result.getFraction(i);
@@ -142,29 +170,95 @@
continue;
}
- double a = parameters.getValue(0, "a");
- double b = parameters.getValue(0, "b");
- double sd = Math.sqrt(parameters.getValue(0, "std_dev"));
- int o = fraction.totalNumOutliers();
- int t = fraction.numMeasurements() + o;
+ String a, b, sd, o, t;
+ a = Formatter.getSQRelation(context).format(parameters.getValue(0, "a"));
+ b = Formatter.getSQRelation(context).format(parameters.getValue(0, "b"));
+ sd = Formatter.getVariance(context).format(Math.sqrt(parameters.getValue(0, "std_dev")));
- writer.writeNext(new String[] {
+ o = String.valueOf(fraction.totalNumOutliers());
+ t = String.valueOf(fraction.numMeasurements() + o);
+
+ retval.add(new String[] {
km,
name,
- String.valueOf(a),
- String.valueOf(b),
- String.valueOf(t),
- String.valueOf(o),
- String.valueOf(sd)
+ a,
+ b,
+ t,
+ o,
+ sd
});
}
+ return retval;
}
+ protected SQRelationJRDataSource createJRData() {
+ SQRelationJRDataSource source = new SQRelationJRDataSource();
+
+ addMetaData(source);
+ for (SQResult [] results: data) {
+ for (SQResult result: results) {
+ for (String[] res: data2StringArrays(result)) {
+ source.addData(res);
+ }
+ }
+ }
+ return source;
+ }
+
+ protected void addMetaData(SQRelationJRDataSource source) {
+ CallMeta meta = context.getMeta();
+
+ D4EArtifact arti = (D4EArtifact) master;
+
+ source.addMetaData ("river", RiverUtils.getRivername(arti));
+
+ Locale locale = Resources.getLocale(meta);
+ DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+
+ source.addMetaData("date", df.format(new Date()));
+
+ SQRelationAccess access = new SQRelationAccess(arti);
+ source.addMetaData("location", getKmFormatter().format(access.getLocation()));
+
+ DateRange period = access.getPeriod();
+ source.addMetaData("periods", df.format(period.getFrom()) + " - " +
+ df.format(period.getTo()));
+
+ source.addMetaData("outliertest", access.getOutlierMethod());
+ source.addMetaData("outliers", access.getOutliers().toString());
+
+ source.addMetaData("calculation", Resources.getMsg(
+ locale,
+ PDF_HEADER_MODE,
+ "SQRelation"));
+ }
+
@Override
protected void writePDF(OutputStream out) {
- logger.debug("writePDF");
- logger.error("NOT IMPLEMENTED: writePDF");
+ logger.debug("write PDF");
+ SQRelationJRDataSource source = createJRData();
+
+ String jasperFile = Resources.getMsg(
+ context.getMeta(),
+ JASPER_FILE,
+ "/jasper/sqrelation_en.jasper");
+ String confPath = Config.getConfigDirectory().toString();
+
+
+ Map parameters = new HashMap();
+ 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) {
+ logger.warn("Error generating PDF Report!", je);
+ }
}
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/java/org/dive4elements/river/utils/Formatter.java
--- a/artifacts/src/main/java/org/dive4elements/river/utils/Formatter.java Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/utils/Formatter.java Mon Jun 03 17:15:09 2013 +0200
@@ -11,6 +11,7 @@
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
+import java.text.DecimalFormat;
import java.util.Locale;
import org.dive4elements.artifacts.CallContext;
@@ -87,6 +88,12 @@
public static final int FIX_DELTA_W_DELTA_Q_MIN_DIGITS = 0;
public static final int FIX_DELTA_W_DELTA_Q_MAX_DIGITS = 2;
+ public static final int VARIANCE_MIN_DIGITS = 0;
+ public static final int VARIANCE_MAX_DIGITS = 4;
+
+ // SQ Relation
+ public static final int SQ_RELATION_MAX_DIGITS = 8;
+ public static final int SQ_RELATION_MIN_DIGITS = 0;
/**
* Creates a localized NumberFormatter with given range of decimal digits.
@@ -106,7 +113,6 @@
return nf;
}
-
public static NumberFormat getFormatter(CallContext c, int min, int max){
return getFormatter(c.getMeta(), min, max);
}
@@ -124,6 +130,32 @@
return NumberFormat.getInstance(locale);
}
+ /**
+ * Returns a formatter in engineering notation
+ */
+ public static NumberFormat getEngFormatter(CallContext c) {
+ NumberFormat nf = getRawFormatter(c);
+ if (nf instanceof DecimalFormat) {
+ DecimalFormat df = (DecimalFormat)nf;
+ df.applyPattern("##0.#####E0");
+ }
+ return nf;
+ }
+
+ /**
+ * Returns a number formatter that uses an exponent after max digits
+ */
+ public static NumberFormat getScientificFormater(CallContext c, int min, int max) {
+ NumberFormat nf = getRawFormatter(c);
+ if (nf instanceof DecimalFormat) {
+ DecimalFormat df = (DecimalFormat)nf;
+ df.applyPattern("0.0E0");
+ df.setMaximumFractionDigits(max);
+ df.setMinimumFractionDigits(min);
+ }
+ return nf;
+ }
+
/**
* Returns a date formatter with SHORT style.
@@ -398,6 +430,21 @@
FIX_DELTA_W_DELTA_W_MAX_DIGITS);
}
+ public static NumberFormat getVariance(CallContext context) {
+ return getFormatter(
+ context,
+ VARIANCE_MIN_DIGITS,
+ VARIANCE_MAX_DIGITS);
+ }
+
+ public static NumberFormat getSQRelation(CallContext context) {
+ // Would be nice if E0 would not be shown
+ return getScientificFormater(
+ context,
+ SQ_RELATION_MIN_DIGITS,
+ SQ_RELATION_MAX_DIGITS);
+ }
+
public static NumberFormat getMeterFormat(CallContext context) {
return getFormatter(
context,
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/resources/messages.properties
--- a/artifacts/src/main/resources/messages.properties Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/resources/messages.properties Mon Jun 03 17:15:09 2013 +0200
@@ -390,6 +390,8 @@
export.sqrelation.csv.header.c.duan = C (DUAN)
export.sqrelation.csv.header.c.ferguson = C (FERGUSON)
export.sqrelation.csv.header.variance = Standard variance
+export.sqrelation.pdf.file = /jasper/sqrelation_en.jasper
+export.sqrelation.pdf.mode = Load Discharge Relation
export.minfo.bedquality.km = km
export.minfo.bedquality.density_cap = Density Toplayer
export.minfo.bedquality.density_sub = Density Sublayer
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/resources/messages_de.properties
--- a/artifacts/src/main/resources/messages_de.properties Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/resources/messages_de.properties Mon Jun 03 17:15:09 2013 +0200
@@ -391,6 +391,8 @@
export.sqrelation.csv.header.c.duan = C (DUAN)
export.sqrelation.csv.header.c.ferguson = C (FERGUSON)
export.sqrelation.csv.header.variance = Standardabweichung
+export.sqrelation.pdf.file = /jasper/sqrelation.jasper
+export.sqrelation.pdf.mode = Transport-Abfluss Beziehung
export.minfo.bedquality.km = km
export.minfo.bedquality.density_cap = Sedimentdichte Deckschicht
export.minfo.bedquality.density_sub = Sedimentdichte Unterschicht
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/resources/messages_de_DE.properties
--- a/artifacts/src/main/resources/messages_de_DE.properties Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/resources/messages_de_DE.properties Mon Jun 03 17:15:09 2013 +0200
@@ -387,6 +387,8 @@
export.sqrelation.csv.header.c.duan = C (DUAN)
export.sqrelation.csv.header.c.ferguson = C (FERGUSON)
export.sqrelation.csv.header.variance = Standardabweichung
+export.sqrelation.pdf.file = /jasper/sqrelation.jasper
+export.sqrelation.pdf.mode = Transport-Abfluss Beziehung
export.minfo.bedquality.km = km
export.minfo.bedquality.density_cap = Sedimentdichte Deckschicht
export.minfo.bedquality.density_sub = Sedimentdichte Unterschicht
diff -r 4a1af135885a -r 58a613798386 artifacts/src/main/resources/messages_en.properties
--- a/artifacts/src/main/resources/messages_en.properties Mon Jun 03 16:26:10 2013 +0200
+++ b/artifacts/src/main/resources/messages_en.properties Mon Jun 03 17:15:09 2013 +0200
@@ -392,6 +392,8 @@
export.sqrelation.csv.header.c.duan = C (DUAN)
export.sqrelation.csv.header.c.ferguson = C (FERGUSON)
export.sqrelation.csv.header.variance = Standard variance
+export.sqrelation.pdf.file = /jasper/sqrelation_en.jasper
+export.sqrelation.pdf.mode = Load Discharge Relation
export.minfo.bedquality.km = km
export.minfo.bedquality.density_cap = Density Toplayer
export.minfo.bedquality.density_sub = Density Sublayer
More information about the Dive4elements-commits
mailing list