--- /dev/null
+package com.indexdata.mkjsf.pazpar2.state;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.BytargetCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.InitCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
+import com.indexdata.mkjsf.pazpar2.commands.PingCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.RecordCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.SearchCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.SettingsCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.ShowCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.StatCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.TermlistCommand;\r
+\r
+/**\r
+ * Holds a 'pazpar2 state', understood as a full set of pazpar2 commands and \r
+ * all their parameter settings at a given point in time.\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public class Pazpar2State {\r
+\r
+ String key = null;\r
+ Map<String,Pazpar2Command> commands = new HashMap<String,Pazpar2Command>();;\r
+\r
+ public Pazpar2State (StateManager mgr) {\r
+ commands.put(Pazpar2Commands.INIT, new InitCommand(mgr));\r
+ commands.put(Pazpar2Commands.PING, new PingCommand(mgr));\r
+ commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand(mgr));\r
+ commands.put(Pazpar2Commands.SEARCH, new SearchCommand(mgr));\r
+ commands.put(Pazpar2Commands.STAT, new StatCommand(mgr));\r
+ commands.put(Pazpar2Commands.SHOW, new ShowCommand(mgr));\r
+ commands.put(Pazpar2Commands.RECORD, new RecordCommand(mgr));\r
+ commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand(mgr));\r
+ commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand(mgr)); \r
+ key = "#1";\r
+ }\r
+ \r
+ /**\r
+ * Creates new state by cloning all commands of the provided state and \r
+ * then overriding one of them with the provided state changing command.\r
+ * \r
+ * @param previousState\r
+ * @param newCommand\r
+ */\r
+ public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
+ for (String commandName : previousState.commands.keySet()) {\r
+ this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
+ }\r
+ this.commands.put(newCommand.getName(),newCommand);\r
+ this.key = getKey(); \r
+ }\r
+ \r
+ /**\r
+ * Generates a state key that can be used by the browser to pick\r
+ * up this state again at a later point in time.\r
+ * \r
+ * @return\r
+ */\r
+ public String getKey() {\r
+ if (key == null) {\r
+ StringBuilder querystatebuilder = new StringBuilder("");\r
+ for (Pazpar2Command command : commands.values()) {\r
+ if (command.hasParameters()) {\r
+ querystatebuilder.append("||"+command.getName()+"::");\r
+ querystatebuilder.append(command.getValueWithExpressions());\r
+ } \r
+ } \r
+ key = "#"+querystatebuilder.toString().hashCode();\r
+ return key;\r
+ } else { \r
+ return key;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Checks if a command represents a change of this state\r
+ * \r
+ * @param command\r
+ * @return true if the command causes a change of state\r
+ */\r
+ public boolean stateMutating (Pazpar2Command command) {\r
+ if (command == null) {\r
+ return true;\r
+ } else if (commands.get(command.getName()) == null) {\r
+ return true;\r
+ } else if ((command.equals(commands.get(command.getName())))) {\r
+ return false; \r
+ } else {\r
+ return true;\r
+ }\r
+ } \r
+ \r
+ /**\r
+ * Returns a command from this state\r
+ * \r
+ * @param name\r
+ * @return\r
+ */ \r
+ public Pazpar2Command getCommand(String name) {\r
+ return commands.get(name);\r
+ }\r
+}\r