Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java @ 8950:b0aeed4c97c1
Implemented chart output for sinfo flow depth min/max calculation
author | gernotbelger |
---|---|
date | Thu, 15 Mar 2018 17:22:28 +0100 |
parents | 09e4a4909814 |
children | 322b0e6298ea |
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * 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.artifacts.sinfo.common; import java.text.NumberFormat; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.CallMeta; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.sinfo.SInfoI18NStrings; import org.dive4elements.river.artifacts.sinfo.tkhcalculation.SoilKind; import org.dive4elements.river.utils.Formatter; import org.dive4elements.river.utils.RiverUtils; /** * Result type for data that goes into {@link SInfoResultRow}s. * * @author Gernot Belger */ public enum SInfoResultType { station(SInfoI18NStrings.UNIT_KM, SInfoI18NStrings.CSV_KM_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getWaterlevelKM(context); } }, waterlevel(null, SInfoI18NStrings.CSV_WATERLEVEL_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { // REMARK: other modules use Formatter.getWaterlevelW(context) instead, but that format with a variable number of // digits. return Formatter.getFlowDepth(context); } }, waterlevelLabel(SInfoI18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_LABEL_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { return exportStringValue(value); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, discharge(SInfoI18NStrings.UNIT_CUBIC_M, SInfoI18NStrings.CSV_DISCHARGE_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); final double roundedDischarge = RiverUtils.roundQ(doubleValue); return exportDoubleValue(context, roundedDischarge); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getWaterlevelQ(context); } }, meanBedHeight(null, SInfoI18NStrings.CSV_MEAN_BED_HEIGHT_HEADER, SInfoI18NStrings.CSV_MEAN_BED_HEIGHT_HEADER_SHORT) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getMeanBedHeight(context); } }, soundingLabel(SInfoI18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_SOUNDING_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { return exportStringValue(value); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, flowdepthmin(SInfoI18NStrings.UNIT_M, SInfoI18NStrings.CSV_FLOWDEPTH_MIN_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getFlowDepth(context); } }, flowdepthmax(SInfoI18NStrings.UNIT_M, SInfoI18NStrings.CSV_FLOWDEPTH_MAX_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getFlowDepth(context); } }, gaugeLabel(SInfoI18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_GAUGE_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { return exportStringValue(value); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, location(SInfoI18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_LOCATION_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { return exportStringValue(value); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, soilkind(SInfoI18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_TKHKIND_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { if (value == null) return StringUtils.EMPTY; final SoilKind kind = (SoilKind) value; final String key = SInfoI18NStrings.PREFIX_TKH_KIND + kind.name(); return Resources.getMsg(context.getMeta(), key, key); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, flowdepth(SInfoI18NStrings.UNIT_M, SInfoI18NStrings.CSV_FLOWDEPTH_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getFlowDepth(context); } }, d50(null, null) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, velocity(null, null) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, tau(null, null) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, tkh(SInfoI18NStrings.UNIT_CM, SInfoI18NStrings.CSV_TKH_HEADER, SInfoI18NStrings.CSV_TKH_HEADER_SHORT) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getTkh(context); } }, tkhup(SInfoI18NStrings.UNIT_CM, null) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, tkhdown(SInfoI18NStrings.UNIT_CM, null) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { throw new UnsupportedOperationException(); } }, flowdepthtkh(SInfoI18NStrings.UNIT_M, SInfoI18NStrings.CSV_FLOWDEPTHTKH_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); } @Override protected NumberFormat createFormatter(final CallContext context) { return Formatter.getFlowDepth(context); } }; /* Cache for formatters because Formatter will always create new formats (which is very expensive) */ private final Map<Locale, NumberFormat> formatters = new HashMap<>(); private final String unit; private final String csvHeader; private final String pdfHeader; private SInfoResultType(final String unit, final String csvAndPdfHeader) { this(unit, csvAndPdfHeader, csvAndPdfHeader); } private SInfoResultType(final String unit, final String csvHeader, final String pdfHeader) { this.unit = unit; this.csvHeader = csvHeader; this.pdfHeader = pdfHeader; } public abstract String exportValue(final CallContext context, final Object value); protected final String exportStringValue(final Object value) { if (value == null) return StringUtils.EMPTY; if (!(value instanceof String)) throw new IllegalStateException(); return (String) value; } protected final double asDouble(final Object value) { if (value == null) return Double.NaN; if (!(value instanceof Number)) throw new IllegalStateException(); final Number number = (Number) value; return number.doubleValue(); } protected final String exportDoubleValue(final CallContext context, final double value) { if (Double.isNaN(value)) return StringUtils.EMPTY; final NumberFormat formatter = getFormatter(context); return formatter.format(value); } private NumberFormat getFormatter(final CallContext context) { final CallMeta meta = context.getMeta(); final Locale locale = Resources.getLocale(meta); if (!this.formatters.containsKey(locale)) this.formatters.put(locale, createFormatter(context)); return this.formatters.get(locale); } protected abstract NumberFormat createFormatter(CallContext context); public final String getCsvHeader() { return this.csvHeader; } public final String getPdfHeader(final CallMeta meta) { return Resources.getMsg(meta, this.pdfHeader, this.pdfHeader); } public final String getUnit() { return this.unit; } }