diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java @ 1055:61c051e53f9b

Moved WINFO specific stuff from FLYS into WINFO artifact. flys-artifacts/trunk@2525 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 22 Aug 2011 15:25:48 +0000
parents eccf966fb677
children bd1b751deab3
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java	Mon Aug 22 13:07:26 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java	Mon Aug 22 15:25:48 2011 +0000
@@ -1,27 +1,18 @@
 package de.intevation.flys.artifacts;
 
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.TreeMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import de.intevation.artifactdatabase.ArtifactDatabaseImpl;
+import de.intevation.artifactdatabase.DefaultArtifact;
 
-import javax.xml.xpath.XPathConstants;
-
-import gnu.trove.TDoubleArrayList;
+import de.intevation.artifactdatabase.data.DefaultStateData;
+import de.intevation.artifactdatabase.data.StateData;
 
-import net.sf.ehcache.Cache;
+import de.intevation.artifactdatabase.state.DefaultOutput;
+import de.intevation.artifactdatabase.state.Facet;
+import de.intevation.artifactdatabase.state.Output;
+import de.intevation.artifactdatabase.state.State;
+import de.intevation.artifactdatabase.state.StateEngine;
 
-import org.apache.log4j.Logger;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
+import de.intevation.artifactdatabase.transition.TransitionEngine;
 
 import de.intevation.artifacts.Artifact;
 import de.intevation.artifacts.ArtifactDatabase;
@@ -31,36 +22,35 @@
 import de.intevation.artifacts.CallMeta;
 
 import de.intevation.artifacts.common.ArtifactNamespaceContext;
+
 import de.intevation.artifacts.common.utils.XMLUtils;
 
-import de.intevation.artifactdatabase.ArtifactDatabaseImpl;
-import de.intevation.artifactdatabase.DefaultArtifact;
-import de.intevation.artifactdatabase.data.DefaultStateData;
-import de.intevation.artifactdatabase.data.StateData;
-import de.intevation.artifactdatabase.state.DefaultOutput;
-import de.intevation.artifactdatabase.state.Facet;
-import de.intevation.artifactdatabase.state.Output;
-import de.intevation.artifactdatabase.state.State;
-import de.intevation.artifactdatabase.state.StateEngine;
-import de.intevation.artifactdatabase.transition.TransitionEngine;
-
-import de.intevation.flys.utils.DoubleUtil;
-
-import de.intevation.flys.model.Gauge;
-import de.intevation.flys.model.River;
+import de.intevation.flys.artifacts.cache.CacheFactory;
 
 import de.intevation.flys.artifacts.context.FLYSContext;
 
-import de.intevation.flys.artifacts.cache.CacheFactory;
-
-import de.intevation.flys.artifacts.model.DischargeTables;
-import de.intevation.flys.artifacts.model.RiverFactory;
-import de.intevation.flys.artifacts.model.Segment;
+import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
 
 import de.intevation.flys.artifacts.states.DefaultState;
-import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
-import de.intevation.flys.artifacts.states.LocationDistanceSelect;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.xml.xpath.XPathConstants;
+
+import net.sf.ehcache.Cache;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
 
 /**
  * The defaul FLYS artifact.
@@ -92,13 +82,6 @@
     /** The constant string that shows that an operation failed.*/
     public static final String OPERATION_FAILED = "FAILURE";
 
-    /** The default number of steps between the start end end of a selected Q
-     * range.*/
-    public static final int DEFAULT_Q_STEPS = 30;
-
-    /** The default step width between the start end end kilometer.*/
-    public static final double DEFAULT_KM_STEPS = 0.1;
-
 
     /** The identifier of the current state. */
     protected String currentStateId;
