changeset 2089:0da8874bd378

Added initial state to map artifact to be able to advance and step back. The map artifact overrides describe() to have the complete UI information in the describe response document. flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Fri, 06 Jan 2012 12:02:10 +0000
parents 701658081f4f
children 17e7a0d063bd
files flys-artifacts/ChangeLog flys-artifacts/doc/conf/artifacts/map.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/MapArtifact.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.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 9 files changed, 258 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/ChangeLog	Fri Jan 06 12:02:10 2012 +0000
@@ -1,3 +1,24 @@
+2011-01-06  Raimund Renkert <raimund.renkert@intevation.de>
+
+	* src/main/java/de/intevation/flys/artifacts/MapArtifact.java:
+	  The map artifact has two states now and overrides describe() to
+	  generate UI sections in the describe response.
+	  The map state overrides computeAdvance() instead of computeFeed().
+
+	* src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java,
+	  src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java:
+	  Changed the WMSDBArtifact in WMSDBState to FLYSArtifact and adjusted
+	  constructors in state classes.
+
+	* doc/conf/artifacts/map.xml:
+	  Added initial state and transition.
+
+	* 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 state.
+
 2011-01-06	Felix Wolfsteller	<felix.wolfsteller@intevation.de>
 
 	Partial fix for flys/issue437 (Querprofil: Zugeladene Basisdaten
--- a/flys-artifacts/doc/conf/artifacts/map.xml	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/doc/conf/artifacts/map.xml	Fri Jan 06 12:02:10 2012 +0000
@@ -1,8 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <artifact name="map">
     <states>
-        <state id="state.map.new" description="state.map.new" state="de.intevation.flys.artifacts.MapArtifact$MapState">
+         <state id="state.map.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.map.river"/>
+             <to state="state.map.new"/>
+         </transition>
+
+         <state id="state.map.new" description="state.map.new" state="de.intevation.flys.artifacts.MapArtifact$MapState">
             <outputmodes>
                 <outputmode name="floodmap" description="output.uesk.map.description" type="map">
                     <facets>
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/MapArtifact.java	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/MapArtifact.java	Fri Jan 06 12:02:10 2012 +0000
@@ -5,27 +5,34 @@
 import java.util.List;
 
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 import de.intevation.artifacts.ArtifactFactory;
 import de.intevation.artifacts.CallMeta;
 import de.intevation.artifacts.CallContext;
 
-import de.intevation.artifactdatabase.state.DefaultOutput;
+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.flys.artifacts.model.WMSDBLayerFacet;
+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.model.FacetTypes;
-import de.intevation.flys.artifacts.model.RiverFactory;
-import de.intevation.flys.artifacts.resources.Resources;
-import de.intevation.flys.utils.FLYSUtils;
-import de.intevation.flys.utils.GeometryUtils;
+import de.intevation.flys.artifacts.RiverAxisArtifact.RiverAxisState;
+import de.intevation.flys.artifacts.states.DefaultState;
+import de.intevation.flys.artifacts.context.FLYSContext;
+import de.intevation.flys.artifacts.model.WMSDBLayerFacet;
 
 
-public class MapArtifact extends RiverAxisArtifact {
+public class MapArtifact extends FLYSArtifact {
 
     private static final Logger logger =
         Logger.getLogger(MapArtifact.class);
@@ -40,64 +47,226 @@
     {
         logger.debug("MapArtifact.setup");
         this.identifier = identifier;
-    }
-
-    @Override
-    public State getCurrentState(Object cc) {
-        logger.debug("MapArtifact.getCurrentState");
-
-        State state = new MapState(this);
-        List<Facet> fs = facets.get(getCurrentStateId());
+        name = "map";
 
-        DefaultOutput o = new DefaultOutput(
-            "floodmap",
-            "floodmap",
-            "image/png",
-            fs,
-            "map");
+        FLYSContext flysContext = FLYSUtils.getFlysContext(context);
 
-        state.getOutputs().add(o);
+        List<State> states = getStates(context);
 
-        return state;
+        setCurrentState(states.get(0));
     }
 
 
     @Override
-    public String getCurrentStateId() {
-        return "state.map.new";
+    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 MapState extends RiverAxisState {
 
-        public MapState() {
-        }
-
-        public MapState(MapArtifact artifact) {
-            super(artifact);
-            this.id = "state.map.new";
-        }
-
         @Override
-        public Object computeInit(
-            FLYSArtifact artifact,
-            String       hash,
-            Object       context,
-            CallMeta     meta,
-            List<Facet>  facets)
-        {
-            return null;
-        }
-
-        @Override
-        public Object computeFeed(
+        public Object computeAdvance(
             FLYSArtifact artifact,
             String       hash,
             CallContext  context,
             List<Facet>  facets,
             Object       old)
         {
-            logger.debug("MapState.computeFeed");
+            logger.debug("MapState.computeAdvance");
+
+            this.artifact = artifact;
 
             String type = getFacetType();
 
@@ -105,7 +274,7 @@
                 0,
                 type,
                 getTitle(context.getMeta()),
-                ComputeType.FEED,
+                ComputeType.ADVANCE,
                 getID(), hash,
                 getUrl());
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java	Fri Jan 06 12:02:10 2012 +0000
@@ -83,7 +83,7 @@
 
         public RiverAxisState(){}
 
-        public RiverAxisState(WMSDBArtifact artifact) {
+        public RiverAxisState(FLYSArtifact artifact) {
             super(artifact);
             riverId = 0;
         }
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Fri Jan 06 12:02:10 2012 +0000
@@ -103,11 +103,11 @@
     public static abstract class WMSDBState extends DefaultState {
         private static final Logger logger = Logger.getLogger(WMSDBState.class);
 
-        protected WMSDBArtifact artifact;
+        protected FLYSArtifact artifact;
 
         public WMSDBState() {}
 
-        public WMSDBState(WMSDBArtifact artifact) {
+        public WMSDBState(FLYSArtifact artifact) {
             this.artifact = artifact;
         }
 
--- a/flys-artifacts/src/main/resources/messages.properties	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/resources/messages.properties	Fri Jan 06 12:02:10 2012 +0000
@@ -119,3 +119,4 @@
 Saar = Saar
 Elbe = Elbe
 
+state.map.river = River
--- a/flys-artifacts/src/main/resources/messages_de.properties	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/resources/messages_de.properties	Fri Jan 06 12:02:10 2012 +0000
@@ -119,3 +119,5 @@
 Saar = Saar
 Elbe = Elbe
 
+state.map.river = Gew\u00e4sser
+
--- a/flys-artifacts/src/main/resources/messages_de_DE.properties	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/resources/messages_de_DE.properties	Fri Jan 06 12:02:10 2012 +0000
@@ -118,3 +118,5 @@
 Mosel = Mosel
 Saar = Saar
 Elbe = Elbe
+
+state.map.river = Gew\u00e4sser
--- a/flys-artifacts/src/main/resources/messages_en.properties	Fri Jan 06 10:11:48 2012 +0000
+++ b/flys-artifacts/src/main/resources/messages_en.properties	Fri Jan 06 12:02:10 2012 +0000
@@ -115,3 +115,5 @@
 Saar = Saar
 Elbe = Elbe
 
+state.map.river = River
+

http://dive4elements.wald.intevation.org