1 package com.indexdata.pz2utils4jsf.pazpar2;
\r
3 import java.io.Serializable;
\r
4 import java.util.ArrayList;
\r
5 import java.util.List;
\r
6 import java.util.StringTokenizer;
\r
8 import javax.annotation.PostConstruct;
\r
9 import javax.enterprise.context.SessionScoped;
\r
10 import javax.enterprise.inject.Alternative;
\r
11 import javax.inject.Inject;
\r
12 import javax.inject.Named;
\r
14 import org.apache.log4j.Logger;
\r
16 import com.indexdata.pz2utils4jsf.config.ConfigurationReader;
\r
17 import com.indexdata.pz2utils4jsf.controls.ResultsPager;
\r
18 import com.indexdata.pz2utils4jsf.errors.ConfigurationError;
\r
19 import com.indexdata.pz2utils4jsf.errors.ConfigurationException;
\r
20 import com.indexdata.pz2utils4jsf.errors.ErrorHelper;
\r
21 import com.indexdata.pz2utils4jsf.errors.ErrorInterface;
\r
22 import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandParameter;
\r
23 import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Commands;
\r
24 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;
\r
25 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseParser;
\r
26 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Responses;
\r
27 import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;
\r
28 import com.indexdata.pz2utils4jsf.pazpar2.state.StateListener;
\r
29 import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;
\r
30 import com.indexdata.pz2utils4jsf.utils.Utils;
\r
32 @Named("pz2") @SessionScoped @Alternative
\r
33 public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
\r
35 private static final long serialVersionUID = 3440277287081557861L;
\r
36 private static Logger logger = Logger.getLogger(Pz2Bean.class);
\r
37 private static Logger responseLogger = Logger.getLogger("com.indexdata.pz2utils4jsf.pazpar2.responses");
\r
39 protected SearchClient searchClient = null;
\r
41 @Inject ConfigurationReader configurator;
\r
42 @Inject StateManager stateMgr;
\r
43 @Inject Pazpar2Commands pzreq;
\r
44 @Inject Pazpar2Responses pzresp;
\r
46 protected ResultsPager pager = null;
\r
48 protected List<ErrorInterface> configurationErrors = null;
\r
49 protected ErrorHelper errorHelper = null;
\r
52 logger.info("Instantiating pz2 bean [" + Utils.objectId(this) + "]");
\r
56 public void postConstruct() {
\r
57 logger.debug("in start of Pz2Bean post-construct configurator is " + configurator);
\r
58 logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");
\r
59 searchClient = new Pz2Client();
\r
60 logger.info("Using [" + Utils.objectId(searchClient) + "] configured by ["
\r
61 + Utils.objectId(configurator) + "]" );
\r
62 configureClient(searchClient,configurator);
\r
63 stateMgr.addStateListener(this);
\r
66 public void configureClient(SearchClient searchClient, ConfigurationReader configReader) {
\r
67 configurationErrors = new ArrayList<ErrorInterface>();
\r
68 errorHelper = new ErrorHelper(configReader);
\r
69 logger.debug(Utils.objectId(this) + " will configure search client for the session");
\r
71 searchClient.configure(configReader);
\r
72 // At the time of writing this search client is injected using Weld.
\r
73 // However, the client is used for asynchronously sending off requests
\r
74 // to the server AND propagation of context to threads is currently
\r
75 // not supported. Trying to do so throws a WELD-001303 error.
\r
76 // To avoid that, a context free client is cloned from the context
\r
78 // If propagation to threads gets supported, the cloning can go.
\r
80 // Commented as I'm trying with regular instantiation instead
\r
81 // this.searchClient = searchClient.cloneMe();
\r
82 } catch (ConfigurationException e) {
\r
83 configurationErrors.add(new ConfigurationError("Search Client","Configuration",e.getMessage(),new ErrorHelper(configReader)));
\r
85 logger.info(configReader.document());
\r
90 public void doSearch(String query) {
\r
91 pzreq.getSearch().setParameter(new CommandParameter("query","=",query));
\r
95 public void doSearch() {
\r
96 stateMgr.hasPendingStateChange("search",false);
\r
98 // resets some record and show command parameters without
\r
99 // changing state or creating state change feedback
\r
100 pzreq.getRecordInState().removeParametersSilently();
\r
101 pzreq.getShowInState().setParameterSilently(new CommandParameter("start","=",0));
\r
102 logger.debug(Utils.objectId(this) + " is searching using "+pzreq.getCommandReadOnly("search").getUrlEncodedParameterValue("query"));
\r
103 doCommand("search");
\r
107 * Refreshes 'show', 'stat', 'termlist', and 'bytarget' data object from pazpar2
\r
109 * @return Number of activeclients at the time of the 'show' command.
\r
111 public String update () {
\r
112 logger.debug("Updating show,stat,termlist,bytarget from pazpar2");
\r
113 return update("show,stat,termlist,bytarget");
\r
117 * Refreshes the data objects listed in 'commands' from pazpar2
\r
120 * @return Number of activeclients at the time of the 'show' command
\r
122 public String update (String commands) {
\r
123 if (! hasConfigurationErrors()) {
\r
124 if (commandsAreValid(commands)) {
\r
126 handleQueryStateChanges(commands);
\r
127 logger.debug("Processing request for " + commands);
\r
128 List<CommandThread> threadList = new ArrayList<CommandThread>();
\r
129 StringTokenizer tokens = new StringTokenizer(commands,",");
\r
130 while (tokens.hasMoreElements()) {
\r
131 threadList.add(new CommandThread(pzreq.getCommandReadOnly(tokens.nextToken()),searchClient));
\r
133 for (CommandThread thread : threadList) {
\r
136 for (CommandThread thread : threadList) {
\r
139 } catch (InterruptedException e) {
\r
140 e.printStackTrace();
\r
143 for (CommandThread thread : threadList) {
\r
144 String commandName = thread.getCommand().getName();
\r
145 String response = thread.getResponse();
\r
146 responseLogger.debug("Response was: " + response);
\r
147 Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response);
\r
148 pzresp.put(commandName, responseObject);
\r
150 if (commands.equals("record")) {
\r
151 logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients());
\r
152 return pzresp.getRecord().getActiveClients();
\r
154 return pzresp.getActiveClients();
\r
157 logger.debug("Skipped requests for " + commands + " as there's not yet a query.");
\r
162 logger.error("Did not attemt to run command(s) due to a validation error.");
\r
166 logger.error("Did not attempt to execute query since there are configuration errors.");
\r
172 public boolean commandsAreValid(String commands) {
\r
173 if (commands.equals("record")) {
\r
174 if (!pzreq.getCommandReadOnly("record").hasParameterSet("id")) {
\r
175 logger.error("Attempt to send record command without the id parameter");
\r
182 public String toggleRecord (String recId) {
\r
183 if (hasRecord(recId)) {
\r
184 pzreq.getRecord().removeParameters();
\r
185 pzresp.put("record", new RecordResponse());
\r
188 pzreq.getRecord().setId(recId);
\r
189 return doCommand("record");
\r
194 public boolean hasRecord (String recId) {
\r
195 return pzreq.getCommandReadOnly("record").hasParameters() && pzresp.getRecord().getRecId().equals(recId);
\r
198 public String getCurrentStateKey () {
\r
199 return stateMgr.getCurrentState().getKey();
\r
202 public void setCurrentStateKey(String key) {
\r
203 stateMgr.setCurrentStateKey(key);
\r
206 public boolean hasConfigurationErrors () {
\r
207 return (configurationErrors.size()>0);
\r
210 public boolean hasCommandErrors () {
\r
211 return pzresp.hasApplicationError();
\r
215 * Returns true if application error found in any response data objects
\r
217 public boolean hasErrors () {
\r
218 return hasConfigurationErrors() || hasCommandErrors();
\r
221 public List<ErrorInterface> getConfigurationErrors() {
\r
222 return configurationErrors;
\r
226 protected boolean hasQuery() {
\r
227 return pzreq.getCommandReadOnly("search").hasParameterSet("query");
\r
231 public ResultsPager getPager () {
\r
232 if (pager == null) {
\r
233 pager = new ResultsPager(pzresp);
\r
238 public ResultsPager setPager (int pageRange) {
\r
239 pager = new ResultsPager(pzresp,pageRange,pzreq);
\r
243 protected ErrorHelper getTroubleshooter() {
\r
244 return errorHelper;
\r
247 protected void handleQueryStateChanges (String commands) {
\r
248 if (stateMgr.hasPendingStateChange("search") && hasQuery()) {
\r
249 logger.debug("Found pending search change. Doing search before updating " + commands);
\r
252 if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) {
\r
253 logger.debug("Found pending record ID change. Doing record before updating " + commands);
\r
254 stateMgr.hasPendingStateChange("record",false);
\r
255 if (pzreq.getCommandReadOnly("record").hasParameterSet("id")) {
\r
258 pzresp.put("record", new RecordResponse());
\r
263 protected String doCommand(String commandName) {
\r
264 logger.debug(pzreq.getCommandReadOnly(commandName).getEncodedQueryString() + ": Results for "+ pzreq.getCommandReadOnly("search").getEncodedQueryString());
\r
265 return update(commandName);
\r
269 public void stateUpdated(String commandName) {
\r
270 logger.debug("State change reported for [" + commandName + "]");
\r
271 if (commandName.equals("show")) {
\r
272 logger.debug("Updating show");
\r
273 update(commandName);
\r