felix@2172: package de.intevation.flys.artifacts;
felix@2172: 
christian@3761: import java.awt.geom.Point2D;
felix@2172: import java.util.ArrayList;
felix@2172: import java.util.List;
felix@2172: 
felix@2172: import org.apache.log4j.Logger;
christian@3761: import org.json.JSONArray;
christian@3761: import org.json.JSONException;
felix@2172: import org.w3c.dom.Document;
felix@2172: 
felix@2172: import de.intevation.artifactdatabase.state.Facet;
felix@2172: import de.intevation.artifacts.Artifact;
felix@2172: import de.intevation.artifacts.ArtifactFactory;
felix@2172: import de.intevation.artifacts.CallMeta;
christian@3761: import de.intevation.flys.artifacts.geom.Lines;
felix@2172: import de.intevation.flys.artifacts.model.FacetTypes;
felix@2172: import de.intevation.flys.artifacts.states.DefaultState;
felix@3198: import de.intevation.flys.model.FastCrossSectionLine;
felix@3198: 
felix@2172: 
felix@2172: /**
felix@3225:  * Artifact to store user-added points and water lines.
felix@2172:  */
felix@2172: public class ManualPointsArtifact
felix@2172: extends      StaticFLYSArtifact
felix@3198: implements   FacetTypes, WaterLineArtifact
felix@2172: {
christian@3761:     private static final long serialVersionUID = 7096025125474986011L;
christian@3761: 
felix@2172:     /** The logger for this class. */
felix@2172:     private static Logger logger = Logger.getLogger(ManualPointsArtifact.class);
felix@2172: 
felix@2172:     /** The name of the artifact. */
felix@2172:     public static final String ARTIFACT_NAME = "manualpoints";
felix@2172: 
felix@2172: 
felix@2172:     public ManualPointsArtifact() {
felix@2206:         logger.debug("ManualPointsArtifact.ManualPointsArtifact()");
felix@2172:     }
felix@2172: 
felix@2172: 
felix@2172:     /**
christian@3761:      * Gets called from factory to set things up.
felix@2172:      */
felix@2172:     @Override
felix@2172:     public void setup(
christian@3761:             String          identifier,
christian@3761:             ArtifactFactory factory,
christian@3761:             Object          context,
christian@3761:             CallMeta        callMeta,
christian@3761:             Document        data)
felix@2172:     {
felix@2172:         logger.debug("ManualPointsArtifact.setup");
felix@2172:         super.setup(identifier, factory, context, callMeta, data);
felix@2172:         initialize(null, context, callMeta);
felix@2172:     }
felix@2172: 
felix@2172: 
felix@2172:     /** Return the name of this artifact. */
christian@3761:     @Override
felix@2172:     public String getName() {
felix@2172:         return ARTIFACT_NAME;
felix@2172:     }
felix@2172: 
felix@2172: 
felix@2172:     /** Access state data storing the jsonstring with points. */
felix@2206:     public String getPointsData(String facetName) {
felix@2206:         return getDataAsString(facetName + ".data");
felix@2172:     }
felix@2172: 
felix@2172: 
felix@3198:     /**
felix@3198:      * Access state data storing the jsonstring with lines.
felix@3198:      * @param facetName Name of facet or null if the so far
felix@3198:      *                  only known case should be picked.
felix@3198:      * @return (String) value of data element (expect json).
felix@3198:      */
felix@3198:     public String getLinesData(String facetName) {
felix@3198:         if (facetName == null)
felix@3198:             return getDataAsString("cross_section.manualpoints.lines");
felix@3198:         // TODO .lineS?
felix@3198:         return getDataAsString(facetName + ".line");
felix@3198:     }
felix@3198: 
felix@3198: 
felix@2172:     /** Setup state and facet. */
felix@2172:     @Override
felix@2172:     protected void initialize(Artifact artifact, Object context, CallMeta meta) {
felix@2172:         logger.debug("ManualPointsArtifact.initialize");
felix@2172:         List<Facet> fs = new ArrayList<Facet>();
felix@2172: 
felix@2172:         DefaultState state = (DefaultState) getCurrentState(context);
felix@2172:         state.computeInit(this, hash(), context, meta, fs);
sascha@3076:         if (!fs.isEmpty()) {
sascha@3076:             logger.debug("Facets to add in ManualPointsArtifact.initialize .");
sascha@3076:             facets.put(getCurrentStateId(), fs);
sascha@3076:         }
sascha@3076:         else {
felix@2172:             logger.debug("No facets to add in ManualPointsArtifact.initialize ("
christian@3761:                     + state.getID() + ").");
felix@2172:         }
felix@2172:     }
felix@2172: 
felix@2172: 
felix@2172:     /**
felix@3198:      * Get value of line at index.
felix@3198:      * @param index index in json array defining lines.
felix@3198:      * @return water height of line at given index.
felix@3198:      */
felix@3198:     protected double getLine(int index) {
felix@3198:         try {
christian@3761:             JSONArray lines = new JSONArray(getLinesData(null));
felix@3198:             JSONArray array = lines.getJSONArray(index);
felix@3198: 
felix@3198:             return array.getDouble(0);
felix@3198:         }
felix@3198:         catch(JSONException e){
felix@3198:             logger.error("Could not decode json for line.");
felix@3198:             return 0d;
felix@3198:         }
felix@3198:     }
felix@3198: 
felix@3198: 
felix@3198:     /**
felix@3198:      * Get the water line "surface".
felix@3272:      * @param index index of facets data.
felix@3284:      * @param csl 'ground' against which to determine water surface.
felix@3284:      * @param a (ignored in this implementation).
felix@3284:      * @param b (ignored in this implementation).
felix@3198:      */
felix@3198:     @Override
felix@3284:     public Lines.LineData getWaterLines(
christian@3761:             int                  index,
christian@3761:             FastCrossSectionLine csl,
christian@3761:             double a, double b
christian@3761:             ) {
felix@3198:         List<Point2D> points = csl.getPoints();
felix@3198:         return Lines.createWaterLines(points, getLine(index));
felix@3198:     }
felix@2172: }
felix@2172: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :