Merge branch 'master' of ssh://git.indexdata.com/home/git/private/mkjsf.git into...
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / state / Pazpar2State.java
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/state/Pazpar2State.java b/src/main/java/com/indexdata/mkjsf/pazpar2/state/Pazpar2State.java
new file mode 100644 (file)
index 0000000..50234e8
--- /dev/null
@@ -0,0 +1,118 @@
+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