# HG changeset patch # User Felix Wolfsteller # Date 1321368533 0 # Node ID 2e2ca95459d21eda713048938db10674623fc456 # Parent 1be3a4636ee363f115f96ef705b9c57dbc02cc81 New Facet and Artifact to access interpolated W/Q data (todo-rich). flys-artifacts/trunk@3256 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 1be3a4636ee3 -r 2e2ca95459d2 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue Nov 15 14:45:57 2011 +0000 +++ b/flys-artifacts/ChangeLog Tue Nov 15 14:48:53 2011 +0000 @@ -1,3 +1,9 @@ +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WQFacet.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Added new Facet and Artifact to access W over Q data. + 2011-11-15 Felix Wolfsteller * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: diff -r 1be3a4636ee3 -r 2e2ca95459d2 flys-artifacts/src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java Tue Nov 15 14:48:53 2011 +0000 @@ -0,0 +1,272 @@ +package de.intevation.flys.artifacts; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import de.intevation.artifactdatabase.state.Facet; +import de.intevation.artifactdatabase.state.DefaultOutput; +import de.intevation.artifactdatabase.state.State; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.flys.artifacts.model.Calculation; +import de.intevation.flys.artifacts.model.FacetTypes; +import de.intevation.flys.artifacts.model.WQKms; +import de.intevation.flys.artifacts.model.WQFacet; +import de.intevation.flys.artifacts.model.WKmsFactory; +import de.intevation.flys.artifacts.model.WQKmsFactory; +import de.intevation.flys.artifacts.model.WstValueTable; +import de.intevation.flys.artifacts.model.WstValueTableFactory; + +import de.intevation.flys.artifacts.states.StaticState; +import de.intevation.flys.artifacts.resources.Resources; + +import de.intevation.flys.utils.FLYSUtils; +import de.intevation.artifacts.common.utils.XMLUtils; + +/** + * Artifact to access additional "waterlevel/discharge"-type of data, like + * fixation measurements, but doing so with costy interpolation. + * + * This artifact neglects (Static)FLYSArtifacts capabilities of interaction + * with the StateEngine by overriding the getState*-methods. + */ +public class WQKmsInterpolArtifact +extends StaticFLYSArtifact +implements FacetTypes +{ + /** The logger for this class. */ + private static Logger logger = + Logger.getLogger(WQKmsInterpolArtifact.class); + + /** XPath to access initial parameter. */ + public static final String XPATH_DATA = + "/art:action/art:ids/@value"; + + public static final String STATIC_STATE_NAME = + "state.additional_wqkms.interpol.static"; + + /** One and only state to be in. */ + protected transient State state = null; + + + /** + * Trivial Constructor. + */ + public WQKmsInterpolArtifact() { + logger.debug("WQKmsInterpolArtifact.WQKmsInterpolArtifact"); + } + + + /** + * Gets called from factory, to set things up. + */ + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callMeta, + Document data) + { + logger.debug("WQKmsInterpolArtifact.setup"); + + state = new StaticState(STATIC_STATE_NAME); + + List fs = new ArrayList(); + String code = XMLUtils.xpathString( + data, XPATH_DATA, ArtifactNamespaceContext.INSTANCE); + + // TODO Go for JSON, one day. + //ex.: flood_protection-wstv-114-12 + if (code != null) { + String [] parts = code.split("-"); + + if (parts.length >= 4) { + int wst = Integer.valueOf(parts[3]); + /* @TODO For certain datasets it might be necessary to + * restrict on a single column of wsts. */ + // int col = Integer.valueOf(parts[2]); + //addStringData("col_pos", parts[2]); + addStringData("wst_id", parts[3]); + String wkmsName = WKmsFactory.getWKmsName(wst); + Facet facet = new WQFacet( + Resources.getMsg( + callMeta, + wkmsName, + wkmsName)); + fs.add(facet); + facets.put(state.getID(), fs); + } + } + + spawnState(); + super.setup(identifier, factory, context, callMeta, data); + } + + + /** + * Initialize the static state with output. + * @return static state + */ + protected State spawnState() { + state = new StaticState(STATIC_STATE_NAME); + List fs = facets.get(STATIC_STATE_NAME); + DefaultOutput output = new DefaultOutput( + "general", + "general", + "image/png", + fs, + "chart"); + + state.getOutputs().add(output); + + return state; + } + + + /** + * Called via setup. + * + * @param artifact The master-artifact. + */ + @Override + protected void initialize( + Artifact artifact, + Object context, + CallMeta meta) + { + logger.debug("WQKmsInterpolArtifact.initialize"); + WINFOArtifact winfo = (WINFOArtifact) artifact; + importData(winfo, "river"); + importData(winfo, "location"); + logger.debug("WQKmsInterpolArtifact is @(location) " + + this.getDataAsString("location")); + } + + + /** + * Get a list containing the one and only State. + * @param context ignored. + * @return list with one and only state. + */ + @Override + protected List getStates(Object context) { + ArrayList states = new ArrayList(); + states.add(getState()); + return states; + } + + + /** + * Get WQ at a given km. + */ + public double [][] getWQAtKm(double km) { + // Get WstValueTable + WstValueTable interpolator = WstValueTableFactory.getTable( + getDataAsInt("wst_id")); + // @TODO we might have to give column position for certain datasets. + // getDataAsInt("col_pos")); + + // TODO respect given km. + double [][] vs = interpolator.interpolateWQColumnwise(44.51); + + for (int x = 0; x < vs[1].length; x++) { + logger.debug("getWQAtKm: Q/W " + vs[0][x] + " / " + vs[1][x]); + } + + return vs; + } + + + /** + * Get a DataItem casted to int (0 if fails). + */ + public int getDataAsInt(String dataName) { + String val = getDataAsString(dataName); + try { + return Integer.valueOf(val); + } + catch (NumberFormatException e) { + logger.warn("Could not get data " + dataName + " as int", e); + return 0; + } + } + + + /** + * Get the "current" state (there is but one). + * @param cc ignored. + * @return the "current" (only possible) state. + */ + @Override + public State getCurrentState(Object cc) { + return getState(); + } + + + /** + * Get the only possible state. + * @return the state. + */ + protected State getState() { + return getState(null, null); + } + + + /** + * Get the state. + * @param context ignored. + * @param stateID ignored. + * @return the state. + */ + @Override + protected State getState(Object context, String stateID) { + return (state != null) + ? state + : spawnState(); + } + + + /** + * Get WQKms from factory. + * @param TODO idx param is not needed + * @return WQKms according to parameterization (can be null); + */ + public WQKms getWQKms(int idx) { + logger.debug("WQKmsInterpolArtifact.getWQKms"); + logger.warn("Stub, getWQKms not yet implemented."); + + return WQKmsFactory.getWQKms( + Integer.valueOf(getDataAsString("col_pos")), + Integer.valueOf(getDataAsString("wst_id"))); + } + + + /** + * Determines Facets initial disposition regarding activity (think of + * selection in Client ThemeList GUI). This will be checked one time + * when the facet enters a collections describe document. + * + * @param facetName name of the facet. + * @param index index of the facet. + * + * @return Always 0. Static Data will enter plots inactive. + */ + @Override + public int getInitialFacetActivity( + String outputName, + String facetName, + int index) + { + return 0; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 1be3a4636ee3 -r 2e2ca95459d2 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQFacet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQFacet.java Tue Nov 15 14:48:53 2011 +0000 @@ -0,0 +1,61 @@ +package de.intevation.flys.artifacts.model; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.CallContext; + +import de.intevation.artifactdatabase.state.DefaultFacet; + +import de.intevation.flys.artifacts.WQKmsInterpolArtifact; +import de.intevation.flys.artifacts.model.FacetTypes; + +/** + * Facet to show W|Q Values. + */ +public class WQFacet +extends DefaultFacet +implements FacetTypes { + + /** Trivial Constructor. */ + public WQFacet(String description) { + this(STATIC_WQ, description); + } + + + /** + * A Facet with WQ data. + */ + public WQFacet(String name, String description) { + this.name = name; + this.description = description; + this.index = 0; + } + + + /** + * Returns the data this facet requires. + * + * @param artifact the owner artifact. + * @param context the CallContext (ignored). + * + * @return the data. + */ + @Override + public Object getData(Artifact artifact, CallContext context) { + WQKmsInterpolArtifact interpolData = + (WQKmsInterpolArtifact) artifact; + return interpolData.getWQAtKm(10); + } + + + /** + * Create a deep copy of this Facet. + * @return a deep copy. + */ + @Override + public WQKmsFacet deepCopy() { + WQKmsFacet copy = new WQKmsFacet(description); + copy.set(this); + return copy; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :