Renames pz2utils4jsf package to mkjsf
[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..e983d5c
--- /dev/null
@@ -0,0 +1,107 @@
+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