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@927: ingo@927: import org.apache.log4j.Logger; gernotbelger@9277: import org.dive4elements.artifactdatabase.data.StateData; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; gernotbelger@9277: import org.dive4elements.river.artifacts.D4EArtifact; gernotbelger@9277: import org.w3c.dom.Element; ingo@927: ingo@927: /** ingo@927: * @author Ingo Weinzierl ingo@927: */ ingo@927: public class WaterlevelGroundDifferences extends RangeState { ingo@927: gernotbelger@9277: public static final String LOWER_FIELD = "diff_from"; gernotbelger@9277: public static final String UPPER_FIELD = "diff_to"; gernotbelger@9277: public static final String DIFF_FIELD = "diff_diff"; ingo@927: ingo@927: public static final double DEFAULT_STEP = 0d; ingo@927: gernotbelger@9277: private static Logger log = Logger.getLogger(WaterlevelGroundDifferences.class); ingo@927: ingo@927: protected String getLowerField() { ingo@927: return LOWER_FIELD; ingo@927: } ingo@927: ingo@927: protected String getUpperField() { ingo@927: return UPPER_FIELD; ingo@927: } ingo@927: ingo@927: protected String getStepField() { ingo@927: return DIFF_FIELD; ingo@927: } ingo@927: ingo@927: @Override gernotbelger@9277: protected double[] getMinMax(final Artifact artifact) { ingo@927: return new double[] { -Double.MAX_VALUE, Double.MAX_VALUE }; ingo@927: } ingo@927: ingo@927: @Override ingo@927: protected String getUIProvider() { ingo@928: return "waterlevel_ground_panel"; ingo@927: } ingo@927: ingo@927: protected double getDefaultStep() { ingo@927: return DEFAULT_STEP; ingo@927: } ingo@927: ingo@927: @Override gernotbelger@9277: protected Element[] createItems(final XMLUtils.ElementCreator cr, final Artifact artifact, final String name, final CallContext context) { gernotbelger@9277: final double[] minmax = getMinMax(artifact); ingo@927: ingo@927: double minVal = Double.MIN_VALUE; ingo@927: double maxVal = Double.MAX_VALUE; ingo@927: ingo@927: if (minmax != null) { ingo@927: minVal = minmax[0]; ingo@927: maxVal = minmax[1]; gernotbelger@9277: } else { teichmann@8202: log.warn("Could not read min/max distance values!"); ingo@927: } ingo@927: ingo@927: if (name.equals(LOWER_FIELD)) { gernotbelger@9277: final Element min = createItem(cr, new String[] { "min", new Double(minVal).toString() }); ingo@927: ingo@927: return new Element[] { min }; gernotbelger@9277: } else if (name.equals(UPPER_FIELD)) { gernotbelger@9277: final Element max = createItem(cr, new String[] { "max", new Double(maxVal).toString() }); ingo@927: ingo@927: return new Element[] { max }; gernotbelger@9277: } else { gernotbelger@9277: final Element step = createItem(cr, new String[] { "step", String.valueOf(getDefaultStep()) }); ingo@927: return new Element[] { step }; ingo@927: } ingo@927: } ingo@927: gernotbelger@9277: // ist mit super identisch! gernotbelger@9277: // protected Element createItem(XMLUtils.ElementCreator cr, Object obj) { gernotbelger@9277: // Element item = ProtocolUtils.createArtNode(cr, "item", null, null); gernotbelger@9277: // Element label = ProtocolUtils.createArtNode(cr, "label", null, null); gernotbelger@9277: // Element value = ProtocolUtils.createArtNode(cr, "value", null, null); gernotbelger@9277: // gernotbelger@9277: // String[] arr = (String[]) obj; gernotbelger@9277: // gernotbelger@9277: // label.setTextContent(arr[0]); gernotbelger@9277: // value.setTextContent(arr[1]); gernotbelger@9277: // gernotbelger@9277: // item.appendChild(label); gernotbelger@9277: // item.appendChild(value); gernotbelger@9277: // gernotbelger@9277: // return item; gernotbelger@9277: // } felix@4865: felix@4865: @Override gernotbelger@9277: public boolean validate(final Artifact artifact) throws IllegalArgumentException { gernotbelger@9277: final D4EArtifact flys = (D4EArtifact) artifact; felix@4865: gernotbelger@9277: final StateData dFrom = getData(flys, getLowerField()); gernotbelger@9277: final StateData dTo = getData(flys, getUpperField()); gernotbelger@9277: final StateData dStep = getData(flys, getStepField()); felix@4865: gernotbelger@9277: final String fromStr = dFrom != null ? (String) dFrom.getValue() : null; gernotbelger@9277: final String toStr = dTo != null ? (String) dTo.getValue() : null; gernotbelger@9277: final String stepStr = dStep != null ? (String) dStep.getValue() : null; felix@4865: felix@4865: if (fromStr == null || toStr == null || stepStr == null) { felix@4865: throw new IllegalArgumentException("error_empty_state"); felix@4865: } felix@4865: felix@4865: try { gernotbelger@9277: final double from = Double.parseDouble(fromStr); gernotbelger@9277: final double to = Double.parseDouble(toStr); gernotbelger@9277: final double step = Double.parseDouble(stepStr); felix@4865: gernotbelger@9277: final double[] minmax = getMinMax(flys); felix@4865: felix@4865: return validateBounds(minmax[0], minmax[1], from, to, step); felix@4865: } gernotbelger@9277: catch (final NumberFormatException nfe) { felix@4865: throw new IllegalArgumentException("error_invalid_double_value"); felix@4865: } felix@4865: } teichmann@7736: teichmann@7736: @Override gernotbelger@9277: protected boolean validateBounds(final double fromValid, final double toValid, final double from, final double to) throws IllegalArgumentException { teichmann@7736: if (to < 0d) { gernotbelger@9277: log.error("Invalid 'to' " + to + " is lesser than zero."); teichmann@7736: throw new IllegalArgumentException("error_feed_from_out_of_range"); teichmann@7736: } teichmann@7736: return super.validateBounds(fromValid, toValid, from, to); teichmann@7736: } ingo@927: } ingo@927: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :