teichmann@5831: package org.dive4elements.river.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: 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.geom.Lines; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState; teichmann@5831: import org.dive4elements.river.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 fs = new ArrayList(); 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 ."); bjoern@4497: addFacets(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@4478: * @param context (ignored in this implementation). felix@3198: */ felix@3198: @Override felix@3284: public Lines.LineData getWaterLines( christian@3761: int index, christian@3761: FastCrossSectionLine csl, felix@4478: double a, double b, felix@4478: CallContext context christian@3761: ) { felix@3198: List 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 :