diff artifact-database/src/main/java/de/intevation/artifactdatabase/transition/TransitionEngine.java @ 108:9ece61d918b1

Improved the StateEngine and the TransitionEngine to retrieve the reachable states of a current state. artifacts/trunk@1297 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 07 Feb 2011 11:20:31 +0000
parents 26bfff409dd3
children 973f244ed568
line wrap: on
line diff
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/transition/TransitionEngine.java	Fri Feb 04 16:52:39 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/transition/TransitionEngine.java	Mon Feb 07 11:20:31 2011 +0000
@@ -1,11 +1,16 @@
 package de.intevation.artifactdatabase.transition;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
 
+import de.intevation.artifactdatabase.state.State;
+import de.intevation.artifactdatabase.state.StateEngine;
+
+
 /**
  * The TransitionEngine stores all transitions for each Artifact and should be
  * used to determine, if an Artifact is able to advance from one to another
@@ -41,20 +46,52 @@
      *
      * @return true, if the transitions were added, otherwise false.
      */
-    public boolean addTransition(String stateId, List transitions) {
-        List tmp = this.transitions.get(stateId);
+    public boolean addTransition(String stateId, Transition transition) {
+        List tmp = transitions.get(stateId);
 
-        if (tmp != null) {
-            logger.info(
-                "Transitions for the state '"
-                + stateId
-                + "' already stored.");
-
-            return false;
+        if (tmp == null) {
+            tmp = new ArrayList<Transition>();
         }
 
+        tmp.add(transition);
+
         logger.debug("Add new transitions for state '" + stateId + "'");
-        return this.transitions.put(stateId, transitions) != null;
+
+        return transitions.put(stateId, tmp) != null;
+    }
+
+
+    /**
+     * This method returns all existing transitions of a state.
+     *
+     * @param state The state
+     *
+     * @return the existing transition of <i>state</i>.
+     */
+    public List<Transition> getTransitions(State state) {
+        return transitions.get(state.getID());
+    }
+
+
+    /**
+     * This method returns the reachable states of <i>state</i>.
+     *
+     * @param state The current state.
+     * @param engine The state engine.
+     *
+     * @return a list of reachable states.
+     */
+    public List<State> getReachableStates(State state, StateEngine engine) {
+        List<Transition> transitions = getTransitions(state);
+        List<State>      reachable   = new ArrayList<State>();
+
+        for (Transition t: transitions) {
+            if (t.isValid(state)) {
+                reachable.add(engine.getState(t.getTo()));
+            }
+        }
+
+        return reachable;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org