4412a7f1694551e17a016c973442f22b4dfffc29
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / state / Pazpar2State.java
1 package com.indexdata.pz2utils4jsf.pazpar2.state;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 \r
7 import com.indexdata.pz2utils4jsf.pazpar2.Pazpar2Command;\r
8 \r
9 \r
10 public class Pazpar2State {\r
11 \r
12   String key = null;\r
13   Map<String,Pazpar2Command> commands = new HashMap<String,Pazpar2Command>();;\r
14 \r
15   public Pazpar2State () {    \r
16     for (String command : Arrays.asList("init","ping","settings","search","stat","show","record","termlist","bytarget")) {\r
17       commands.put(command, new Pazpar2Command(command));\r
18     }\r
19     key = "#initial";\r
20   }\r
21   \r
22   /**\r
23    * Creates new state by cloning all commands of the provided state and \r
24    * then overriding one of them with the provided state changing command.\r
25    * \r
26    * @param previousState\r
27    * @param newCommand\r
28    */\r
29   public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
30     for (String commandName : previousState.commands.keySet()) {\r
31       this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
32     }\r
33     this.commands.put(newCommand.getName(),newCommand);\r
34     this.key = getKey();           \r
35   }\r
36     \r
37   /**\r
38    * Generates a state key that can be used by the browser to pick\r
39    * up this state again at a later point in time.\r
40    * \r
41    * @return\r
42    */\r
43   public String getKey() {\r
44     if (key == null) {\r
45       StringBuilder querystatebuilder = new StringBuilder("#");\r
46       for (Pazpar2Command command : commands.values()) {\r
47         if (command.hasParameters()) {\r
48           querystatebuilder.append("||"+command.getName()+"::");\r
49           querystatebuilder.append(command.getValueWithExpressions());\r
50         }      \r
51       }            \r
52       key = querystatebuilder.toString();\r
53       return key;\r
54     } else {      \r
55       return key;\r
56     }\r
57   }\r
58   \r
59   /**\r
60    * Checks if a command represents a change of this state\r
61    * \r
62    * @param command\r
63    * @return true if the command causes a change of state\r
64    */\r
65   public boolean stateMutating (Pazpar2Command command) {\r
66     if (command == null) {\r
67       return true;\r
68     } else if (commands.get(command.getName()) == null) {\r
69       return true;\r
70     } else if ((command.equals(commands.get(command.getName())))) {\r
71       return false;      \r
72     } else {\r
73       return true;\r
74     }\r
75   } \r
76   \r
77   /**\r
78    * Returns a command from this state\r
79    * \r
80    * @param name\r
81    * @return\r
82    */  \r
83   public Pazpar2Command getCommand(String name) {\r
84     return commands.get(name);\r
85   }\r
86 }\r