Adds methods handling 'filter' and 'limit' expressions
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / Pazpar2Command.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import java.io.Serializable;\r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 import java.util.StringTokenizer;\r
7 \r
8 import org.apache.log4j.Logger;\r
9 \r
10 import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;\r
11 import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;\r
12 import com.indexdata.mkjsf.pazpar2.Pz2Service;\r
13 import com.indexdata.mkjsf.pazpar2.SearchClient;\r
14 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
15 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
16 import com.indexdata.mkjsf.pazpar2.data.ResponseParser;\r
17 import com.indexdata.mkjsf.pazpar2.data.Responses;\r
18 \r
19 public abstract class Pazpar2Command implements Serializable  {\r
20   \r
21   private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
22   private static final long serialVersionUID = -6825491856480675917L;   \r
23   protected String name = "";\r
24   protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();  \r
25   \r
26   public Pazpar2Command () {    \r
27   }\r
28   \r
29   public void setCommandName(String name) {\r
30     this.name = name;\r
31   }\r
32           \r
33   public Pazpar2Command (String name) {\r
34     this.name = name;    \r
35   }\r
36       \r
37   public abstract Pazpar2Command copy ();\r
38           \r
39   public String getCommandName() {\r
40     return name;\r
41   }\r
42   \r
43   public ResponseDataObject run() {    \r
44     return run(Pz2Service.get().getSearchClient(),\r
45                Pz2Service.get().getPzresp());\r
46   }\r
47   \r
48   public ResponseDataObject runWith(String... parameters) {\r
49     for (String parameter : parameters) {\r
50       StringTokenizer tokenizer = new StringTokenizer(parameter,"=");\r
51       String name = (String) tokenizer.nextElement();\r
52       String value = (String) tokenizer.nextElement();\r
53       CommandParameter commandParameter = new CommandParameter(name,"=",value);\r
54       setParameterInState(commandParameter);\r
55     }\r
56     return run();\r
57   }\r
58   \r
59   /**\r
60    * For running the command in a thread. Client and Responses must be \r
61    * provided because at this point the CDI bean cannot be retrieved \r
62    * from within a thread.\r
63    * \r
64    * @param client\r
65    * @param pzresp\r
66    * @return\r
67    */\r
68   public ResponseDataObject run(SearchClient client,Responses pzresp) {\r
69     logger.debug("Running " + getCommandName() + " using " + client);    \r
70     HttpResponseWrapper httpResponse = client.executeCommand(this);\r
71     logger.debug("Parsing response for " + getCommandName());\r
72     ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse);\r
73     logger.trace("Storing response for " + getCommandName());\r
74     pzresp.put(getCommandName(), responseObject);\r
75     return responseObject;    \r
76   }\r
77   \r
78     \r
79   public void setParameter (CommandParameter parameter) {\r
80     Pazpar2Command copy = this.copy();\r
81     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
82     copy.parameters.put(parameter.getName(),parameter);\r
83     checkInState(copy);\r
84   }\r
85   \r
86   public void setParameters (CommandParameter... params) {\r
87     Pazpar2Command copy = this.copy();\r
88     for (CommandParameter param : params) {\r
89       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
90       copy.parameters.put(param.getName(),param);\r
91     }\r
92     checkInState(copy);\r
93   }\r
94   \r
95   public void setParametersInState (CommandParameter... params) {    \r
96     for (CommandParameter param : params) {\r
97       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
98       parameters.put(param.getName(),param);\r
99     }    \r
100   }\r
101     \r
102   public void setParameterInState (CommandParameter parameter) {\r
103     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
104     parameters.put(parameter.getName(),parameter);    \r
105   }\r
106   \r
107   \r
108   public CommandParameter getParameter (String name) {\r
109     return parameters.get(name);\r
110   }\r
111   \r
112   public void removeParameter (String name) {\r
113     Pazpar2Command copy = this.copy();\r
114     copy.parameters.remove(name);\r
115     checkInState(copy);\r
116   }\r
117   \r
118   public void removeParameters() {\r
119     Pazpar2Command copy = this.copy();\r
120     copy.parameters = new HashMap<String,CommandParameter>();\r
121     checkInState(copy);\r
122   }\r
123   \r
124   public void removeParametersInState() {\r
125     parameters = new HashMap<String,CommandParameter>();    \r
126   }\r
127   \r
128   public void addExpression(String parameterName, Expression expression) {\r
129     Pazpar2Command copy = this.copy();\r
130     copy.getParameter(parameterName).addExpression(expression);\r
131     checkInState(copy);\r
132   }\r
133   \r
134   public void removeExpression(String parameterName, Expression expression) {\r
135     Pazpar2Command copy = this.copy();\r
136     copy.getParameter(parameterName).removeExpression(expression);\r
137     checkInState(copy);    \r
138   }\r
139   \r
140   public void removeExpressionsAfter(String parameterName, Expression expression,String... expressionFields) {\r
141     Pazpar2Command copy = this.copy();\r
142     copy.getParameter(parameterName).removeExpressionsAfter(expression,expressionFields);\r
143     checkInState(copy);    \r
144   }\r
145   \r
146   public void removeExpressions(String parameterName, String... expressionFields) {\r
147     Pazpar2Command copy = this.copy();    \r
148     copy.getParameter(parameterName).removeExpressions(expressionFields);    \r
149     if (!getParameter(parameterName).hasValue() && !getParameter(parameterName).hasExpressions()) {\r
150       copy.parameters.remove(parameterName);\r
151     }\r
152     checkInState(copy);    \r
153   }\r
154   \r
155   public boolean hasParameters () {\r
156     return (parameters.keySet().size()>0);\r
157   }\r
158   \r
159   public boolean hasParameterValue(String parameterName) {\r
160     return (parameters.get(parameterName) != null && (parameters.get(parameterName).hasValue()));\r
161   }\r
162     \r
163   public String getEncodedQueryString () {\r
164     StringBuilder queryString = new StringBuilder("command="+name);\r
165     for (CommandParameter parameter : parameters.values()) {\r
166       if (parameter.hasValue() || parameter.hasExpressions()) {\r
167         queryString.append("&"+parameter.getEncodedQueryString());\r
168       }\r
169     }\r
170     return queryString.toString();\r
171   } \r
172     \r
173   public String getValueWithExpressions() {    \r
174     StringBuilder value = new StringBuilder("");\r
175     for (CommandParameter parameter : parameters.values()) {\r
176       if (parameter.hasValue() || parameter.hasExpressions()) {\r
177         value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions());\r
178       }\r
179    }\r
180     return value.toString();\r
181   }\r
182   \r
183   @Override\r
184   public boolean equals (Object otherCommand) {\r
185     logger.trace("Comparing commands ["+this.toString()+"] and ["+otherCommand.toString() +"]");\r
186     return\r
187         ((otherCommand instanceof Pazpar2Command)\r
188          && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
189   }\r
190   \r
191   @Override\r
192   public int hashCode () {\r
193     return getValueWithExpressions().hashCode();\r
194   }\r
195   \r
196   public String toString () {\r
197     return parameters.toString();\r
198   }\r
199 \r
200   public String getParameterValue(String parameterName) {\r
201     return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions();    \r
202   }\r
203 \r
204   public String getUrlEncodedParameterValue(String parameterName) {\r
205     return getParameter(parameterName).getEncodedQueryString();\r
206   }\r
207   \r
208   public void setSession (String sessionId) {\r
209     setParameter(new CommandParameter("session","=",sessionId));\r
210   }\r
211   \r
212   public String getSession() {\r
213     return getParameterValue("session");\r
214   } \r
215   \r
216   private void checkInState(Pazpar2Command command) {\r
217     Pz2Service.get().getStateMgr().checkIn(command);\r
218   }\r
219   \r
220   public String navigateTo (String target) {\r
221     return target;\r
222   }\r
223   \r
224   public abstract ServiceProxyCommand getSp();\r
225    \r
226   public abstract boolean spOnly();  \r
227 }\r