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