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