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