Refactors commands and injection
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / SearchCommand.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import javax.enterprise.context.SessionScoped;\r
4 import javax.inject.Named;\r
5 \r
6 import org.apache.log4j.Logger;\r
7 \r
8 import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;\r
9 import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;\r
10 import com.indexdata.mkjsf.pazpar2.Pz2Bean;\r
11 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
12 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
13 import com.indexdata.mkjsf.pazpar2.data.ResponseParser;\r
14 \r
15 @SessionScoped @Named\r
16 public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand {\r
17   \r
18   private static final long serialVersionUID = -1888520867838597236L;\r
19   private static Logger logger = Logger.getLogger(SearchCommand.class);\r
20   private SingleTargetFilter singleTargetFilter = null;\r
21     \r
22   public SearchCommand() {\r
23     super("search");\r
24   }\r
25   \r
26   public ResponseDataObject run() {\r
27     logger.info("Running " + getCommandName());\r
28     logger.info("Using client " + Pz2Bean.get().getSearchClient());\r
29     logger.info("Storing responses to " + Pz2Bean.get().getPzresp());\r
30     Pz2Bean.get().getSearchClient().setSearchCommand(this);\r
31     logger.info("Executing command " + getCommandName());\r
32     HttpResponseWrapper httpResponse = Pz2Bean.get().getSearchClient().executeCommand(this);\r
33     ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse);\r
34     Pz2Bean.get().getPzresp().put(getCommandName(), responseObject);\r
35     return responseObject;\r
36   }\r
37 \r
38     \r
39   public void setQuery(String query) {    \r
40     setParameter(new CommandParameter("query","=",query));\r
41   }\r
42   \r
43   public String getQuery () {    \r
44     return getParameter("query") == null ? null  : getParameter("query").getValueWithExpressions();\r
45   }\r
46   \r
47   public void setFilter(String filterExpression) {\r
48     setParameter(new CommandParameter("filter","=",filterExpression));\r
49   }\r
50   \r
51   public String getFilter() {\r
52     return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
53   }\r
54   \r
55   public void addFilter(String filterExpression) {\r
56     // TODO: implement\r
57     if (hasParameterValue("filter")) {\r
58       setFilter(filterExpression);\r
59     } else {\r
60       getParameter("filter");\r
61     }\r
62     throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
63   }\r
64   \r
65   public void removeFilters () {\r
66     removeParameter("filter");\r
67   }\r
68   \r
69   public void removeFilter(String filterExpression) {\r
70     // TODO: implement\r
71     throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
72   }\r
73 \r
74   public boolean hasFilter () {\r
75     return getFilter().length()>0;\r
76   }\r
77   \r
78   public void setLimit (String limitExpression) {\r
79     setParameter(new CommandParameter("limit","=",limitExpression));\r
80   }\r
81   \r
82   public String getLimit () {\r
83     return getParameterValue("limit");\r
84   }\r
85       \r
86   public void setStartrecs (String startrecs) {\r
87     setParameter(new CommandParameter("startrecs","=",startrecs));\r
88   }\r
89   \r
90   public String getStartrecs () {\r
91     return getParameterValue("startrecs");\r
92   }\r
93   \r
94   public void setMaxrecs (String maxrecs) {\r
95     setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
96   }\r
97   \r
98   public String getMaxrecs () {\r
99     return getParameterValue("maxrecs");\r
100   }\r
101   \r
102   public void setSort (String sort) {\r
103     setParameter(new CommandParameter("sort","=",sort));\r
104   }\r
105   \r
106   public String getSort () {\r
107     return getParameterValue("sort");\r
108   }\r
109   \r
110   public void setRank (String rank) {\r
111     setParameter(new CommandParameter("rank","=",rank));\r
112   }\r
113   \r
114   public String getRank () {\r
115     return getParameterValue("rank");\r
116   }\r
117   \r
118   public void setMergekey (String mergekey) {\r
119     setParameter(new CommandParameter("mergekey","=",mergekey));\r
120   }\r
121   \r
122   public String getMergekey () {\r
123     return getParameterValue("mergekey");\r
124   }\r
125   \r
126   \r
127   /**\r
128    * Sets a facet, in CQL, to restrict the current results,\r
129    * then executes the search \r
130    * \r
131    * @param facetKey  i.e.  'au' for author\r
132    * @param term  i.e. 'Dickens, Charles'\r
133    */\r
134   public void setFacet(String facetKey, String term) {\r
135     if (term != null && term.length()>0) {         \r
136       getParameter("query").addExpression(new Expression(facetKey,"=",term));            \r
137     }            \r
138   }\r
139   \r
140   /**\r
141    * Sets a facet to limit the current query by. The \r
142    * facet is appended to the query string itself (rather\r
143    * as a separately managed entity. It will thus appear\r
144    * in a query field as retrieved by getQuery(). It will\r
145    * not be removed by removeFacet(...)\r
146    * \r
147    * @param facetKey  i.e. 'au' for author\r
148    * @param term i.e. 'Dickens, Charles'\r
149    */\r
150   public void setFacetOnQuery (String facetKey, String term) {\r
151     String facetExpression = facetKey + "=" + term;    \r
152     if (term != null && term.length()>0) {\r
153       String currentQuery= getParameterValue("query");\r
154       setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));      \r
155     }            \r
156   }\r
157       \r
158   /**\r
159    * Removes a facet set by setFacet(...), then executes\r
160    * the search.\r
161    * \r
162    * Will not remove facets set by setFacetOnQuery(...)\r
163    *  \r
164    * @param facetKey i.e. 'au' for author\r
165    * @param term i.e. 'Dickens, Charles'\r
166    */\r
167   public void removeFacet(String facetKey, String term) {\r
168     if (getParameter("query") != null) {\r
169       getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
170     }\r
171   }\r
172   \r
173   \r
174   /**\r
175    * Adds a single target filter to restrict the current query by, \r
176    * then executes the current search.\r
177    * \r
178    * This is a special case of the general setFilter function, \r
179    * allowing to associate a descriptive target name with the \r
180    * filter expression for display in UI. \r
181    * \r
182    * @param targetId pazpar2's ID for the target to limit by\r
183    * @param targetName a descriptive name for the target\r
184    */\r
185   public void setSingleTargetFilter (String targetId, String targetName) {    \r
186     if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
187       logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
188     } else {      \r
189       logger.debug("Setting new single target filter for [" + targetName + "]");\r
190       this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
191       setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression()));            \r
192     }    \r
193   }\r
194 \r
195   public SingleTargetFilter getSingleTargetFilter () {\r
196     logger.debug("request to get the current single target filter " + singleTargetFilter);\r
197     return singleTargetFilter;\r
198   }\r
199    \r
200   /**\r
201    * Removes the current target filter from the search\r
202    * \r
203    */\r
204   public String removeSingleTargetFilter () {\r
205     logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
206     this.singleTargetFilter = null;\r
207     removeParameter("filter");\r
208     return null;\r
209   }\r
210   \r
211   /**\r
212    * \r
213    * @return The target filter set on the current search command\r
214    */\r
215   public boolean hasSingleTargetFilter() {\r
216     logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
217     return singleTargetFilter != null;    \r
218   }\r
219   \r
220   /**\r
221    * Resolves if the current search command has a target filter - to\r
222    * be used by the UI for conditional rendering of target filter info.\r
223    * \r
224    * @return true if the current search command is limited by a target \r
225    * filter\r
226    */\r
227   protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
228     logger.debug("Checking if target filter for [" + targetFilter.getTargetName() + "] is set.");\r
229     return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
230   }\r
231     \r
232   public SearchCommand copy () {\r
233     SearchCommand newCommand = new SearchCommand();\r
234     for (String parameterName : parameters.keySet()) {\r
235       newCommand.setParameterInState(parameters.get(parameterName).copy());      \r
236     }\r
237     newCommand.singleTargetFilter = this.singleTargetFilter;\r
238     return newCommand;\r
239   }\r
240 \r
241   @Override\r
242   public ServiceProxyCommand getSp() {\r
243     return this;\r
244   }\r
245 \r
246   @Override\r
247   public boolean spOnly() {\r
248     return false;\r
249   }\r
250 \r
251 }\r