diff artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java @ 9425:3f49835a00c3

Extended CrossSectionFacet so it may fetch different data from within the artifact result. Also allows to have acces to the potentially already computed artifact result via its normal computation cache.
author gernotbelger
date Fri, 17 Aug 2018 15:31:02 +0200
parents 23264d1a528f
children
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java	Fri Aug 17 14:29:05 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java	Fri Aug 17 15:31:02 2018 +0200
@@ -8,36 +8,26 @@
 
 package org.dive4elements.river.artifacts;
 
-import java.awt.geom.Point2D;
-
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
-
-import org.w3c.dom.Document;
-
 import org.dive4elements.artifactdatabase.state.Facet;
 import org.dive4elements.artifactdatabase.state.FacetActivity;
-
 import org.dive4elements.artifacts.Artifact;
 import org.dive4elements.artifacts.ArtifactFactory;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.artifacts.CallMeta;
-
 import org.dive4elements.artifacts.common.utils.XMLUtils;
-
-import org.dive4elements.river.artifacts.geom.Lines;
-
 import org.dive4elements.river.artifacts.model.FacetTypes;
-import org.dive4elements.river.model.FastCrossSectionLine;
 import org.dive4elements.river.artifacts.model.WKms;
-import org.dive4elements.river.artifacts.model.WQKms;
 import org.dive4elements.river.artifacts.model.WKmsFactory;
+import org.dive4elements.river.artifacts.model.WQKms;
 import org.dive4elements.river.artifacts.model.WQKmsFactory;
-
 import org.dive4elements.river.artifacts.states.DefaultState;
-
+import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
+import org.w3c.dom.Document;
 
 /**
  * Artifact to access additional "waterlevel/discharge"-type of data, like
@@ -46,34 +36,23 @@
  * This artifact neglects (Static)D4EArtifacts capabilities of interaction
  * with the StateEngine by overriding the getState*-methods.
  */
