Adds beans and configs
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / Pz2Session.java
1 package com.indexdata.pz2utils4jsf.pazpar2;\r
2 \r
3 import java.io.Serializable;\r
4 import java.util.ArrayList;\r
5 import java.util.List;\r
6 import java.util.Map;\r
7 import java.util.StringTokenizer;\r
8 import java.util.concurrent.ConcurrentHashMap;\r
9 \r
10 import org.apache.log4j.Logger;\r
11 \r
12 import com.indexdata.pz2utils4jsf.controls.ResultsPager;\r
13 import com.indexdata.pz2utils4jsf.pazpar2.CommandParameter;\r
14 import com.indexdata.pz2utils4jsf.pazpar2.CommandThread;\r
15 import com.indexdata.pz2utils4jsf.pazpar2.Expression;\r
16 import com.indexdata.pz2utils4jsf.pazpar2.Pazpar2Command;\r
17 import com.indexdata.pz2utils4jsf.pazpar2.Pz2Interface;\r
18 import com.indexdata.pz2utils4jsf.pazpar2.Pz2Session;\r
19 import com.indexdata.pz2utils4jsf.pazpar2.TargetFilter;\r
20 import com.indexdata.masterkey.pazpar2.client.Pazpar2Client;\r
21 import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientConfiguration;\r
22 import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientGeneric;\r
23 import com.indexdata.masterkey.pazpar2.client.exceptions.ProxyErrorException;\r
24 import com.indexdata.pz2utils4jsf.config.JsfdemoPazpar2ClientConfiguration;\r
25 import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget;\r
26 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
27 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseParser;\r
28 import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;\r
29 import com.indexdata.pz2utils4jsf.pazpar2.data.ShowResponse;\r
30 import com.indexdata.pz2utils4jsf.pazpar2.data.StatResponse;\r
31 import com.indexdata.pz2utils4jsf.pazpar2.data.TermListsResponse;\r
32 import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;\r
33 import com.indexdata.pz2utils4jsf.pazpar2.state.QueryStates;\r
34 \r
35 public class Pz2Session implements Serializable, Pz2Interface {\r
36   \r
37   private static Logger logger = Logger.getLogger(Pz2Session.class);\r
38   \r
39   private Map<String,Pazpar2ResponseData> dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
40   private QueryStates queryStates = new QueryStates();\r
41   \r
42   private static final long serialVersionUID = 3947514708343320514L;  \r
43   private Pazpar2ClientConfiguration cfg = null;\r
44   private Pazpar2Client client = null;   \r
45   private TargetFilter targetFilter = null;  \r
46   private ResultsPager pager = null; \r
47 \r
48   public Pz2Session () {\r
49     logger.debug("Instantiating pz2");    \r
50     try {\r
51       cfg = new Pazpar2ClientConfiguration(new JsfdemoPazpar2ClientConfiguration().getModuleConfiguration());\r
52       client = new Pazpar2ClientGeneric(cfg);\r
53       resetDataObjects();\r
54     } catch (ProxyErrorException e) {\r
55       e.printStackTrace();\r
56     }    \r
57   }\r
58 \r
59   public void doSearch(String query) {\r
60     setCommandParameter("search",new CommandParameter("query","=",query));     \r
61     doSearch();\r
62   }\r
63 \r
64   public void doSearch() { \r
65     queryStates.hasPendingStateChange("search",false);\r
66     resetDataObjects();\r
67     setCommandParameter("show",new CommandParameter("start","=",0));    \r
68     logger.info("Searching using "+getCommand("search").getParameter("query").getEncodedQueryString());\r
69     doCommand("search");    \r
70   }\r
71       \r
72   /**\r
73    * Refreshes 'show', 'stat', 'termlist', and 'bytarget' data object from pazpar2\r
74    * \r
75    * @return Number of activeclients at the time of the 'show' command.\r
76    */\r
77   public String update () {\r
78     logger.info("Updating show,stat,termlist, and bytarget data from pazpar2");\r
79     return update("show,stat,termlist,bytarget");\r
80   }\r
81  \r
82   /**\r
83    * Refreshes the data objects listed in 'commands' from pazpar2\r
84    * \r
85    * @param commands\r
86    * @return Number of activeclients at the time of the 'show' command\r
87    */\r
88   public String update (String commands) {\r
89     if (hasQuery()) {\r
90       handleQueryStateChanges(commands);\r
91       logger.debug("Processing request for " + commands); \r
92       List<CommandThread> threadList = new ArrayList<CommandThread>();\r
93       StringTokenizer tokens = new StringTokenizer(commands,",");\r
94       while (tokens.hasMoreElements()) {\r
95         threadList.add(new CommandThread(getCommand(tokens.nextToken()),client));            \r
96       }\r
97       for (CommandThread thread : threadList) {\r
98         thread.start();\r
99       }\r
100       for (CommandThread thread : threadList) {\r
101         try {\r
102           thread.join();\r
103         } catch (InterruptedException e) {\r
104           e.printStackTrace();\r
105         }\r
106       }\r
107       for (CommandThread thread : threadList) {\r
108         if (!thread.getCommand().getName().equals("search")) {\r
109           dataObjects.put(thread.getCommand().getName(), new Pazpar2ResponseParser().getObject(thread.getResponse()));\r
110         }\r
111       }\r
112       return getActiveClients();\r
113     } else {\r
114       logger.info("Skipped requests for " + commands + " as there's not yet a query."); \r
115       resetDataObjects();\r
116       return "0";\r
117     }\r
118     \r
119   }\r
120         \r
121   public void setQuery (String query) {\r
122     logger.debug("Creating new command parameter for " + query);\r
123     setCommandParameter("search",new CommandParameter("query","=",query));\r
124   }\r
125   \r
126   public String getQuery () {\r
127     return getCommandParameterValueSimple("search","query",null);\r
128   }\r
129   \r
130   public void setFacet (String facetKey, String term) {           \r
131     if (term != null && term.length()>0) {\r
132       queryStates.getCurrentState().setCommandParameterExpression("search","query",new Expression(facetKey,"=",term),queryStates);\r
133       doSearch();\r
134     }            \r
135   }\r
136   \r
137   public void setFacetOnQuery (String facetKey, String term) {\r
138     String facetExpression = facetKey + "=" + term;    \r
139     if (term != null && term.length()>0) {\r
140       setCommandParameter("search",new CommandParameter("query","=", getQuery() + " and " + facetExpression));\r
141       doSearch();        \r
142     }            \r
143   }\r
144       \r
145   public void removeFacet(String facetKey, String term) {\r
146     queryStates.getCurrentState().removeCommandParameterExpression("search","query",new Expression(facetKey,"=",term),queryStates);\r
147     doSearch();\r
148   }\r
149   \r
150   public void setTargetFilter (String targetId, String targetName) {    \r
151     if (hasTargetFilter(new TargetFilter(targetId,targetName))) {\r
152       logger.debug("Already using target filter " + this.targetFilter.getFilterExpression());\r
153     } else {      \r
154       this.targetFilter = new TargetFilter(targetId,targetName);\r
155       setCommandParameter("search",new CommandParameter("filter","=",this.targetFilter.getFilterExpression()));      \r
156       doSearch();\r
157     }    \r
158   }\r
159 \r
160   public TargetFilter getTargetFilter () {\r
161     return targetFilter;\r
162   }\r
163     \r
164   public void removeTargetFilter () {\r
165     logger.debug("Removing target filter " + targetFilter.getFilterExpression());\r
166     this.targetFilter = null;\r
167     removeCommandParameter("search","filter");         \r
168     doSearch();\r
169   }\r
170   \r
171   public boolean hasTargetFilter() {\r
172     return targetFilter != null;    \r
173   }\r
174         \r
175   public void setSort (String sortOption) {\r
176     logger.debug("Setting sort option: " + sortOption);\r
177     setCommandParameter("show",new CommandParameter("sort","=",sortOption));\r
178     update("show");\r
179   }\r
180   \r
181   public String getSort () {\r
182     return getCommandParameterValue("show","sort","relevance");\r
183   }\r
184     \r
185   public void setPageSize (int perPageOption) {\r
186     if (getPageSize()!=perPageOption) {\r
187      logger.debug("Setting perpage option to " + perPageOption + " and resetting start page.");\r
188      setCommandParameter("show",new CommandParameter("num","=",perPageOption));\r
189      setCommandParameter("show",new CommandParameter("start","=",0));\r
190      update("show");\r
191     } else {\r
192       logger.debug("Not updating page size, already is " + perPageOption);\r
193     }\r
194   }\r
195   \r
196   public int getPageSize () {\r
197     return getCommandParameterValue("show","num",20);\r
198   }\r
199   \r
200   public void setStart (int start) {\r
201     logger.debug("Setting start num to " + start);\r
202     setCommandParameter("show", new CommandParameter("start","=",start));  \r
203     update("show");\r
204   }\r
205   \r
206   public int getStart() {\r
207     return getCommandParameterValue("show","start",0);\r
208   }\r
209         \r
210   public String toggleRecord (String recId) {\r
211     if (hasRecord(recId)) {\r
212       removeCommand("record");  \r
213       dataObjects.put("record", new RecordResponse());\r
214       return "";\r
215     } else {\r
216       return updateRecord(recId);\r
217     }\r
218   }\r
219   \r
220   private String updateRecord(String recId) {    \r
221     setCommandParameter("record",new CommandParameter("id","=",recId));    \r
222     return doCommand("record");    \r
223   }\r
224   \r
225   public boolean hasRecord (String recId) {\r
226     return getCommand("record").hasParameters() && getRecord().getRecId().equals(recId);\r
227   }\r
228       \r
229   public ShowResponse getShow () {\r
230     return ((ShowResponse) dataObjects.get("show"));\r
231   }\r
232   \r
233   public StatResponse getStat () {\r
234     return ((StatResponse) dataObjects.get("stat"));\r
235   }\r
236   \r
237   public RecordResponse getRecord() {\r
238     return ((RecordResponse) dataObjects.get("record"));\r
239   }\r
240   \r
241   public TermListsResponse getTermLists () {\r
242     return ((TermListsResponse) dataObjects.get("termlist"));\r
243   }\r
244   \r
245   public List<TermResponse> getFacetTerms (String facet, int count) {\r
246     return (getTermLists().getTermList(facet).getTerms(count));\r
247   }\r
248     \r
249   public List<TermResponse> getFacetTerms (String facet) {\r
250     return (getTermLists().getTermList(facet).getTerms());\r
251   }\r
252   \r
253   public ByTarget getByTarget() {\r
254     return ((ByTarget) dataObjects.get("bytarget"));\r
255   }\r
256   \r
257   \r
258   public String getCurrentStateKey () {    \r
259     return queryStates.getCurrentStateKey();\r
260   }\r
261       \r
262   public void setCurrentStateKey(String key) {\r
263     logger.debug("************** request to set state key to: [" + key + "]");    \r
264     queryStates.setCurrentStateKey(key);\r
265   }\r
266     \r
267   private boolean hasTargetFilter(TargetFilter targetFilter) {\r
268     return hasTargetFilter() && targetFilter.equals(this.targetFilter);\r
269   }\r
270   \r
271   private boolean hasQuery() {\r
272     return !(getCommand("search").getParameter("query") == null);\r
273   }\r
274     \r
275   public boolean hasRecords () {\r
276     return getStat().getRecords() > 0            \r
277            && getShow().getHits() != null \r
278            && getShow().getHits().size()>0;\r
279   }\r
280     \r
281   public ResultsPager getPager () {\r
282     if (pager == null) {\r
283       pager = new ResultsPager(this);      \r
284     } \r
285     return pager;      \r
286   }\r
287   \r
288   public ResultsPager setPager (int pageRange) {\r
289     pager =  new ResultsPager(this,pageRange);\r
290     return pager;\r
291   }\r
292   \r
293   private void handleQueryStateChanges (String commands) {\r
294     if (queryStates.hasPendingStateChange("search")) { \r
295       logger.debug("Found pending search change. Doing search before updating " + commands);\r
296       doSearch();\r
297     } \r
298     if (queryStates.hasPendingStateChange("record") && ! commands.equals("record")) {        \r
299       logger.debug("Found pending record ID change. Doing record before updating " + commands);\r
300       queryStates.hasPendingStateChange("record",false);\r
301       if (getCommand("record").hasParameters()) {\r
302         updateRecord(getCommand("record").getParameter("id").getSimpleValue());\r
303       } else {\r
304         removeCommand("record");  \r
305         dataObjects.put("record", new RecordResponse());\r
306       }\r
307     }    \r
308   }\r
309 \r
310   private String getActiveClients() {\r
311     logger.debug("Active clients: "+getShow().getActiveClients());\r
312     if (getShow()!=null) {\r
313       return getShow().getActiveClients();\r
314     } else {\r
315       return "";\r
316     }\r
317   }\r
318 \r
319   private Pazpar2Command getCommand(String name) {\r
320     return queryStates.getCurrentState().getCommand(name);\r
321   }\r
322   \r
323   private void setCommandParameter(String commandName, CommandParameter parameter) {\r
324     logger.debug("Setting parameter for " + commandName + ": " + parameter);\r
325     queryStates.getCurrentState().setCommandParameter(commandName, parameter, queryStates);    \r
326   }\r
327   \r
328   \r
329   private void removeCommandParameter(String commandName, String parameterName) {\r
330     queryStates.getCurrentState().removeCommandParameter(commandName,parameterName,queryStates);    \r
331   }\r
332   \r
333   private void removeCommand (String commandName) {\r
334     queryStates.getCurrentState().removeCommand(commandName, queryStates);\r
335   }\r
336     \r
337   private String getCommandParameterValue (String commandName, String parameterName, String defaultValue) {    \r
338     Pazpar2Command command = getCommand(commandName);\r
339     if (command != null) {\r
340       CommandParameter parameter = command.getParameter(parameterName);\r
341       if (parameter != null) {\r
342         return parameter.getValueWithExpressions();\r
343       }\r
344     }\r
345     return defaultValue;    \r
346   }\r
347   \r
348   private String getCommandParameterValueSimple (String commandName, String parameterName, String defaultValue) {    \r
349     Pazpar2Command command = getCommand(commandName);\r
350     if (command != null) {\r
351       CommandParameter parameter = command.getParameter(parameterName);\r
352       if (parameter != null) {\r
353         return parameter.getSimpleValue();\r
354       }\r
355     }\r
356     return defaultValue;    \r
357   }\r
358 \r
359   \r
360   private int getCommandParameterValue (String commandName, String parameterName, int defaultValue) {\r
361     Pazpar2Command command = getCommand(commandName);\r
362     if (command != null) {\r
363       CommandParameter parameter = command.getParameter(parameterName);\r
364       if (parameter != null) {\r
365         return Integer.parseInt(parameter.getSimpleValue());\r
366       }\r
367     }\r
368     return defaultValue;    \r
369   }\r
370 \r
371   private String doCommand(String commandName) {\r
372     Pazpar2Command command = getCommand(commandName);    \r
373     logger.debug(command.getEncodedQueryString() + ": Results for "+ getCommand("search").getEncodedQueryString());\r
374     return update(commandName);\r
375   }\r
376   \r
377   private void resetDataObjects() {\r
378     logger.debug("Resetting show,stat,termlist,bytarget response objects.");\r
379     dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
380     dataObjects.put("show", new ShowResponse());\r
381     dataObjects.put("stat", new StatResponse());\r
382     dataObjects.put("termlist", new TermListsResponse());\r
383     dataObjects.put("bytarget", new ByTarget());\r
384     dataObjects.put("record", new RecordResponse());\r
385   }\r
386 \r
387 }\r