@@ -522,581 +505,6 @@
 
 
     /**
-     * Returns the selected River object based on the 'river' data that might
-     * have been inserted by the user.
-     *
-     * @return the selected River or null if no river has been chosen yet.
-     */
-    public River getRiver() {
-        StateData dRiver = getData("river");
-
-        return dRiver != null
-            ? RiverFactory.getRiver((String) dRiver.getValue())
-            : null;
-    }
-
-
-    /**
-     * Returns the selected distance of points.
-     *
-     * @return the selected distance or points.
-     */
-    public double[] getDistance() {
-        StateData dMode      = getData("ld_mode");
-        StateData dFrom      = getData("ld_from");
-        StateData dTo        = getData("ld_to");
-        StateData dLocations = getData("ld_locations");
-
-        if (dMode != null) {
-            String mode = (String)dMode.getValue();
-            if ("location".equals(mode)) {
-                double[] locations = getLocations();
-                return new double[] { locations[0], locations[locations.length-1] };
-            }
-            if (dFrom != null && dTo != null) {
-                return getDistanceByRange(dFrom, dTo);
-            }
-        }
-
-        if (dLocations != null) {
-            double[] locations = getLocations();
-            return new double[] { locations[0], locations[locations.length-1] };
-        }
-
-        if (dFrom != null && dTo != null) {
-            return getDistanceByRange(dFrom, dTo);
-        }
-
-        logger.warn("No data found for distance determination!");
-
-        return null;
-    }
-
-
-    /**
-     * Determines the selected mode of distance/range input.
-     *
-     * @return true, if the range mode is selected otherwise false.
-     */
-    public boolean isRange() {
-        StateData mode = getData("ld_mode");
-
-        if (mode == null) {
-            logger.warn("No mode location/range chosen. Defaults to range.");
-            return true;
-        }
-
-        String value = (String) mode.getValue();
-
-        return value.equals("distance");
-    }
-
-
-    /**
-     * Returns the selected locations based on a given array of locations.
-     *
-     * @param locations The StateData that contains the locations.
-     *
-     * @return the selected locations.
-     */
-    public double[] getLocations() {
-        StateData dLocations  = getData("ld_locations");
-        String    locationStr = dLocations != null
-            ? (String) dLocations.getValue()
-            : "";
-
-        if (locationStr == null || locationStr.length() == 0) {
-            logger.warn("No valid location string found!");
-            return null;
-        }
-
-        String[] tmp               = locationStr.split(" ");
-        TDoubleArrayList locations = new TDoubleArrayList();
-
-        for (String l: tmp) {
-            try {
-                locations.add(Double.parseDouble(l));
-            }
-            catch (NumberFormatException nfe) {
-                logger.warn(nfe, nfe);
-            }
-        }
-
-        locations.sort();
-
-        return locations.toNativeArray();
-    }
-
-
-    /**
-     * Returns the selected distance based on a given range (from, to).
-     *
-     * @param dFrom The StateData that contains the lower value.
-     * @param dTo The StateData that contains the upper value.
-     *
-     * @return the selected distance.
-     */
-    protected double[] getDistanceByRange(StateData dFrom, StateData dTo) {
-        double from = Double.parseDouble((String) dFrom.getValue());
-        double to   = Double.parseDouble((String) dTo.getValue());
-
-        return new double[] { from, to };
-    }
-
-
-    /**
-     * Returns the selected Kms.
-     *
-     * @param distance An 2dim array with [lower, upper] values.
-     *
-     * @return the selected Kms.
-     */
-    public double[] getKms(double[] distance) {
-        StateData dStep = getData("ld_step");
-
-        if (dStep == null) {
-            logger.warn("No step width given. Cannot compute Kms.");
-            return null;
-        }
-
-        double step = Double.parseDouble((String) dStep.getValue());
-
-        // transform step from 'm' into 'km'
-        step = step / 1000;
-
-        if (step == 0d) {
-            step = DEFAULT_KM_STEPS;
-        }
-
-        return DoubleUtil.explode(distance[0], distance[1], step);
-    }
-
-
-    /**
-     * Returns the selected Kms.
-     *
-     * @return the selected kms.
-     */
-    public double[] getKms() {
-        if (isRange()) {
-            double[] distance = getDistance();
-            return getKms(distance);
-
-        }
-        else {
-            return LocationDistanceSelect.getLocations(this);
-        }
-    }
-
-    public double [] getFromToStep() {
-        if (!isRange()) {
-            return null;
-        }
-        double [] fromTo = getDistance();
-
-        if (fromTo == null) {
-            return null;
-        }
-
-        StateData dStep = getData("ld_step");
-        if (dStep == null) {
-            return null;
-        }
-
-        double [] result = new double[3];
-        result[0] = fromTo[0];
-        result[1] = fromTo[1];
-
-        try {
-            String step = (String)dStep.getValue();
-            result[2] = DoubleUtil.round(Double.parseDouble(step) / 1000d);
-        }
-        catch (NumberFormatException nfe) {
-            return null;
-        }
-
-        return result;
-    }
-
-
-    /**
-     * Returns the gauge based on the current distance and river.
-     *
-     * @return the gauge.
-     */
-    public Gauge getGauge() {
-        River    river = getRiver();
-
-        if (river == null) {
-            logger.debug("no river found");
-            return null;
-        }
-
-        double[] dist  = getDistance();
-
-        if (dist == null) {
-            logger.debug("no range found");
-            return null;
-        }
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("Determine gauge for:");
-            logger.debug("... river: " + river.getName());
-            logger.debug("... distance: " + dist[0] + " - " + dist[1]);
-        }
-
-        Gauge gauge = river.determineGauge(dist[0], dist[1]);
-
-        String name = gauge != null ? gauge.getName() : "'n/a";
-        logger.debug("Found gauge: " + name);
-
-        return gauge;
-    }
-
-
-    /**
-     * Returns the gauges that match the selected kilometer range.
-     *
-     * @return the gauges based on the selected kilometer range.
-     */
-    public List<Gauge> getGauges() {
-
-        River river = getRiver();
-        if (river == null) {
-            return null;
-        }
-
-        double [] dist  = getDistance();
-        if (dist == null) {
-            return null;
-        }
-
-        return river.determineGauges(dist[0], dist[1]);
-    }
-
-
-    /**
-     * This method returns the Q values.
-     *
-     * @return the selected Q values or null, if no Q values are selected.
-     */
-    public double[] getQs() {
-        StateData dMode      = getData("wq_mode");
-        StateData dSelection = getData("wq_selection");
-
-        String mode = dMode != null ? (String) dMode.getValue() : "";
-        String sel  = dSelection != null ? (String)dSelection.getValue() : null;
-
-        if (mode.equals("Q")) {
-            if (sel != null && sel.equals("single")) {
-                return getSingleWQValues();
-            }
-            else {
-                return getWQTriple();
-            }
-        }
-        else {
-            logger.warn("You try to get Qs, but W has been inserted.");
-            return null;
-        }
-    }
-
-
-    public boolean isQ() {
-        StateData mode = getData("wq_mode");
-        return mode != null && mode.getValue().equals("Q");
-    }
-
-
-    /**
-     * Returns true, if the parameter is set to compute data on a free range.
-     * Otherwise it returns false, which tells the calculation that it is bound
-     * to a gauge.
-     *
-     * @return true, if the calculation should compute on a free range otherwise
-     * false and the calculation is bound to a gauge.
-     */
-    public boolean isFreeQ() {
-        StateData mode  = getData("wq_free");
-        String    value = mode != null ? (String) mode.getValue() : null;
-
-        logger.debug("isFreeQ: " + value);
-
-        if (value == null) {
-            return false;
-        }
-
-        return Boolean.valueOf(value);
-    }
-
-
-    /**
-     * Returns the Q values based on a specified kilometer range.
-     *
-     * @param range A 2dim array with lower and upper kilometer range.
-     *
-     * @return an array of Q values.
-     */
-    public double[] getQs(double[] range) {
-        StateData dMode   = getData("wq_mode");
-        StateData dValues = getData("wq_values");
-
-        String mode = dMode != null ? (String) dMode.getValue() : "";
-
-        if (mode.equals("Q")) {
-            return getWQForDist(range);
-        }
-
-        logger.warn("You try to get Qs, but Ws has been inserted.");
-        return null;
-    }
-
-
-    /**
-     * Returns the W values based on a specified kilometer range.
-     *
-     * @param range A 2dim array with lower and upper kilometer range.
-     *
-     * @return an array of W values.
-     */
-    public double[] getWs(double[] range) {
-        StateData dMode   = getData("wq_mode");
-        StateData dValues = getData("wq_values");
-
-        String mode = dMode != null ? (String) dMode.getValue() : "";
-
-        if (mode.equals("W")) {
-            return getWQForDist(range);
-        }
-
-        logger.warn("You try to get Ws, but Qs has been inserted.");
-        return null;
-    }
-
-
-    /**
-     * This method returns the W values.
-     *
-     * @return the selected W values or null, if no W values are selected.
-     */
-    public double[] getWs() {
-        StateData dMode   = getData("wq_mode");
-        StateData dSingle = getData("wq_single");
-
-        String mode = dMode != null ? (String) dMode.getValue() : "";
-
-        if (mode.equals("W")) {
-            if (dSingle != null) {
-                return getSingleWQValues();
-            }
-            else {
-                return getWQTriple();
-            }
-        }
-        else {
-            logger.warn("You try to get Qs, but W has been inserted.");
-            return null;
-        }
-    }
-
-    public List<Segment> getSegments() {
-        StateData wqValues = getData("wq_values");
-        if (wqValues == null) {
-            logger.warn("no wq_values given");
-            return Collections.emptyList();
-        }
-        String input = (String)wqValues.getValue();
-        if (input == null || (input = input.trim()).length() == 0) {
-            logger.warn("wq_values are empty");
-            return Collections.emptyList();
-        }
-        return Segment.parseSegments(input);
-    }
-
-
-    /**
-     * Returns the Qs for a number of Ws. This method makes use of
-     * DischargeTables.getQForW().
-     *
-     * @param ws An array of W values.
-     *
-     * @return an array of Q values.
-     */
-    public double[] getQsForWs(double[] ws) {
-
-        boolean debug = logger.isDebugEnabled();
-
-        if (debug) {
-            logger.debug("FLYSArtifact.getQsForWs");
-        }
-
-        River r = getRiver();
-        if (r == null) {
-            logger.warn("no river found");
-            return null;
-
-        }
-
-        double [] range = getDistance();
-        if (range == null) {
-            logger.warn("no ranges found");
-            return null;
-        }
-
-        if (debug) {
-            logger.debug("range: " + Arrays.toString(range));
-        }
-
-        Gauge g = r.determineGaugeByPosition(range[0]);
-        if (g == null) {
-            logger.warn("no gauge found for km: " + range[0]);
-            return null;
-        }
-
-        if (debug) {
-            logger.debug("convert w->q with gauge '" + g.getName() + "'");
-        }
-
-        DischargeTables dt = new DischargeTables(r.getName(), g.getName());
-        Map<String, double [][]>  tmp = dt.getValues();
-
-        double[][] values = tmp.get(g.getName());
-        double[]   qs     = new double[ws.length];
-
-        for (int i = 0; i < ws.length; i++) {
-            qs[i] = dt.getQForW(values, ws[i]);
-            if (debug) {
-                logger.debug("w: " + ws[i] + " -> q: " + qs[i]);
-            }
-        }
-
-        return qs;
-    }
-
-    /**
-     * This method returns the given W or Q values for a specific range
-     * (inserted in the WQ input panel for discharge longitudinal sections).
-     *
-     * @param dist A 2dim array with lower und upper kilometer values.
-     *
-     * @return an array of W or Q values.
-     */
-    protected double[] getWQForDist(double[] dist) {
-        logger.debug("Search wq values for range: " + dist[0] + " - " + dist[1]);
-        StateData data = getData("wq_values");
-
-        if (data == null) {
-            logger.warn("Missing wq values!");
-            return null;
-        }
-
-        String dataString = (String) data.getValue();
-        String[]   ranges = dataString.split(":");
-
-        for (String range: ranges) {
-            String[] parts = range.split(";");
-
-            double lower = Double.parseDouble(parts[0]);
-            double upper = Double.parseDouble(parts[1]);
-
-            if (lower <= dist[0] && upper >= dist[1]) {
-                String[] values = parts[2].split(",");
-
-                int      num = values.length;
-                double[] res = new double[num];
-
-                for (int i = 0; i < num; i++) {
-                    try {
-                        res[i] = Double.parseDouble(values[i]);
-                    }
-                    catch (NumberFormatException nfe) {
-                        logger.warn(nfe, nfe);
-                    }
-                }
-
-                return res;
-            }
-        }
-
-        logger.warn("Specified range for WQ not found!");
-
-        return null;
-    }
-
-
-    /**
-     * This method returns an array of inserted WQ triples that consist of from,
-     * to and the step width.
-     *
-     * @return an array of from, to and step width.
-     */
-    protected double[] getWQTriple() {
-        StateData dFrom = getData("wq_from");
-        StateData dTo   = getData("wq_to");
-
-        if (dFrom == null || dTo == null) {
-            logger.warn("Missing start or end value for range.");
-            return null;
-        }
-
-        double from = Double.parseDouble((String) dFrom.getValue());
-        double to   = Double.parseDouble((String) dTo.getValue());
-
-        StateData dStep = getData("wq_step");
-
-        if (dStep == null) {
-            logger.warn("No step width given. Cannot compute Qs.");
-            return null;
-        }
-
-        double step  = Double.parseDouble((String) dStep.getValue());
-
-        // if no width is given, the DEFAULT_Q_STEPS is used to compute the step
-        // width. Maybe, we should round the value to a number of digits.
-        if (step == 0d) {
-            double diff = to - from;
-            step = diff / DEFAULT_Q_STEPS;
-        }
-
-        return DoubleUtil.explode(from, to, step);
-    }
-
-
-    /**
-     * Returns an array of inserted WQ double values stored as whitespace
-     * separated list.
-     *
-     * @return an array of W or Q values.
-     */
-    protected double[] getSingleWQValues() {
-        StateData dSingle = getData("wq_single");
-
-        if (dSingle == null) {
-            logger.warn("Cannot determine single WQ values. No data given.");
-            return null;
-        }
-
-        String   tmp       = (String) dSingle.getValue();
-        String[] strValues = tmp.split(" ");
-
-        TDoubleArrayList values = new TDoubleArrayList();
-
-        for (String strValue: strValues) {
-            try {
-                values.add(Double.parseDouble(strValue));
-            }
-            catch (NumberFormatException nfe) {
-                logger.warn(nfe, nfe);
-            }
-        }
-
-        values.sort();
-
-        return values.toNativeArray();
-    }
-
-
-    /**
      * Computes the hash code of the entered values.
      *
      * @return a hash code.

http://dive4elements.wald.intevation.org