-public class StaticWQKmsArtifact
-extends      StaticD4EArtifact
-implements   FacetTypes, WaterLineArtifact
-{
+public class StaticWQKmsArtifact extends StaticD4EArtifact implements FacetTypes, WaterLineArtifact {
     /** The log for this class. */
-    private static Logger log =
-        Logger.getLogger(StaticWQKmsArtifact.class);
+    private static Logger log = Logger.getLogger(StaticWQKmsArtifact.class);
 
-    public static final String STATIC_STATE_NAME =
-        "state.additional_wqkms.static";
+    public static final String STATIC_STATE_NAME = "state.additional_wqkms.static";
 
     private static final String NAME = "staticwqkms";
 
     static {
         // TODO: Move to configuration.
-        FacetActivity.Registry.getInstance().register(
-            NAME,
-            new FacetActivity() {
-                @Override
-                public Boolean isInitialActive(
-                    Artifact artifact,
-                    Facet    facet,
-                    String   outputName
-                ) {
-                    String fname = facet.getName();
-                    return (fname.equals(STATIC_WQKMS)
-                        || fname.equals(STATIC_WQKMS_W));
-                }});
+        FacetActivity.Registry.getInstance().register(NAME, new FacetActivity() {
+            @Override
+            public Boolean isInitialActive(final Artifact artifact, final Facet facet, final String outputName) {
+                final String fname = facet.getName();
+                return (fname.equals(STATIC_WQKMS) || fname.equals(STATIC_WQKMS_W));
+            }
+        });
     }
 
     /**
@@ -83,7 +62,6 @@
         log.debug("StaticWQKmsArtifact.StaticWQKmsArtifact");
     }
 
-
     /**
      * Gets called from factory, to set things up.
      *
@@ -92,14 +70,8 @@
      * case handling.
      */
     @Override
-    public void setup(
-        String          identifier,
-        ArtifactFactory factory,
-        Object          context,
-        CallMeta        callMeta,
-        Document        data,
-        List<Class>     loadFacets)
-    {
+    public void setup(final String identifier, final ArtifactFactory factory, final Object context, final CallMeta callMeta, final Document data,
+            final List<Class> loadFacets) {
         log.debug("StaticWQKmsArtifact.setup");
 
         // Store the 'ids' (from datacage).
@@ -107,23 +79,22 @@
             log.debug("StaticWQKmsArtifact.setup" + XMLUtils.toString(data));
         }
 
-        String code = getDatacageIDValue(data);
+        final String code = getDatacageIDValue(data);
         addStringData("ids", code);
         if (code != null) {
-            String [] parts = code.split("-");
+            final String[] parts = code.split("-");
 
             if (parts.length >= 1) {
-                boolean official = parts[0].toLowerCase()
-                    .startsWith("official");
+                final boolean official = parts[0].toLowerCase().startsWith("official");
                 addStringData("official", official ? "1" : "0");
             }
 
             if (parts.length >= 4) {
-                int col = Integer.parseInt(parts[2]);
-                int wst = Integer.parseInt(parts[3]);
+                final int col = Integer.parseInt(parts[2]);
+                final int wst = Integer.parseInt(parts[3]);
 
                 addStringData("col_pos", parts[2]);
-                addStringData("wst_id",  parts[3]);
+                addStringData("wst_id", parts[3]);
             }
         }
 
@@ -131,70 +102,65 @@
         super.setup(identifier, factory, context, callMeta, data, loadFacets);
     }
 
-
     /**
      * Called via setup.
      *
-     * @param artifact The master-artifact.
+     * @param artifact
+     *            The master-artifact.
      */
     @Override
-    protected void initialize(
-        Artifact artifact,
-        Object context,
-        CallMeta meta)
-    {
+    protected void initialize(final Artifact artifact, final Object context, final CallMeta meta) {
         log.debug("StaticWQKmsArtifact.initialize");
-        D4EArtifact flys = (D4EArtifact) artifact;
+        final D4EArtifact flys = (D4EArtifact) artifact;
         // TODO: The river is of no interest, so far., also use importData
         importData(flys, "river");
 
-        List<Facet> fs = new ArrayList<Facet>();
+        final List<Facet> fs = new ArrayList<>();
 
-        DefaultState state = (DefaultState) getCurrentState(context);
+        final DefaultState state = (DefaultState) getCurrentState(context);
         state.computeInit(this, hash(), context, meta, fs);
         if (!fs.isEmpty()) {
             log.debug("Facets to add in StaticWQKmsArtifact.initialize .");
             addFacets(getCurrentStateId(), fs);
-        }
-        else {
-            log.debug("No facets to add in StaticWQKmsArtifact.initialize ("
-                + state.getID() + ").");
+        } else {
+            log.debug("No facets to add in StaticWQKmsArtifact.initialize (" + state.getID() + ").");
         }
     }
 
-
     /**
      * Get WQKms from factory.
+     *
      * @return WQKms according to parameterization (can be null);
      */
     public WQKms getWQKms() {
         log.debug("StaticWQKmsArtifact.getWQKms");
 
-        int col = Integer.parseInt(getDataAsString("col_pos"));
-        int wst = Integer.parseInt(getDataAsString("wst_id"));
+        final int col = Integer.parseInt(getDataAsString("col_pos"));
+        final int wst = Integer.parseInt(getDataAsString("wst_id"));
 
         /** TODO do not run twice against db to do this. */
-        String wkmsName = WKmsFactory.getWKmsName(col, wst);
+        final String wkmsName = WKmsFactory.getWKmsName(col, wst);
 
-        WQKms res = WQKmsFactory.getWQKms(col, wst);
+        final WQKms res = WQKmsFactory.getWQKms(col, wst);
         res.setName(wkmsName);
         return res;
     }
 
     /**
      * Get WQKms from factory.
+     *
      * @return WQKms according to parameterization (can be null);
      */
     public WQKms getWQKms(final double from, final double to) {
         log.debug("StaticWQKmsArtifact.getWQKms");
-        
-        int col = Integer.parseInt(getDataAsString("col_pos"));
-        int wst = Integer.parseInt(getDataAsString("wst_id"));
-        
+
+        final int col = Integer.parseInt(getDataAsString("col_pos"));
+        final int wst = Integer.parseInt(getDataAsString("wst_id"));
+
         /** TODO do not run twice against db to do this. */
-        String wkmsName = WKmsFactory.getWKmsName(col, wst);
-        
-        WQKms res = WQKmsFactory.getWQKms(col, wst, from, to);
+        final String wkmsName = WKmsFactory.getWKmsName(col, wst);
+
+        final WQKms res = WQKmsFactory.getWQKms(col, wst, from, to);
         res.setName(wkmsName);
         return res;
     }
@@ -205,52 +171,38 @@
         return NAME;
     }
 
-
     /**
      * Get points of line describing the surface of water at cross section.
      *
-     * @param idx Index of facet and in wkms array.
-     * @param csl FastCrossSectionLine to compute water surface agains.
-     * @param next The km of the next crosssectionline.
-     * @param prev The km of the previous crosssectionline.
-     * @param context Ignored in this implementation.
+     * @param idx
+     *            Index of facet and in wkms array.
+     * @param csl
+     *            FastCrossSectionLine to compute water surface agains.
+     * @param next
+     *            The km of the next crosssectionline.
+     * @param prev
+     *            The km of the previous crosssectionline.
+     * @param context
+     *            Ignored in this implementation.
      *
      * @return an array holding coordinates of points of surface of water (
      *         in the form {{x1, x2}, {y1, y2}} ).
      */
     @Override
-    public Lines.LineData getWaterLines(int idx, FastCrossSectionLine csl,
-        double next, double prev, CallContext context
-    ) {
-        log.debug("getWaterLines(" + idx + ")/" + identifier());
+    public double getWaterLevel(final ComputeType type, final String hash, final String stateId, final double currentKm, final Serializable waterLineIndex,
+            final double nextKm, final double prevKm, final CallContext context) {
 
-        List<Point2D> points = csl.getPoints();
-
-        WKms wkms = getWQKms();
-
-        double km = csl.getKm();
+        final WKms wkms = getWQKms();
 
         // Find W at km.
-        double wAtKm;
+        final double wAtKm = StaticWKmsArtifact.getWAtKm(wkms, currentKm);
 
-        // If heightmarks, only deliver if data snaps.
-        /*
-        if (getDataAsString(DATA_HEIGHT_TYPE) != null &&
-            getDataAsString(DATA_HEIGHT_TYPE).equals("true")) {
-            wAtKm = getWAtCloseKm(wkms, km, next, prev);
-        }
-        else {
-        */
-            wAtKm = StaticWKmsArtifact.getWAtKm(wkms, km);
-        //}
-
-        if (wAtKm == -1 || Double.isNaN(wAtKm)) {
-            log.warn("Waterlevel at km " + km + " unknown.");
-            return new Lines.LineData(new double[][] {{}}, 0d, 0d);
+        if (Double.isNaN(wAtKm)) {
+            log.warn("Waterlevel at km " + currentKm + " unknown.");
+            return Double.NaN;
         }
 
-        return Lines.createWaterLines(points, wAtKm);
+        return wAtKm;
     }
     // TODO implement deepCopy.
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org