Mercurial > dive4elements > river
changeset 2113:d109e7702995
Initial implementation for module 'new chart'.
flys-artifacts/trunk@3677 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 13 Jan 2012 12:19:53 +0000 |
parents | 2d0b22602fc2 |
children | e84e2fcd0241 |
files | flys-artifacts/ChangeLog flys-artifacts/doc/conf/artifacts/chart.xml flys-artifacts/doc/conf/conf.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/ChartArtifact.java flys-artifacts/src/main/resources/messages.properties flys-artifacts/src/main/resources/messages_de.properties flys-artifacts/src/main/resources/messages_de_DE.properties flys-artifacts/src/main/resources/messages_en.properties |
diffstat | 8 files changed, 509 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/ChangeLog Fri Jan 13 12:19:53 2012 +0000 @@ -1,3 +1,22 @@ +2012-01-13 Raimund Renkert <raimund.renkert@intevation.de> + + Initial implementation for module 'new chart'. + + * src/main/java/de/intevation/flys/artifacts/ChartArtifact.java: + New. Artifact for module 'new chart'. + + * doc/conf/artifacts/chart.xml: + New. Artifact description for the new artifact. + + * doc/conf/conf.xml: + Added new artifact to config. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for 'new chart' chart types. + 2011-01-13 Felix Wolfsteller <felix.wolfsteller@intevation.de> * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/doc/conf/artifacts/chart.xml Fri Jan 13 12:19:53 2012 +0000 @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<artifact name="new_chart"> + <states> + <state id="state.chart.river" description="state.winfo.river" state="de.intevation.flys.artifacts.states.RiverSelect"> + <data name="river" type="String" /> + </state> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.river"/> + <to state="state.chart.type"/> + </transition> + + <state id="state.chart.type" description="state.chart.type" state="de.intevation.flys.artifacts.ChartArtifact$ChartState"> + <data name="chart_type" type="String" /> + </state> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.type"/> + <to state="state.chart.w_differences"/> + <condition data="chart_type" value="new.chart.w_differences" operator="equals"/> + </transition> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.type"/> + <to state="state.chart.durationcurve"/> + <condition data="chart_type" value="new.chart.durationcurve" operator="equals"/> + </transition> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.type"/> + <to state="state.chart.computeddischargecurve"/> + <condition data="chart_type" value="new.chart.computeddischargecurve" operator="equals"/> + </transition> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.type"/> + <to state="state.chart.waterlevel"/> + <condition data="chart_type" value="new.chart.waterlevel" operator="equals"/> + </transition> + + <transition transition="de.intevation.flys.artifacts.transitions.DefaultTransition"> + <from state="state.chart.type"/> + <to state="state.chart.discharge_longitudinal_section"/> + <condition data="chart_type" value="new.chart.discharge_longitudinal_section" operator="equals"/> + </transition> + + <state id="state.chart.w_differences" description="state.winfo.w_differences" state="de.intevation.flys.artifacts.states.WDifferencesState"> + <outputmodes> + <outputmode name="w_differences" description="output.w_differences" mime-type="image/png" type="chart"> + <facets> + <facet name="longitudinal_section.q" description="facet.longitudinal_section.q"/> + <facet name="longitudinal_section.w" description="facet.longitudinal_section.w"/> + <facet name="w_differences" description="facet.w_differences"/> + <facet name="other.wkms" description="facet.other.wkms"/> + <facet name="other.wqkms" description="facet.other.wqkms"/> + <facet name="heightmarks_points" description="facet.other.wkms.heightmarks_points"/> + <facet name="longitudinal_section.annotations" description="facet.longitudinal_section.annotations"/> + </facets> + </outputmode> + </outputmodes> + </state> + + <state id="state.chart.durationcurve" description="state.winfo.durationcurve" state="de.intevation.flys.artifacts.states.DurationCurveState"> + <outputmodes> + <outputmode name="duration_curve" description="output.duration_curve" mime-type="image/png" type="chart"> + <facets> + <facet name="duration_curve.w" description="facet.duration_curve.w"/> + <facet name="duration_curve.q" description="facet.duration_curve.q"/> + <facet name="computed_discharge_curve.mainvalues.q" description="Q Main Values"/> + <facet name="computed_discharge_curve.mainvalues.w" description="W Main Values"/> + </facets> + </outputmode> + </outputmodes> + </state> + + <state id="state.chart.computeddischargecurve" description="state.winfo.computeddischargecurve" state="de.intevation.flys.artifacts.states.ComputedDischargeCurveState"> + <outputmodes> + <outputmode name="computed_discharge_curve" description="output.computed_discharge_curve" mime-type="image/png" type="chart"> + <facets> + <facet name="computed_discharge_curve.q" description="facet.computed_discharge_curve.q"/> + <facet name="computed_discharge_curve.mainvalues.q" description="facet.computed_discharge_curve.mainvalues.q"/> + <facet name="computed_discharge_curve.mainvalues.w" description="facet.computed_discharge_curve.mainvalues.w"/> + <facet name="other.wqkms" description="facet.other.wqkms"/> + <facet name="other.wq" description="Point-like data like fixations"/> + <facet name="other.wq" description="Point-like data like fixations"/> + <facet name="other.wkms.interpol" description="Height over km, like flood protections."/> + </facets> + </outputmode> + </outputmodes> + </state> + + <state id="state.chart.waterlevel" description="state.winfo.waterlevel" state="de.intevation.flys.artifacts.states.WaterlevelState"> + <outputmodes> + <outputmode name="longitudinal_section" description="output.longitudinal_section" mime-type="image/png" type="chart"> + <facets> + <facet name="longitudinal_section.w" description="facet.longitudinal_section.w"/> + <facet name="longitudinal_section.q" description="facet.longitudinal_section.q"/> + <facet name="w_differences" description="facet.w_differences"/> + <facet name="other.wkms" description="facet.other.wkms"/> + <facet name="other.wqkms" description="facet.other.wqkms"/> + <facet name="heightmarks_points" description="facet.other.wkms.heightmarks_points"/> + <facet name="longitudinal_section.area" description="an area"/> + <facet name="longitudinal_section.annotations" description="facet.longitudinal_section.annotations"/> + </facets> + </outputmode> + </outputmodes> + </state> + + <state id="state.chart.discharge_longitudinal_section" description="state.winfo.discharge_longitudinal_section" state="de.intevation.flys.artifacts.states.DischargeLongitudinalSection"> + <outputmodes> + <outputmode name="discharge_longitudinal_section" description="output.discharge_longitudinal_section" mime-type="image/png" type="chart"> + <facets> + <facet name="discharge_longitudinal_section.w"/> + <facet name="discharge_longitudinal_section.q"/> + <facet name="discharge_longitudinal_section.c"/> + <facet name="other.wqkms"/> + <facet name="other.wkms"/> + <facet name="heightmarks_points"/> + <facet name="longitudinal_section.annotations"/> + <facet name="longitudinal_section.w"/> + </facets> + </outputmode> + </outputmodes> + </state> + </states> +</artifact>
--- a/flys-artifacts/doc/conf/conf.xml Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/doc/conf/conf.xml Fri Jan 13 12:19:53 2012 +0000 @@ -71,6 +71,9 @@ <artifact-factory name="wqinterpol" description="Factory to create an artifact to access 'other' WQ (at km) data" ttl="3600000" artifact="de.intevation.flys.artifacts.WQKmsInterpolArtifact">de.intevation.artifactdatabase.DefaultArtifactFactory</artifact-factory> + <artifact-factory name="new_chart" description="Factory to create an artifact to be used for new chart" + ttl="3600000" + artifact="de.intevation.flys.artifacts.ChartArtifact">de.intevation.artifactdatabase.DefaultArtifactFactory</artifact-factory> </artifact-factories> <user-factory name="default" description="Factory to create new users">de.intevation.artifactdatabase.DefaultUserFactory</user-factory> @@ -127,6 +130,7 @@ <artifact name="annotation" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="${artifacts.config.dir}/artifacts/annotation.xml" /> <artifact name="wmsbackground" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="${artifacts.config.dir}/artifacts/wmsbackground.xml" /> <artifact name="new_map" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="${artifacts.config.dir}/artifacts/map.xml" /> + <artifact name="new_chart" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="${artifacts.config.dir}/artifacts/chart.xml" /> </artifacts>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/ChartArtifact.java Fri Jan 13 12:19:53 2012 +0000 @@ -0,0 +1,324 @@ +package de.intevation.flys.artifacts; + +import org.apache.log4j.Logger; + +import java.util.List; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import de.intevation.artifacts.Artifact; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.CallContext; + +import de.intevation.artifacts.common.utils.XMLUtils; +import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; +import de.intevation.artifacts.common.ArtifactNamespaceContext; + +import de.intevation.artifactdatabase.ProtocolUtils; +import de.intevation.artifactdatabase.state.Facet; +import de.intevation.artifactdatabase.state.State; +import de.intevation.artifactdatabase.state.StateEngine; +import de.intevation.artifactdatabase.state.Output; +import de.intevation.artifactdatabase.transition.TransitionEngine; + +import de.intevation.flys.model.River; +import de.intevation.flys.utils.FLYSUtils; + +import de.intevation.flys.artifacts.states.DefaultState; +import de.intevation.flys.artifacts.context.FLYSContext; +import de.intevation.flys.artifacts.resources.Resources; + + +public class ChartArtifact extends FLYSArtifact { + + private static final Logger logger = + Logger.getLogger(ChartArtifact.class); + + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callmeta, + Document data) + { + logger.debug("ChartArtifact.setup"); + this.identifier = identifier; + name = "new_chart"; + + List<State> states = getStates(context); + + setCurrentState(states.get(0)); + } + + + @Override + public Document describe(Document data, CallContext context) { + logger.debug("Describe: the current state is: " + getCurrentStateId()); + + if (logger.isDebugEnabled()) { + dumpArtifact(); + } + + FLYSContext flysContext = FLYSUtils.getFlysContext(context); + + StateEngine stateEngine = (StateEngine) flysContext.get( + FLYSContext.STATE_ENGINE_KEY); + + TransitionEngine transitionEngine = (TransitionEngine) flysContext.get( + FLYSContext.TRANSITION_ENGINE_KEY); + + List<State> reachable = transitionEngine.getReachableStates( + this, getCurrentState(context), stateEngine); + + Document description = XMLUtils.newDocument(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + description, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element root = ProtocolUtils.createRootNode(creator); + description.appendChild(root); + + State current = getCurrentState(context); + + ProtocolUtils.appendDescribeHeader(creator, root, identifier(), hash()); + ProtocolUtils.appendState(creator, root, current); + ProtocolUtils.appendReachableStates(creator, root, reachable); + + appendBackgroundActivity(creator, root, context); + + Element name = ProtocolUtils.createArtNode( + creator, "name", + new String[] { "value" }, + new String[] { getName() }); + + Element ui = ProtocolUtils.createArtNode( + creator, "ui", null, null); + + Element staticUI = ProtocolUtils.createArtNode( + creator, "static", null, null); + + Element outs = ProtocolUtils.createArtNode( + creator, "outputmodes", null, null); + appendOutputModes(description, outs, context, identifier()); + + appendStaticUI(description, staticUI, context, identifier()); + + Element dynamic = current.describe( + this, + description, + root, + context, + identifier()); + + if (dynamic != null) { + ui.appendChild(dynamic); + } + + ui.appendChild(staticUI); + + root.appendChild(name); + root.appendChild(ui); + root.appendChild(outs); + + return description; + + } + + + protected static void appendBackgroundActivity( + ElementCreator cr, + Element root, + CallContext context + ) { + Element inBackground = cr.create("background-processing"); + root.appendChild(inBackground); + + cr.addAttr( + inBackground, + "value", + String.valueOf(context.isInBackground()), + true); + } + + + /** + * Append output mode nodes to a document. + */ + protected void appendOutputModes( + Document doc, + Element outs, + CallContext context, + String uuid) + { + List<String> stateIds = getPreviousStateIds(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + FLYSContext flysContext = FLYSUtils.getFlysContext(context); + StateEngine engine = (StateEngine) flysContext.get( + FLYSContext.STATE_ENGINE_KEY); + + for (String stateId: stateIds) { + logger.debug("Append output modes for state: " + stateId); + DefaultState state = (DefaultState) engine.getState(stateId); + + List<Output> list = state.getOutputs(); + if (list == null || list.size() == 0) { + logger.debug("-> No output modes for this state."); + continue; + } + + List<Facet> fs = facets.get(stateId); + + if (fs == null || fs.size() == 0) { + logger.debug("No facets for previous state found."); + continue; + } + + logger.debug("Found " + fs.size() + " facets in previous states."); + + List<Output> generated = generateOutputs(list, fs); + + ProtocolUtils.appendOutputModes(doc, outs, generated); + } + + try { + DefaultState cur = (DefaultState) getCurrentState(context); + if (cur.validate(this)) { + List<Output> list = cur.getOutputs(); + if (list != null && list.size() > 0) { + logger.debug( + "Append output modes for current state: " + cur.getID()); + + List<Facet> fs = facets.get(cur.getID()); + + if (fs != null && fs.size() > 0) { + List<Output> generated = generateOutputs(list, fs); + + logger.debug("Found " + fs.size() + " current facets."); + if (!generated.isEmpty()) { + ProtocolUtils.appendOutputModes( + doc, outs, generated); + } + } + else { + logger.debug("No facets found for the current state."); + } + } + } + } + catch (IllegalArgumentException iae) { + // state is not valid, so we do not append its outputs. + } + } + + + /** + * This method appends the static data - that has already been inserted by + * the user - to the static node of the DESCRIBE document. + * + * @param doc The document. + * @param ui The root node. + * @param context The CallContext. + * @param uuid The identifier of the artifact. + */ + protected void appendStaticUI( + Document doc, + Node ui, + CallContext context, + String uuid) + { + List<String> stateIds = getPreviousStateIds(); + + logger.debug("previous states: " + stateIds); + FLYSContext flysContext = FLYSUtils.getFlysContext(context); + StateEngine engine = (StateEngine) flysContext.get( + FLYSContext.STATE_ENGINE_KEY); + + for (String stateId: stateIds) { + logger.debug("Append static data for state: " + stateId); + DefaultState state = (DefaultState) engine.getState(stateId); + + ui.appendChild(state.describeStatic(this, doc, ui, context, uuid)); + } + } + + + public static class ChartState extends DefaultState { + + public static final String FIELD_MODE = "chart_type"; + + public static final String DURATION_CURVE = + "chart.new.durationcurve"; + + public static final String COMPUTED_DISCHARGE_CURVE = + "chart.new.computeddischargecurve"; + + public static final String DISCHARGE_LONGITUDINAL_CURVE = + "chart.new.discharge_longitudinal_section"; + + public static final String W_DIFFERENCES = + "chart.new.w_differences"; + + public static final String WATERLEVEL = + "chart.new.waterlevel"; + + public static final String[] CHARTS = { + COMPUTED_DISCHARGE_CURVE, + DURATION_CURVE, + DISCHARGE_LONGITUDINAL_CURVE, + W_DIFFERENCES, + WATERLEVEL }; + + + + @Override + public Object computeAdvance( + FLYSArtifact artifact, + String hash, + CallContext context, + List<Facet> facets, + Object old) + { + logger.debug("ChartState.computeAdvance"); + + + return null; + } + + + @Override + protected Element[] createItems( + XMLUtils.ElementCreator cr, + Artifact artifact, + String name, + CallContext context) + { + CallMeta meta = context.getMeta(); + Element[] charts = new Element[CHARTS.length]; + + int i = 0; + + for (String chart: CHARTS) { + charts[i++] = createItem( + cr, new String[] { + Resources.getMsg(meta, chart, chart), + chart + }); + } + + return charts; + } + + + } +}
--- a/flys-artifacts/src/main/resources/messages.properties Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/src/main/resources/messages.properties Fri Jan 13 12:19:53 2012 +0000 @@ -23,6 +23,15 @@ calc.reference.curve = Reference Curve +state.chart.river = River +state.chart.type = Charttype + +chart.new.durationcurve = Duration Curve +chart.new.computeddischargecurve = Discharge Curve +chart.new.discharge_longitudinal_section = Discharge Curve at +chart.new.w_differences = Differences +chart.new.waterlevel = Waterlevel + cross_section = Cross Section scenario.current = Current
--- a/flys-artifacts/src/main/resources/messages_de.properties Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/src/main/resources/messages_de.properties Fri Jan 13 12:19:53 2012 +0000 @@ -23,6 +23,15 @@ calc.reference.curve = Bezugslinie +state.chart.river = Gew\u00e4sser +state.chart.type = Diagrammtyp + +chart.new.durationcurve = Dauerlinie +chart.new.computeddischargecurve = Abflusskurve +chart.new.discharge_longitudinal_section = Abflusskurve bei ungleichwertigem Abfluss +chart.new.w_differences = Differenzen +chart.new.waterlevel = Wasserstand/Wasserspiegellage + cross_section = Querprofil scenario.current = Aktuell
--- a/flys-artifacts/src/main/resources/messages_de_DE.properties Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/src/main/resources/messages_de_DE.properties Fri Jan 13 12:19:53 2012 +0000 @@ -23,6 +23,15 @@ calc.reference.curve = Bezugslinie +state.chart.river = Gew\u00e4sser +state.chart.type = Diagrammtyp + +chart.new.durationcurve = Dauerlinie +chart.new.computeddischargecurve = Abflusskurve +chart.new.discharge_longitudinal_section = Abflusskurve bei ungleichwertigem Abfluss +chart.new.w_differences = Differenzen +chart.new.waterlevel = Wasserstand/Wasserspiegellage + cross_section = Querprofil scenario.current = Aktuell
--- a/flys-artifacts/src/main/resources/messages_en.properties Fri Jan 13 11:41:05 2012 +0000 +++ b/flys-artifacts/src/main/resources/messages_en.properties Fri Jan 13 12:19:53 2012 +0000 @@ -21,6 +21,15 @@ calc.discharge.longitudinal.section = TODO (W bei...) calc.w.differences = Differences +state.chart.river = River +state.chart.type = Charttype + +chart.new.durationcurve = Duration Curve +chart.new.computeddischargecurve = Discharge Curve +chart.new.discharge_longitudinal_section = Discharge Curve at +chart.new.w_differences = Differences +chart.new.waterlevel = Waterlevel + cross_section = Cross Section scenario.current = Current