teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.states; ingo@2709: rrenkert@7823: import java.text.NumberFormat; teichmann@8070: import java.util.Collections; ingo@2712: import java.util.List; ingo@2712: ingo@2709: import org.apache.log4j.Logger; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.common.model.KVP; rrenkert@7823: import org.dive4elements.artifacts.common.utils.XMLUtils; rrenkert@7823: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; gernotbelger@9390: import org.dive4elements.river.artifacts.D4EArtifact; gernotbelger@9390: import org.dive4elements.river.artifacts.resources.Resources; tom@8559: import org.dive4elements.river.model.BedHeight; teichmann@5831: import org.dive4elements.river.model.River; rrenkert@7823: import org.dive4elements.river.utils.Formatter; teichmann@5865: import org.dive4elements.river.utils.RiverUtils; rrenkert@7823: import org.w3c.dom.Element; ingo@2712: rrenkert@7823: public class SoundingsSelect extends DefaultState { ingo@2709: felix@3931: public static final String SOUNDINGS = "soundings"; ingo@2709: ingo@2712: public static final String PREFIX_SINGLE = "single-"; ingo@2712: teichmann@8202: /** Private log. */ teichmann@8202: private static final Logger log = Logger.getLogger(SoundingsSelect.class); ingo@2709: ingo@2709: @Override ingo@2709: public String getUIProvider() { gernotbelger@9390: return "parameter-matrix-sounding"; ingo@2709: } ingo@2709: rrenkert@7823: @Override gernotbelger@9390: protected void appendItems(final Artifact artifact, final ElementCreator creator, final String name, final CallContext context, final Element select) { rrenkert@7823: try { rrenkert@7823: creator.addAttr(select, "type", "multiattribute", true); ingo@2709: teichmann@8070: appendMeta(creator, select); teichmann@8070: rrenkert@7823: getOptions(artifact, name, context, creator, select); rrenkert@7823: } gernotbelger@9390: catch (final IllegalArgumentException iae) { teichmann@8202: log.warn("Illegal argument", iae); rrenkert@7823: } rrenkert@7823: } rrenkert@7823: gernotbelger@9390: private static Element order(final ElementCreator creator, final String name, final String order) { gernotbelger@9390: final Element element = creator.create(name); teichmann@8070: creator.addAttr(element, "order", order, false); teichmann@8070: return element; teichmann@8070: } teichmann@8070: gernotbelger@9390: private void appendMeta(final ElementCreator creator, final Element select) { teichmann@8070: gernotbelger@9390: final Element meta = creator.create("meta"); gernotbelger@9390: meta.appendChild(order(creator, "year", "0")); gernotbelger@9390: meta.appendChild(order(creator, "value", "1")); teichmann@8070: meta.appendChild(order(creator, "analyzed_range", "2")); gernotbelger@9390: meta.appendChild(order(creator, "label", "3")); gernotbelger@9390: meta.appendChild(order(creator, "minfo_type", "4")); teichmann@8070: teichmann@8070: select.appendChild(meta); teichmann@8070: teichmann@8070: } teichmann@8070: gernotbelger@9390: protected KVP[] getOptions(final Artifact artifact, final String parameterName, final CallContext context, final ElementCreator creator, gernotbelger@9390: final Element select) throws IllegalArgumentException { teichmann@8202: log.debug("Get options for parameter: '" + parameterName + "'"); ingo@2709: ingo@2709: if (!testParameterName(parameterName)) { gernotbelger@9390: throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'"); ingo@2709: } ingo@2709: gernotbelger@9390: final River river = RiverUtils.getRiver((D4EArtifact) artifact); gernotbelger@9390: final double lo = ((D4EArtifact) artifact).getDataAsDouble("ld_from"); gernotbelger@9390: final double hi = ((D4EArtifact) artifact).getDataAsDouble("ld_to"); ingo@2716: gernotbelger@9390: final double kmLo = Math.min(lo, hi); gernotbelger@9390: final double kmHi = Math.max(lo, hi); ingo@2709: rrenkert@7823: appendSingles(river, kmLo, kmHi, creator, select, context); ingo@2712: gernotbelger@9390: final List> kvp = Collections.>emptyList(); sascha@3452: return kvp.toArray(new KVP[kvp.size()]); ingo@2712: } ingo@2712: gernotbelger@9390: protected void appendSingles(final River river, final double kmLo, final double kmHi, final ElementCreator creator, final Element select, gernotbelger@9390: final CallContext context) { gernotbelger@9390: final List singles = BedHeight.getBedHeights(river, kmLo, kmHi); ingo@3785: ingo@2712: if (singles != null) { gernotbelger@9390: final int size = singles.size(); ingo@3785: teichmann@8202: log.debug("Found " + size + " singles."); ingo@3785: gernotbelger@9390: final NumberFormat nf = Formatter.getCalculationKm(context.getMeta()); ingo@3782: for (int i = 0; i < size; i++) { gernotbelger@9390: final BedHeight s = singles.get(i); ingo@2712: gernotbelger@9390: final String id = PREFIX_SINGLE + s.getId(); gernotbelger@9390: final String value = s.getDescription(); ingo@2712: gernotbelger@9390: final Integer year = s.getYear(); gernotbelger@9390: final Element item = creator.create("item"); rrenkert@7823: creator.addAttr(item, "label", value, true); rrenkert@7823: creator.addAttr(item, "value", id, true); gernotbelger@9390: creator.addAttr(item, "analyzed_range", nf.format(s.getRange().getA()) + " - " + nf.format(s.getRange().getB())); gernotbelger@9390: creator.addAttr(item, "year", year != null ? s.getYear().toString() : ""); rrenkert@7875: creator.addAttr(item, "minfo_type", s.getType().getName()); rrenkert@7823: select.appendChild(item); ingo@2712: } ingo@2709: } teichmann@8202: if (log.isDebugEnabled()) { teichmann@8202: log.debug("appended singles"); teichmann@8202: log.debug(XMLUtils.toString(select)); teichmann@8070: } ingo@2712: } ingo@2709: rrenkert@7823: @Override gernotbelger@9390: protected Element createStaticData(final D4EArtifact flys, final ElementCreator creator, final CallContext cc, final String name, final String value, gernotbelger@9390: final String type) { gernotbelger@9390: final Element data = creator.create("data"); gernotbelger@9390: creator.addAttr(data, "name", name, true); gernotbelger@9390: creator.addAttr(data, "type", type, true); gernotbelger@9390: creator.addAttr(data, "label", Resources.getMsg(cc.getMeta(), name, name), true); ingo@2709: gernotbelger@9390: final String[] values = value.split(";"); rrenkert@7823: gernotbelger@9390: for (final String val : values) { gernotbelger@9390: final Element item = creator.create("item"); rrenkert@7823: creator.addAttr(item, "value", val, true); rrenkert@7823: creator.addAttr(item, "label", getLabelFor(cc, name, val), true); rrenkert@7823: rrenkert@7823: data.appendChild(item); rrenkert@7823: } rrenkert@7823: rrenkert@7823: return data; rrenkert@7823: } rrenkert@7823: gernotbelger@9390: protected String getLabelFor(final CallContext cc, final String parameterName, final String value) throws IllegalArgumentException { ingo@2709: if (!testParameterName(parameterName)) { gernotbelger@9390: throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'"); ingo@2709: } ingo@2709: ingo@2712: if (value.indexOf(PREFIX_SINGLE) >= 0) { ingo@2712: return getLabelForSingle(cc, value); ingo@2712: } ingo@2712: return value; ingo@2712: } ingo@2712: gernotbelger@9390: protected String getLabelForSingle(final CallContext cc, final String value) { gernotbelger@9390: final String id = value.replace(PREFIX_SINGLE, ""); ingo@2712: try { gernotbelger@9390: final BedHeight s = BedHeight.getBedHeightById(Integer.parseInt(id)); ingo@2712: ingo@2712: if (s != null) { ingo@2712: return s.getDescription(); gernotbelger@9390: } else { ingo@2712: return "no value for '" + id + "'"; ingo@2712: } ingo@2712: } gernotbelger@9390: catch (final NumberFormatException nfe) { teichmann@8202: log.warn("Could not parse id from string '" + id + "'", nfe); ingo@2712: } ingo@2712: ingo@2712: return "n.A."; ingo@2712: } ingo@2712: ingo@2709: /** tom@8856: * This method might be used to test, if a parameter name tom@8856: * is handled by this state. ingo@2709: * gernotbelger@9390: * @param parameterName gernotbelger@9390: * The name of a parameter. ingo@2709: * ingo@2709: * @return true, if parameterName is one of MAIN_CHANNEL or gernotbelger@9390: * TOTAL_CHANNEL. Otherwise false. ingo@2709: */ gernotbelger@9390: protected boolean testParameterName(final String parameterName) { ingo@2709: if (parameterName == null || parameterName.length() == 0) { ingo@2709: return false; gernotbelger@9390: } else if (parameterName.equals(SOUNDINGS)) { ingo@2709: return true; gernotbelger@9390: } else { ingo@2709: return false; ingo@2709: } ingo@2709: } ingo@2709: } sascha@3083: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :