5f8ef235573e8a636839884077efb9b1c6a4597b
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / state / QueryState.java
1 package com.indexdata.pz2utils4jsf.pazpar2.state;\r
2 \r
3 import java.io.Serializable;\r
4 import java.util.Arrays;\r
5 import java.util.HashMap;\r
6 import java.util.Map;\r
7 \r
8 import org.apache.log4j.Logger;\r
9 \r
10 import com.indexdata.pz2utils4jsf.pazpar2.CommandParameter;\r
11 import com.indexdata.pz2utils4jsf.pazpar2.Expression;\r
12 import com.indexdata.pz2utils4jsf.pazpar2.Pazpar2Command;\r
13 import com.indexdata.pz2utils4jsf.pazpar2.state.QueryState;\r
14 import com.indexdata.pz2utils4jsf.pazpar2.state.QueryStates;\r
15 \r
16 public class QueryState implements Serializable {\r
17   \r
18   private static final long serialVersionUID = -1465676392610954168L;\r
19   private static Logger logger = Logger.getLogger(QueryState.class);\r
20   private Map<String,Pazpar2Command> pz2commands = new HashMap<String,Pazpar2Command>();\r
21   private String key = null;  \r
22   \r
23   public QueryState () {\r
24     for (String command : Arrays.asList("init","ping","settings","search","stat","show","record","termlist","bytarget")) {\r
25       pz2commands.put(command, new Pazpar2Command(command));\r
26     }\r
27   }    \r
28   \r
29   private QueryState copy() {    \r
30     QueryState newState = new QueryState();\r
31     for (String commandName : pz2commands.keySet()) {\r
32       newState.setCommand(pz2commands.get(commandName).copy());\r
33     }\r
34     return newState;\r
35   }\r
36     \r
37   public void setCommandParameter(String commandName, CommandParameter parameter, QueryStates queryStates) {\r
38     CommandParameter current = getCommand(commandName).getParameter(parameter.getName());\r
39     if (current != null && current.equals(parameter)) {\r
40       logger.debug("Recieved parameter but already have " + parameter.getValueWithExpressions() + " in this state. No state change.");\r
41     } else {\r
42       logger.debug("New command parameter received: " + parameter.getValueWithExpressions() + ". Initiating new state.");\r
43       QueryState newState = this.copy();\r
44       newState._setCommandParameter(commandName,parameter);\r
45       logger.debug("Old state: " + this);\r
46       logger.debug("New state: " + newState);        \r
47       queryStates.setCurrentState(newState);\r
48     }\r
49   }\r
50   \r
51   public void removeCommandParameter(String commandName, String parameterName, QueryStates queryStates) {\r
52     QueryState newState = this.copy();\r
53     newState._removeCommandParameter(commandName, parameterName);\r
54     queryStates.setCurrentState(newState);\r
55   }\r
56   \r
57   public void setCommandParameterExpression (String commandName, String parameterName, Expression expression, QueryStates queryStates) {\r
58     QueryState newState = this.copy();\r
59     newState._setCommandParameterExpression(commandName, parameterName, expression);\r
60     queryStates.setCurrentState(newState);\r
61   }\r
62   \r
63   public void _setCommandParameterExpression (String commandName, String parameterName, Expression expression) {\r
64     getCommand(commandName).getParameter(parameterName).addExpression(expression);\r
65   }\r
66   \r
67   public void removeCommandParameterExpression (String commandName, String parameterName, Expression expression, QueryStates queryStates) {\r
68     QueryState newState = this.copy();\r
69     newState._removeCommandParameterExpression(commandName, parameterName, expression);\r
70     queryStates.setCurrentState(newState);\r
71   }\r
72   \r
73   public void _removeCommandParameterExpression (String commandName, String parameterName, Expression expression) {\r
74     getCommand(commandName).getParameter(parameterName).removeExpression(expression);\r
75     \r
76   }\r
77 \r
78   public void _setCommandParameter(String commandName, CommandParameter parameter) {\r
79     getCommand(commandName).setParameter(parameter);\r
80   }\r
81   \r
82   public void _removeCommandParameter(String commandName, String parameterName) {\r
83     getCommand(commandName).removeParameter(parameterName);\r
84   }\r
85   \r
86   public void _removeCommand(String commandName) {\r
87     getCommand(commandName).removeParameters();    \r
88   }\r
89 \r
90   \r
91   public void removeCommand (String commandName, QueryStates queryStates) {\r
92     QueryState newState = this.copy();\r
93     newState._removeCommand(commandName);\r
94     queryStates.setCurrentState(newState);\r
95     \r
96   }\r
97 \r
98   public Pazpar2Command getCommand(String name) {\r
99     return pz2commands.get(name);\r
100   }\r
101   \r
102   private void setCommand(Pazpar2Command command) {\r
103     pz2commands.put(command.getName(), command);\r
104   }\r
105   \r
106   public String getKey() {\r
107     if (key == null) {\r
108       StringBuilder querystatebuilder = new StringBuilder("#");\r
109       for (Pazpar2Command command : pz2commands.values()) {\r
110         if (command.hasParameters()) {\r
111           querystatebuilder.append("||"+command.getName()+"::");\r
112           querystatebuilder.append(command.getValueWithExpressions());\r
113         }      \r
114       }            \r
115       key = querystatebuilder.toString();\r
116       return key;\r
117     } else {      \r
118       return key;\r
119     }\r
120   }\r
121   \r
122   public void setKey(String key) {\r
123     logger.debug("Setting key on demand to: " + key);\r
124     this.key = key;\r
125   }\r
126   \r
127   public String toString () {\r
128     return pz2commands.toString();\r
129   }\r
130   \r
131   public boolean searchEquals(Object otherQueryState) {\r
132     if (otherQueryState instanceof QueryState) {\r
133       return getCommand("search").equals(((QueryState) otherQueryState).getCommand("search"));\r
134     } else {\r
135       return false;\r
136     }\r
137   }\r
138   \r
139   public boolean equals (Object otherQueryState) {\r
140     if (otherQueryState instanceof QueryState) {\r
141       return this.toString().equals(otherQueryState.toString());              \r
142     } else {\r
143       return false;\r
144     }\r
145   }\r
146 \r
147 }\r