Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java@948be49754c5 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,209 @@ +package org.dive4elements.river.artifacts; + +import java.awt.geom.Point2D; + +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.WQKmsFacet; +import org.dive4elements.river.artifacts.model.WQKmsFactory; + +import org.dive4elements.river.artifacts.states.DefaultState; + + +/** + * Artifact to access additional "waterlevel/discharge"-type of data, like + * fixation measurements. + * + * This artifact neglects (Static)FLYSArtifacts capabilities of interaction + * with the StateEngine by overriding the getState*-methods. + */ +public class StaticWQKmsArtifact +extends StaticFLYSArtifact +implements FacetTypes, WaterLineArtifact +{ + /** The logger for this class. */ + private static Logger logger = + Logger.getLogger(StaticWQKmsArtifact.class); + + 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, FacetActivity.INACTIVE); + } + + /** + * Trivial Constructor. + */ + public StaticWQKmsArtifact() { + logger.debug("StaticWQKmsArtifact.StaticWQKmsArtifact"); + } + + + /** + * Gets called from factory, to set things up. + */ + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callMeta, + Document data) + { + logger.debug("StaticWQKmsArtifact.setup"); + + // Store the 'ids' (from datacage). + if (logger.isDebugEnabled()) { + logger.debug("StaticWQKmsArtiact.setup" + XMLUtils.toString(data)); + } + + String code = getDatacageIDValue(data); + addStringData("ids", code); + if (code != null) { + String [] parts = code.split("-"); + + if (parts.length >= 4) { + int col = Integer.parseInt(parts[2]); + int wst = Integer.parseInt(parts[3]); + + addStringData("col_pos", parts[2]); + addStringData("wst_id", parts[3]); + } + } + + // Do this AFTER we have set the col_pos etc. + super.setup(identifier, factory, context, callMeta, data); + } + + + /** + * Called via setup. + * + * @param artifact The master-artifact. + */ + @Override + protected void initialize( + Artifact artifact, + Object context, + CallMeta meta) + { + logger.debug("StaticWQKmsArtifact.initialize"); + FLYSArtifact flys = (FLYSArtifact) artifact; + // TODO: The river is of no interest, so far., also use importData + importData(flys, "river"); + + List<Facet> fs = new ArrayList<Facet>(); + + DefaultState state = (DefaultState) getCurrentState(context); + state.computeInit(this, hash(), context, meta, fs); + if (!fs.isEmpty()) { + logger.debug("Facets to add in StaticWQKmsArtifact.initialize ."); + addFacets(getCurrentStateId(), fs); + } + else { + logger.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() { + logger.debug("StaticWQKmsArtifact.getWQKms"); + + int col = Integer.parseInt(getDataAsString("col_pos")); + 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); + res.setName(wkmsName); + return res; + } + + /** Return specific name. */ + @Override + public String getName() { + 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. + * + * @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 + ) { + logger.debug("getWaterLines(" + idx + ")/" + identifier()); + + List<Point2D> points = csl.getPoints(); + + WKms wkms = getWQKms(); + + double km = csl.getKm(); + + // Find W at km. + double wAtKm; + + // 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)) { + logger.warn("Waterlevel at km " + km + " unknown."); + return new Lines.LineData(new double[][] {{}}, 0d, 0d); + } + + return Lines.createWaterLines(points, wAtKm); + } + // TODO implement deepCopy. +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :