# HG changeset patch # User Bjoern Ricks # Date 1348821889 0 # Node ID 4e1b3b4ef1322a5f102c506ea6300f8d9b893a33 # Parent 6cdd994ee8a400fb69cda6af4991fb2f968f2fa7 Add new Artifacts and State for displaying discharge curves at a gauge flys-artifacts/trunk@5636 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 6cdd994ee8a4 -r 4e1b3b4ef132 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Fri Sep 28 08:41:13 2012 +0000 +++ b/flys-artifacts/ChangeLog Fri Sep 28 08:44:49 2012 +0000 @@ -1,3 +1,12 @@ +2012-09-29 Björn Ricks + + * doc/conf/conf.xml, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/artifacts/AbstractStaticStateArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java: + Implement new Artifacts and State for displaying discharge curves at a + gauge. + 2012-09-29 Björn Ricks * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: diff -r 6cdd994ee8a4 -r 4e1b3b4ef132 flys-artifacts/doc/conf/conf.xml --- a/flys-artifacts/doc/conf/conf.xml Fri Sep 28 08:41:13 2012 +0000 +++ b/flys-artifacts/doc/conf/conf.xml Fri Sep 28 08:44:49 2012 +0000 @@ -121,6 +121,10 @@ de.intevation.artifactdatabase.DefaultArtifactFactory + + de.intevation.artifactdatabase.DefaultArtifactFactory de.intevation.artifactdatabase.DefaultUserFactory diff -r 6cdd994ee8a4 -r 4e1b3b4ef132 flys-artifacts/src/main/java/de/intevation/flys/artifacts/AbstractStaticStateArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/AbstractStaticStateArtifact.java Fri Sep 28 08:44:49 2012 +0000 @@ -0,0 +1,69 @@ +package de.intevation.flys.artifacts; + +import java.util.ArrayList; +import java.util.List; + +import de.intevation.artifactdatabase.state.State; + +/** + * A abstract baseclass for Artifacts which are using only one static state. + * + * This class is intended to be used without the config/stateengine to generate + * the static state. + * + * @author Björn Ricks + */ +public abstract class AbstractStaticStateArtifact extends StaticFLYSArtifact { + + private transient State staticstate; + + /** + * 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(getStaticState()); + return states; + } + + + /** + * Get the "current" state. + * @param cc ignored. + * @return always the set static state. + */ + @Override + public State getCurrentState(Object cc) { + return getStaticState(); + } + + /** + * A child class must override this method to set its static state + */ + protected abstract void initStaticState(); + + protected void setStaticState(State state) { + this.staticstate = state; + } + + protected State getStaticState() { + if (staticstate == null) { + initStaticState(); + } + return staticstate; + } + + /** + * Get the state. + * @param context ignored. + * @param stateID ignored. + * @return the state. + */ + @Override + protected State getState(Object context, String stateID) { + return getStaticState(); + } +} diff -r 6cdd994ee8a4 -r 4e1b3b4ef132 flys-artifacts/src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java Fri Sep 28 08:44:49 2012 +0000 @@ -0,0 +1,99 @@ +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.DefaultOutput; +import de.intevation.artifactdatabase.state.Facet; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallMeta; + +import de.intevation.artifacts.common.ArtifactNamespaceContext; +import de.intevation.artifacts.common.utils.XMLUtils; + +import de.intevation.flys.artifacts.states.StaticState; +import de.intevation.flys.artifacts.StaticFLYSArtifact; +import de.intevation.flys.artifacts.model.GaugeDischargeCurveFacet; + +import de.intevation.flys.model.Gauge; + +import de.intevation.flys.utils.FLYSUtils; + +/** + * Artifact to calculate a discharge curve from a gauge overview info + * + * @author Björn Ricks + */ +public class GaugeDischargeCurveArtifact +extends AbstractStaticStateArtifact +{ + + private static final Logger logger = + Logger.getLogger(GaugeDischargeCurveArtifact.class); + + public static final String XPATH_RIVER = "/art:action/art:river/@name"; + public static final String XPATH_GAUGE = "/art:action/art:gauge/@reference"; + public static final String NAME = "gaugedischargecurve"; + public static final String STATIC_STATE_NAME = "state.gaugedischargecurve.static"; + + /** + * Setup initializes the data by extracting the river and gauge from + * the XML Document. + */ + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callmeta, + Document data) + { + logger.debug("GaugeDischargeCurveArtifact.setup"); + + if (logger.isDebugEnabled()) { + logger.debug("GaugeDischargeCurveState.setup" + XMLUtils.toString(data)); + } + String gaugeref = XMLUtils.xpathString(data, XPATH_GAUGE, + ArtifactNamespaceContext.INSTANCE); + String rivername = XMLUtils.xpathString(data, XPATH_RIVER, + ArtifactNamespaceContext.INSTANCE); + + addStringData("river", rivername); + addStringData("reference_gauge", gaugeref); + + Gauge gauge = FLYSUtils.getReferenceGauge(this); + + Facet gfacet = new GaugeDischargeCurveFacet(rivername, gauge); + + List fs = new ArrayList(1); + fs.add(gfacet); + + addFacets(STATIC_STATE_NAME, fs); + + super.setup(identifier, factory, context, callmeta, data); + } + + @Override + public String getName() { + return NAME; + } + + @Override + protected void initStaticState() { + StaticState state = new StaticState(STATIC_STATE_NAME); + List fs = facets.get(STATIC_STATE_NAME); + DefaultOutput output = new DefaultOutput( + "discharge_curve", + "output.discharge_curve", "image/png", + fs, + "chart"); + + state.addOutput(output); + setStaticState(state); + } +} diff -r 6cdd994ee8a4 -r 4e1b3b4ef132 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java Fri Sep 28 08:44:49 2012 +0000 @@ -0,0 +1,57 @@ +package de.intevation.flys.artifacts.model; + +import java.util.Arrays; +import java.util.Map; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.artifactdatabase.state.DefaultFacet; +import de.intevation.artifactdatabase.state.Facet; + +import de.intevation.flys.artifacts.model.WQKms; + +import de.intevation.flys.model.Gauge; + +/** + * A Facet that returns discharge curve data at a gauge + * + * @author Björn Ricks + */ +public class GaugeDischargeCurveFacet +extends DefaultFacet +{ + private Gauge gauge; + private String river; + + public GaugeDischargeCurveFacet(String river, Gauge gauge) { + super(0, "facet.gauge.discharge_curve", "facet.gauge.discharge_curve"); + this.river = river; + this.gauge = gauge; + } + + @Override + public Object getData(Artifact art, CallContext context) { + + DischargeTables dt = new DischargeTables(river, gauge.getName()); + + Map map = dt.getValues(100d); + + double [][] values = map.get(name); + if (values == null) { + return null; + } + double [] kms = new double[values[0].length]; + Arrays.fill(kms, gauge.getStation().doubleValue()); + return new WQKms(kms, values[0], values[1], gauge.getName()); + } + + @Override + public Facet deepCopy() { + GaugeDischargeCurveFacet copy = + new GaugeDischargeCurveFacet(this.river, this.gauge); + copy.set(this); + return copy; + } +}