Refactors state management
[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   public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
23     for (String commandName : previousState.commands.keySet()) {\r
24       this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
25     }\r
26     this.commands.put(newCommand.getName(),newCommand);\r
27     this.key = getKey();           \r
28   }\r
29     \r
30   /**\r
31    * Generates a state key that can be used by the browser to pick\r
32    * up this state again at a later point in time.\r
33    * \r
34    * @return\r
35    */\r
36   public String getKey() {\r
37     if (key == null) {\r
38       StringBuilder querystatebuilder = new StringBuilder("#");\r
39       for (Pazpar2Command command : commands.values()) {\r
40         if (command.hasParameters()) {\r
41           querystatebuilder.append("||"+command.getName()+"::");\r
42           querystatebuilder.append(command.getValueWithExpressions());\r
43         }      \r
44       }            \r
45       key = querystatebuilder.toString();\r
46       return key;\r
47     } else {      \r
48       return key;\r
49     }\r
50   }\r
51   \r
52   /**\r
53    * Checks if the provided command represents a state change\r
54    * \r
55    * @param command\r
56    * @return true if the command causes a change of state\r
57    */\r
58   public boolean stateMutating (Pazpar2Command command) {\r
59     if (command == null) {\r
60       return true;\r
61     } else if (commands.get(command.getName()) == null) {\r
62       return true;\r
63     } else if ((command.equals(commands.get(command.getName())))) {\r
64       return false;      \r
65     } else {\r
66       return true;\r
67     }\r
68   } \r
69   \r
70   public Pazpar2Command getCommand(String name) {\r
71     return commands.get(name);\r
72   }\r
73 }\r