gernotbelger@8999: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8999: * Software engineering by gernotbelger@8999: * Björnsen Beratende Ingenieure GmbH gernotbelger@8999: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8999: * gernotbelger@8999: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8999: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8999: * documentation coming with Dive4Elements River for details. gernotbelger@8999: */ gernotbelger@8999: package org.dive4elements.river.artifacts.common; gernotbelger@8999: mschaefer@9157: import java.text.DateFormat; gernotbelger@8999: import java.text.NumberFormat; mschaefer@9157: import java.util.Date; gernotbelger@8999: import java.util.HashMap; gernotbelger@8999: import java.util.Locale; gernotbelger@8999: import java.util.Map; gernotbelger@8999: gernotbelger@8999: import org.apache.commons.lang.StringUtils; gernotbelger@8999: import org.dive4elements.artifacts.CallContext; gernotbelger@8999: import org.dive4elements.artifacts.CallMeta; gernotbelger@8999: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@8999: gernotbelger@8999: /** gernotbelger@8999: * @author Domenico Nardi Tironi gernotbelger@8999: */ gernotbelger@8999: public abstract class AbstractResultType implements IResultType { gernotbelger@8999: gernotbelger@8999: /* Cache for formatters because Formatter will always create new formats (which is very expensive) */ gernotbelger@8999: private final Map formatters = new HashMap<>(); gernotbelger@8999: gernotbelger@8999: private final String unit; gernotbelger@8999: gernotbelger@8999: private final String csvHeader; gernotbelger@8999: gernotbelger@8999: private final String pdfHeader; gernotbelger@8999: gernotbelger@8999: protected AbstractResultType(final String unit, final String csvHeader, final String pdfHeader) { gernotbelger@8999: this.unit = unit; gernotbelger@8999: this.csvHeader = csvHeader; gernotbelger@8999: this.pdfHeader = pdfHeader; gernotbelger@8999: gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: @Override gernotbelger@8999: public abstract String exportValue(final CallContext context, final Object value); gernotbelger@8999: gernotbelger@8999: protected final String exportStringValue(final Object value) { gernotbelger@8999: gernotbelger@8999: if (value == null) gernotbelger@8999: return StringUtils.EMPTY; gernotbelger@8999: gernotbelger@8999: if (!(value instanceof String)) gernotbelger@8999: throw new IllegalStateException(); gernotbelger@8999: gernotbelger@8999: return (String) value; gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: @Override gernotbelger@8999: public final double asDouble(final Object value) { gernotbelger@8999: if (value == null) gernotbelger@8999: return Double.NaN; gernotbelger@8999: gernotbelger@8999: if (!(value instanceof Number)) gernotbelger@8999: throw new IllegalStateException(); gernotbelger@8999: gernotbelger@8999: final Number number = (Number) value; gernotbelger@8999: return number.doubleValue(); gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: protected final String exportDoubleValue(final CallContext context, final double value) { gernotbelger@8999: if (Double.isNaN(value)) gernotbelger@8999: return StringUtils.EMPTY; gernotbelger@8999: gernotbelger@8999: final NumberFormat formatter = getFormatter(context); gernotbelger@8999: return formatter.format(value); gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: private NumberFormat getFormatter(final CallContext context) { gernotbelger@8999: final CallMeta meta = context.getMeta(); gernotbelger@8999: final Locale locale = Resources.getLocale(meta); gernotbelger@8999: gernotbelger@8999: if (!this.formatters.containsKey(locale)) gernotbelger@8999: this.formatters.put(locale, createFormatter(context)); gernotbelger@8999: gernotbelger@8999: return this.formatters.get(locale); gernotbelger@8999: } gernotbelger@8999: mschaefer@9176: protected abstract NumberFormat createFormatter(CallContext context); mschaefer@9176: mschaefer@9157: protected final String exportDateValue(final CallContext context, final Date value) { mschaefer@9157: final Locale locale = Resources.getLocale(context.getMeta()); mschaefer@9168: final DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale); mschaefer@9157: return df.format(value); mschaefer@9157: } mschaefer@9157: gernotbelger@9150: @Override gernotbelger@8999: public final String getCsvHeader() { gernotbelger@8999: return this.csvHeader; gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: public final String getCsvHeader(final CallMeta meta) { gernotbelger@8999: return Resources.getMsg(meta, this.csvHeader, this.csvHeader); gernotbelger@8999: } gernotbelger@8999: mschaefer@9157: @Override gernotbelger@8999: public final String getPdfHeader(final CallMeta meta) { gernotbelger@8999: return Resources.getMsg(meta, this.pdfHeader, this.pdfHeader); gernotbelger@8999: } gernotbelger@8999: mschaefer@9157: @Override gernotbelger@8999: public final String getUnit() { gernotbelger@8999: return this.unit; gernotbelger@8999: } gernotbelger@8999: }