Refactors state management
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / state / StateManager.java
1 package com.indexdata.pz2utils4jsf.pazpar2.state;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.Map;\r
5 \r
6 import org.apache.log4j.Logger;\r
7 \r
8 import com.indexdata.pz2utils4jsf.pazpar2.Pazpar2Command;\r
9 \r
10 public class StateManager {\r
11   \r
12   Map<String, Pazpar2State> states = new HashMap<String, Pazpar2State>();\r
13   String currentKey = "";\r
14   Map<String,Boolean> pendingStateChanges = new HashMap<String,Boolean>();\r
15   private static Logger logger = Logger.getLogger(StateManager.class);\r
16   \r
17   public StateManager () {\r
18     Pazpar2State initialState = new Pazpar2State();\r
19     states.put(initialState.getKey(), initialState);\r
20     currentKey = initialState.getKey();\r
21     for (String command : Pazpar2Command.allCommands) {\r
22       pendingStateChanges.put(command, new Boolean(false));\r
23     }\r
24 \r
25   }\r
26   \r
27   /**\r
28    * Registers a Pazpar2 command for execution.\r
29    * \r
30    * The state manager will update current state and flag that\r
31    * a request change was made but that it was not yet carried \r
32    * out against Pazpar2.\r
33    * \r
34    * Any command that is created or modified must be checked in\r
35    * like this to come into effect.\r
36    * \r
37    * @param command\r
38    */\r
39   public void checkIn(Pazpar2Command command) {\r
40     if (getCurrentState().stateMutating(command)) {\r
41       Pazpar2State state = new Pazpar2State(getCurrentState(),command);\r
42       states.put(state.getKey(), state);\r
43       currentKey = state.getKey();\r
44       hasPendingStateChange(command.getName(),new Boolean(true));\r
45     } else {\r
46       logger.debug("Command " + command.getName() + " not found to change the state [" + command.getEncodedQueryString() + "]");\r
47     }\r
48   }\r
49   \r
50   public Pazpar2Command checkOut (String commandName) {\r
51     return getCurrentState().getCommand(commandName).copy();\r
52   }\r
53   \r
54   public Pazpar2State getCurrentState () {\r
55     return states.get(currentKey);\r
56   }\r
57   \r
58   public void setCurrentStateKey(String key) {    \r
59     if (currentKey.equals(key)) {\r
60       logger.debug("setCurrentStateKey: no key change detected");\r
61     } else {\r
62       logger.debug("State key change. Was: [" + currentKey + "]. Will be ["+key+"]");\r
63       if (states.get(key).getCommand("search").equals(states.get(currentKey).getCommand("search"))) {\r
64         logger.debug("No search change detected");\r
65       } else {\r
66         hasPendingStateChange("search",true);\r
67       }\r
68       if (states.get(key).getCommand("record").equals(states.get(currentKey).getCommand("record"))) {\r
69         logger.debug("No record change detected");\r
70       } else {\r
71         hasPendingStateChange("record",true);\r
72       }\r
73       currentKey = key;\r
74     }\r
75   }\r
76 \r
77   \r
78   public void hasPendingStateChange(String command, boolean bool) {\r
79     pendingStateChanges.put(command, new Boolean(bool));\r
80   }\r
81   \r
82   public boolean hasPendingStateChange (String command) {\r
83     return pendingStateChanges.get(command).booleanValue();\r
84   }\r
85 \r
86 }\r