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; felix@2172: gernotbelger@9425: import java.io.Serializable; felix@2172: import java.util.ArrayList; felix@2172: import java.util.List; felix@2172: felix@2172: import org.apache.log4j.Logger; teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.ArtifactFactory; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.CallMeta; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState; gernotbelger@9425: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; gernotbelger@9425: import org.json.JSONArray; gernotbelger@9425: import org.json.JSONException; gernotbelger@9425: import org.w3c.dom.Document; felix@2172: felix@2172: /** felix@3225: * Artifact to store user-added points and water lines. felix@2172: */ gernotbelger@9425: public class ManualPointsArtifact extends StaticD4EArtifact implements FacetTypes, WaterLineArtifact { gernotbelger@9425: christian@3761: private static final long serialVersionUID = 7096025125474986011L; christian@3761: teichmann@8202: /** The log for this class. */ teichmann@8202: private static Logger log = 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: public ManualPointsArtifact() { teichmann@8202: log.debug("ManualPointsArtifact.ManualPointsArtifact()"); felix@2172: } felix@2172: felix@2172: /** christian@3761: * Gets called from factory to set things up. felix@2172: */ felix@2172: @Override gernotbelger@9425: public void setup(final String identifier, final ArtifactFactory factory, final Object context, final CallMeta callMeta, final Document data, gernotbelger@9425: final List loadFacets) { teichmann@8202: log.debug("ManualPointsArtifact.setup"); rrenkert@7842: super.setup(identifier, factory, context, callMeta, data, loadFacets); felix@2172: initialize(null, context, callMeta); 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: /** Access state data storing the jsonstring with points. */ gernotbelger@9425: public String getPointsData(final String facetName) { felix@2206: return getDataAsString(facetName + ".data"); felix@2172: } felix@2172: felix@3198: /** felix@3198: * Access state data storing the jsonstring with lines. gernotbelger@9425: * gernotbelger@9425: * @param facetName gernotbelger@9425: * Name of facet or null if the so far gernotbelger@9425: * only known case should be picked. felix@3198: * @return (String) value of data element (expect json). felix@3198: */ gernotbelger@9425: private String getLinesData(final 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@2172: /** Setup state and facet. */ felix@2172: @Override gernotbelger@9425: protected void initialize(final Artifact artifact, final Object context, final CallMeta meta) { teichmann@8202: log.debug("ManualPointsArtifact.initialize"); gernotbelger@9425: final List fs = new ArrayList<>(); felix@2172: gernotbelger@9425: final DefaultState state = (DefaultState) getCurrentState(context); felix@2172: state.computeInit(this, hash(), context, meta, fs); sascha@3076: if (!fs.isEmpty()) { teichmann@8202: log.debug("Facets to add in ManualPointsArtifact.initialize ."); bjoern@4497: addFacets(getCurrentStateId(), fs); gernotbelger@9425: } else { gernotbelger@9425: log.debug("No facets to add in ManualPointsArtifact.initialize (" + state.getID() + ")."); felix@2172: } felix@2172: } felix@2172: felix@2172: /** felix@3198: * Get value of line at index. gernotbelger@9425: * gernotbelger@9425: * @param index gernotbelger@9425: * index in json array defining lines. felix@3198: * @return water height of line at given index. felix@3198: */ gernotbelger@9425: private double getLine(final int index) { felix@3198: try { gernotbelger@9425: final JSONArray lines = new JSONArray(getLinesData(null)); gernotbelger@9425: final JSONArray array = lines.getJSONArray(index); felix@3198: felix@3198: return array.getDouble(0); felix@3198: } gernotbelger@9425: catch (final JSONException e) { gernotbelger@9425: log.error("Could not decode json for line.", e); felix@3198: return 0d; felix@3198: } felix@3198: } felix@3198: felix@3198: /** felix@3198: * Get the water line "surface". gernotbelger@9425: * gernotbelger@9425: * @param index gernotbelger@9425: * index of facets data. gernotbelger@9425: * @param csl gernotbelger@9425: * 'ground' against which to determine water surface. gernotbelger@9425: * @param a gernotbelger@9425: * (ignored in this implementation). gernotbelger@9425: * @param b gernotbelger@9425: * (ignored in this implementation). gernotbelger@9425: * @param context gernotbelger@9425: * (ignored in this implementation). felix@3198: */ felix@3198: @Override gernotbelger@9425: public double getWaterLevel(final ComputeType type, final String hash, final String stateId, final double currentKm, final Serializable waterLineIndex, gernotbelger@9425: final double nextKm, final double prevKm, final CallContext context) { gernotbelger@9425: final int index = (int) waterLineIndex; gernotbelger@9425: return getLine(index); felix@3198: } gernotbelger@9425: }