Adds support for target category command - 'categories'
[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 (StateManager mgr) {\r
34     commands.put(Pazpar2Commands.INIT,     new InitCommand(mgr));\r
35     commands.put(Pazpar2Commands.PING,     new PingCommand(mgr));\r
36     commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand(mgr));\r
37     commands.put(Pazpar2Commands.SEARCH,   new SearchCommand(mgr));\r
38     commands.put(Pazpar2Commands.STAT,     new StatCommand(mgr));\r
39     commands.put(Pazpar2Commands.SHOW,     new ShowCommand(mgr));\r
40     commands.put(Pazpar2Commands.RECORD,   new RecordCommand(mgr));\r
41     commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand(mgr));\r
42     commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand(mgr));  \r
43 \r
44     commands.put(ServiceProxyCommands.AUTH, new AuthCommand(mgr));\r
45     commands.put(ServiceProxyCommands.CATEGORIES, new CategoriesCommand(mgr));\r
46     key = "#1";\r
47   }\r
48     \r
49   /**\r
50    * Creates new state by cloning all commands of the provided state and \r
51    * then overriding one of them with the provided state changing command.\r
52    * \r
53    * @param previousState\r
54    * @param newCommand\r
55    */\r
56   public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
57     for (String commandName : previousState.commands.keySet()) {\r
58       this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
59     }\r
60     this.commands.put(newCommand.getCommandName(),newCommand);\r
61     this.key = getKey();           \r
62   }\r
63     \r
64   /**\r
65    * Generates a state key that can be used by the browser to pick\r
66    * up this state again at a later point in time.\r
67    * \r
68    * @return\r
69    */\r
70   public String getKey() {\r
71     if (key == null) {\r
72       StringBuilder querystatebuilder = new StringBuilder("");\r
73       for (Pazpar2Command command : commands.values()) {\r
74         if (command.hasParameters()) {\r
75           querystatebuilder.append("||"+command.getCommandName()+"::");\r
76           querystatebuilder.append(command.getValueWithExpressions());\r
77         }      \r
78       }            \r
79       key = "#"+querystatebuilder.toString();\r
80       return key;\r
81     } else {      \r
82       return key;\r
83     }\r
84   }\r
85   \r
86   /**\r
87    * Checks if a command represents a change of this state\r
88    * \r
89    * @param command\r
90    * @return true if the command causes a change of state\r
91    */\r
92   public boolean stateMutating (Pazpar2Command command) {\r
93     if (command == null) {\r
94       return true;\r
95     } else if (commands.get(command.getCommandName()) == null) {\r
96       return true;\r
97     } else if ((command.equals(commands.get(command.getCommandName())))) {\r
98       return false;      \r
99     } else {\r
100       return true;\r
101     }\r
102   } \r
103   \r
104   /**\r
105    * Returns a command from this state\r
106    * \r
107    * @param name\r
108    * @return\r
109    */  \r
110   public Pazpar2Command getCommand(String name) {\r
111     return commands.get(name);\r
112   }\r
113 }\r