e983d5c558460f4998d6130e6b134cd7a38c31d2
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / state / Pazpar2State.java
1 package com.indexdata.mkjsf.pazpar2.state;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.Map;\r
5 \r
6 import com.indexdata.mkjsf.pazpar2.commands.BytargetCommand;\r
7 import com.indexdata.mkjsf.pazpar2.commands.InitCommand;\r
8 import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
9 import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
10 import com.indexdata.mkjsf.pazpar2.commands.PingCommand;\r
11 import com.indexdata.mkjsf.pazpar2.commands.RecordCommand;\r
12 import com.indexdata.mkjsf.pazpar2.commands.SearchCommand;\r
13 import com.indexdata.mkjsf.pazpar2.commands.SettingsCommand;\r
14 import com.indexdata.mkjsf.pazpar2.commands.ShowCommand;\r
15 import com.indexdata.mkjsf.pazpar2.commands.StatCommand;\r
16 import com.indexdata.mkjsf.pazpar2.commands.TermlistCommand;\r
17 \r
18 /**\r
19  * Holds a 'pazpar2 state', understood as a full set of pazpar2 commands and \r
20  * all their parameter settings at a given point in time.\r
21  *  \r
22  * @author Niels Erik\r
23  *\r
24  */\r
25 public class Pazpar2State {\r
26 \r
27   String key = null;\r
28   Map<String,Pazpar2Command> commands = new HashMap<String,Pazpar2Command>();;\r
29 \r
30   public Pazpar2State (StateManager mgr) {\r
31     commands.put(Pazpar2Commands.INIT,     new InitCommand(mgr));\r
32     commands.put(Pazpar2Commands.PING,     new PingCommand(mgr));\r
33     commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand(mgr));\r
34     commands.put(Pazpar2Commands.SEARCH,   new SearchCommand(mgr));\r
35     commands.put(Pazpar2Commands.STAT,     new StatCommand(mgr));\r
36     commands.put(Pazpar2Commands.SHOW,     new ShowCommand(mgr));\r
37     commands.put(Pazpar2Commands.RECORD,   new RecordCommand(mgr));\r
38     commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand(mgr));\r
39     commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand(mgr));    \r
40     key = "#1";\r
41   }\r
42     \r
43   /**\r
44    * Creates new state by cloning all commands of the provided state and \r
45    * then overriding one of them with the provided state changing command.\r
46    * \r
47    * @param previousState\r
48    * @param newCommand\r
49    */\r
50   public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
51     for (String commandName : previousState.commands.keySet()) {\r
52       this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
53     }\r
54     this.commands.put(newCommand.getName(),newCommand);\r
55     this.key = getKey();           \r
56   }\r
57     \r
58   /**\r
59    * Generates a state key that can be used by the browser to pick\r
60    * up this state again at a later point in time.\r
61    * \r
62    * @return\r
63    */\r
64   public String getKey() {\r
65     if (key == null) {\r
66       StringBuilder querystatebuilder = new StringBuilder("");\r
67       for (Pazpar2Command command : commands.values()) {\r
68         if (command.hasParameters()) {\r
69           querystatebuilder.append("||"+command.getName()+"::");\r
70           querystatebuilder.append(command.getValueWithExpressions());\r
71         }      \r
72       }            \r
73       key = "#"+querystatebuilder.toString().hashCode();\r
74       return key;\r
75     } else {      \r
76       return key;\r
77     }\r
78   }\r
79   \r
80   /**\r
81    * Checks if a command represents a change of this state\r
82    * \r
83    * @param command\r
84    * @return true if the command causes a change of state\r
85    */\r
86   public boolean stateMutating (Pazpar2Command command) {\r
87     if (command == null) {\r
88       return true;\r
89     } else if (commands.get(command.getName()) == null) {\r
90       return true;\r
91     } else if ((command.equals(commands.get(command.getName())))) {\r
92       return false;      \r
93     } else {\r
94       return true;\r
95     }\r
96   } \r
97   \r
98   /**\r
99    * Returns a command from this state\r
100    * \r
101    * @param name\r
102    * @return\r
103    */  \r
104   public Pazpar2Command getCommand(String name) {\r
105     return commands.get(name);\r
106   }\r
107 }\r