--- /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
+import com.indexdata.mkjsf.pazpar2.commands.sp.AuthCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.sp.CategoriesCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommands;\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 () {\r
+ \r
+ commands.put(Pazpar2Commands.INIT, new InitCommand());\r
+ commands.put(Pazpar2Commands.PING, new PingCommand());\r
+ commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand());\r
+ commands.put(Pazpar2Commands.SEARCH, new SearchCommand());\r
+ commands.put(Pazpar2Commands.STAT, new StatCommand());\r
+ commands.put(Pazpar2Commands.SHOW, new ShowCommand());\r
+ commands.put(Pazpar2Commands.RECORD, new RecordCommand());\r
+ commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand());\r
+ commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand()); \r
+\r
+ commands.put(ServiceProxyCommands.AUTH, new AuthCommand());\r
+ commands.put(ServiceProxyCommands.CATEGORIES, new CategoriesCommand());\r
+ \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.getCommandName(),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
+ * @see {@link com.indexdata.mkjsf.pazpar2.state.StateManager#setCurrentStateKey}\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 instanceof AuthCommand )) {\r
+ if (command.hasParameters()) {\r
+ querystatebuilder.append("||"+command.getCommandName()+"::");\r
+ querystatebuilder.append(command.getValueWithExpressions());\r
+ }\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.getCommandName()) == null) {\r
+ return true;\r
+ } else if ((command.equals(commands.get(command.getCommandName())))) {\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