X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcom%2Findexdata%2Fpz2utils4jsf%2Fpazpar2%2FPz2Session.java;h=ed4c0880e867debb45f15e6d737e26830a1cc2fe;hb=33338bd223ec711264392b7768d89d0f3fbce677;hp=886a0b8e88c45f4125ec528d29482a3f4046d144;hpb=c3af1f841ac7d7cd350b5b9f18088e3081ef9a85;p=mkjsf-moved-to-github.git diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java index 886a0b8..ed4c088 100644 --- a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java +++ b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java @@ -1,6 +1,5 @@ package com.indexdata.pz2utils4jsf.pazpar2; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -12,17 +11,14 @@ import javax.inject.Named; import org.apache.log4j.Logger; -import com.indexdata.masterkey.pazpar2.client.Pazpar2Client; -import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientConfiguration; -import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientGeneric; -import com.indexdata.masterkey.pazpar2.client.exceptions.ProxyErrorException; -import com.indexdata.pz2utils4jsf.config.Pz2Configurator; +import com.indexdata.pz2utils4jsf.config.ConfigurationReader; import com.indexdata.pz2utils4jsf.controls.ResultsPager; -import com.indexdata.pz2utils4jsf.errors.ApplicationError; -import com.indexdata.pz2utils4jsf.errors.ErrorHelper; import com.indexdata.pz2utils4jsf.errors.ConfigurationError; -import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError; +import com.indexdata.pz2utils4jsf.errors.ConfigurationException; +import com.indexdata.pz2utils4jsf.errors.ErrorHelper; +import com.indexdata.pz2utils4jsf.errors.ErrorInterface; import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget; +import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError; import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData; import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseParser; import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse; @@ -36,53 +32,44 @@ import com.indexdata.pz2utils4jsf.utils.Utils; @Named @SessionScoped public class Pz2Session implements Pz2Interface { - + + private static final long serialVersionUID = 3947514708343320514L; private static Logger logger = Logger.getLogger(Pz2Session.class); - private Map dataObjects = new ConcurrentHashMap(); - private QueryStates queryStates = new QueryStates(); - - private static final long serialVersionUID = 3947514708343320514L; - private Pazpar2ClientConfiguration cfg = null; - private Pazpar2Client client = null; - private TargetFilter targetFilter = null; - private ResultsPager pager = null; - private ErrorHelper errorHelper = null; - private List configurationErrors = null; + protected Map dataObjects = new ConcurrentHashMap(); + protected QueryStates queryStates = new QueryStates(); + protected ErrorHelper errorHelper = null; + protected List configurationErrors = null; + protected SearchClient searchClient = null; + protected SingleTargetFilter singleTargetFilter = null; + protected ResultsPager pager = null; + public Pz2Session () { logger.info("Instantiating pz2 session object [" + Utils.objectId(this) + "]"); } - public void init(Pz2Configurator pz2conf) { - if (client==null) { - configurationErrors = new ArrayList(); - errorHelper = new ErrorHelper(pz2conf); - logger.info(Utils.objectId(this) + " is configuring itself using the provided " + Utils.objectId(pz2conf)); - try { - cfg = new Pazpar2ClientConfiguration(pz2conf.getConfig()); - } catch (ProxyErrorException pe) { - logger.error("Could not configure Pazpar2 client: " + pe.getMessage()); - configurationErrors.add(new ConfigurationError("Pz2Client Config","ProxyError","Could not configure Pazpar2 client: " + pe.getMessage(),errorHelper)); - } catch (IOException io) { - logger.error("Could not configure Pazpar2 client: " + io.getMessage()); - configurationErrors.add(new ConfigurationError("Pz2Client Config","ProxyError","Could not configure Pazpar2 client: " + io.getMessage(),errorHelper)); - } - if (cfg != null) { - try { - client = new Pazpar2ClientGeneric(cfg); - } catch (ProxyErrorException pe) { - logger.error("Could not instantiate Pazpar2 client: " + pe.getMessage()); - configurationErrors.add(new ConfigurationError("Pz2Client error","ProxyError","Could not create Pazpar2 client: " +pe.getMessage(),errorHelper)); - } - logger.info("Got " + configurationErrors.size() + " configuration errors"); - } - resetDataObjects(); - } else { - logger.warn("Attempt to configure session but it already has a configured client"); - } + public void configureClient(SearchClient searchClient, ConfigurationReader configReader) { + configurationErrors = new ArrayList(); + errorHelper = new ErrorHelper(configReader); + logger.debug(Utils.objectId(this) + " will configure search client for the session"); + try { + searchClient.configure(configReader); + // At the time of writing this search client is injected using Weld. + // However, the client is used for asynchronously sending off requests + // to the server AND propagation of context to threads is currently + // not supported. Trying to do so throws a WELD-001303 error. + // To avoid that, a context free client is cloned from the context + // dependent one. + // If propagation to threads gets supported, the cloning can go. + this.searchClient = searchClient.cloneMe(); + } catch (ConfigurationException e) { + configurationErrors.add(new ConfigurationError("Search Client","Configuration",e.getMessage(),new ErrorHelper(configReader))); + } + logger.info(configReader.document()); + resetDataObjects(); } - + public void doSearch(String query) { setCommandParameter("search",new CommandParameter("query","=",query)); doSearch(); @@ -91,6 +78,7 @@ public class Pz2Session implements Pz2Interface { public void doSearch() { queryStates.hasPendingStateChange("search",false); resetDataObjects(); + removeCommand("record"); setCommandParameter("show",new CommandParameter("start","=",0)); logger.debug(Utils.objectId(this) + " is searching using "+getCommand("search").getParameter("query").getEncodedQueryString()); doCommand("search"); @@ -120,7 +108,7 @@ public class Pz2Session implements Pz2Interface { List threadList = new ArrayList(); StringTokenizer tokens = new StringTokenizer(commands,","); while (tokens.hasMoreElements()) { - threadList.add(new CommandThread(getCommand(tokens.nextToken()),client)); + threadList.add(new CommandThread(getCommand(tokens.nextToken()),searchClient)); } for (CommandThread thread : threadList) { thread.start(); @@ -134,21 +122,24 @@ public class Pz2Session implements Pz2Interface { } for (CommandThread thread : threadList) { String commandName = thread.getCommand().getName(); - Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(thread.getResponse()); + String response = thread.getResponse(); + logger.debug("Response was: " + response); + Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response); dataObjects.put(commandName, responseObject); } - return getActiveClients(); + if (commands.equals("record")) { + logger.debug("Record: Active clients: "+getRecord().getActiveClients()); + return getRecord().getActiveClients(); + } else { + return getActiveClients(); + } } else { logger.debug("Skipped requests for " + commands + " as there's not yet a query."); resetDataObjects(); return "0"; } } else { - configurationErrors.add( - new ConfigurationError("Querying while errors", - "App halted", - "Cannot query Pazpar2 while there are configuration errors.", - errorHelper)); + logger.error("Did not attempt to execute query since there are configuration errors."); return "0"; } @@ -183,29 +174,29 @@ public class Pz2Session implements Pz2Interface { doSearch(); } - public void setTargetFilter (String targetId, String targetName) { - if (hasTargetFilter(new TargetFilter(targetId,targetName))) { - logger.debug("Already using target filter " + this.targetFilter.getFilterExpression()); + public void setSingleTargetFilter (String targetId, String targetName) { + if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) { + logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression()); } else { - this.targetFilter = new TargetFilter(targetId,targetName); - setCommandParameter("search",new CommandParameter("filter","=",this.targetFilter.getFilterExpression())); + this.singleTargetFilter = new SingleTargetFilter(targetId,targetName); + setCommandParameter("search",new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression())); doSearch(); } } - public TargetFilter getTargetFilter () { - return targetFilter; + public SingleTargetFilter getSingleTargetFilter () { + return singleTargetFilter; } - public void removeTargetFilter () { - logger.debug("Removing target filter " + targetFilter.getFilterExpression()); - this.targetFilter = null; + public void removeSingleTargetFilter () { + logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression()); + this.singleTargetFilter = null; removeCommandParameter("search","filter"); doSearch(); } - public boolean hasTargetFilter() { - return targetFilter != null; + public boolean hasSingleTargetFilter() { + return singleTargetFilter != null; } public void setSort (String sortOption) { @@ -242,22 +233,29 @@ public class Pz2Session implements Pz2Interface { public int getStart() { return getCommandParameterValue("show","start",0); } - + public String toggleRecord (String recId) { if (hasRecord(recId)) { removeCommand("record"); dataObjects.put("record", new RecordResponse()); return ""; } else { - return updateRecord(recId); + setRecordId(recId); + return doCommand("record"); } } - private String updateRecord(String recId) { - setCommandParameter("record",new CommandParameter("id","=",recId)); - return doCommand("record"); + @Override + public void setRecordId(String recId) { + setCommandParameter("record",new CommandParameter("id","=",recId)); + } + + @Override + public String getRecordId () { + return getCommandParameterValue("record","recid",""); } + @Override public boolean hasRecord (String recId) { return getCommand("record").hasParameters() && getRecord().getRecId().equals(recId); } @@ -324,7 +322,7 @@ public class Pz2Session implements Pz2Interface { return hasConfigurationErrors() || hasCommandErrors(); } - public List getConfigurationErrors() { + public List getConfigurationErrors() { return configurationErrors; } @@ -333,7 +331,7 @@ public class Pz2Session implements Pz2Interface { * error found for an arbitrary command, if any, otherwise * an empty dummy error. */ - public ApplicationError getCommandError() { + public ErrorInterface getCommandError() { CommandError error = new CommandError(); if (dataObjects.get("search").hasApplicationError()) { error = dataObjects.get("search").getApplicationError(); @@ -350,11 +348,11 @@ public class Pz2Session implements Pz2Interface { } - private boolean hasTargetFilter(TargetFilter targetFilter) { - return hasTargetFilter() && targetFilter.equals(this.targetFilter); + protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) { + return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter); } - private boolean hasQuery() { + protected boolean hasQuery() { return !(getCommand("search").getParameter("query") == null); } @@ -380,16 +378,16 @@ public class Pz2Session implements Pz2Interface { return errorHelper; } - private void handleQueryStateChanges (String commands) { + protected void handleQueryStateChanges (String commands) { if (queryStates.hasPendingStateChange("search")) { - logger.debug("Found pending search change. Doing search before updating " + commands); + logger.debug("Found pending search change. Doing search before updating " + commands); doSearch(); } if (queryStates.hasPendingStateChange("record") && ! commands.equals("record")) { logger.debug("Found pending record ID change. Doing record before updating " + commands); queryStates.hasPendingStateChange("record",false); if (getCommand("record").hasParameters()) { - updateRecord(getCommand("record").getParameter("id").getSimpleValue()); + update("record"); } else { removeCommand("record"); dataObjects.put("record", new RecordResponse()); @@ -397,7 +395,7 @@ public class Pz2Session implements Pz2Interface { } } - private String getActiveClients() { + protected String getActiveClients() { if (getShow()!=null) { logger.debug("Active clients: "+getShow().getActiveClients()); return getShow().getActiveClients(); @@ -406,25 +404,25 @@ public class Pz2Session implements Pz2Interface { } } - private Pazpar2Command getCommand(String name) { + protected Pazpar2Command getCommand(String name) { return queryStates.getCurrentState().getCommand(name); } - private void setCommandParameter(String commandName, CommandParameter parameter) { + protected void setCommandParameter(String commandName, CommandParameter parameter) { logger.debug("Setting parameter for " + commandName + ": " + parameter); queryStates.getCurrentState().setCommandParameter(commandName, parameter, queryStates); } - private void removeCommandParameter(String commandName, String parameterName) { + protected void removeCommandParameter(String commandName, String parameterName) { queryStates.getCurrentState().removeCommandParameter(commandName,parameterName,queryStates); } - private void removeCommand (String commandName) { + protected void removeCommand (String commandName) { queryStates.getCurrentState().removeCommand(commandName, queryStates); } - private String getCommandParameterValue (String commandName, String parameterName, String defaultValue) { + protected String getCommandParameterValue (String commandName, String parameterName, String defaultValue) { Pazpar2Command command = getCommand(commandName); if (command != null) { CommandParameter parameter = command.getParameter(parameterName); @@ -435,7 +433,7 @@ public class Pz2Session implements Pz2Interface { return defaultValue; } - private String getCommandParameterValueSimple (String commandName, String parameterName, String defaultValue) { + protected String getCommandParameterValueSimple (String commandName, String parameterName, String defaultValue) { Pazpar2Command command = getCommand(commandName); if (command != null) { CommandParameter parameter = command.getParameter(parameterName); @@ -447,7 +445,7 @@ public class Pz2Session implements Pz2Interface { } - private int getCommandParameterValue (String commandName, String parameterName, int defaultValue) { + protected int getCommandParameterValue (String commandName, String parameterName, int defaultValue) { Pazpar2Command command = getCommand(commandName); if (command != null) { CommandParameter parameter = command.getParameter(parameterName); @@ -458,13 +456,13 @@ public class Pz2Session implements Pz2Interface { return defaultValue; } - private String doCommand(String commandName) { + protected String doCommand(String commandName) { Pazpar2Command command = getCommand(commandName); logger.debug(command.getEncodedQueryString() + ": Results for "+ getCommand("search").getEncodedQueryString()); - return update(commandName); + return update(commandName); } - private void resetDataObjects() { + protected void resetDataObjects() { logger.debug("Resetting show,stat,termlist,bytarget,search response objects."); dataObjects = new ConcurrentHashMap(); dataObjects.put("show", new ShowResponse()); @@ -474,5 +472,19 @@ public class Pz2Session implements Pz2Interface { dataObjects.put("record", new RecordResponse()); dataObjects.put("search", new SearchResponse()); } + + @Override + public void setFilter(String filterExpression) { + logger.debug("Setting filter to " + filterExpression); + setCommandParameter("search",new CommandParameter("filter","=",filterExpression)); + } + + public String getFilter() { + return getCommandParameterValueSimple("search", "filter", ""); + } + + public boolean hasFilter () { + return getFilter().length()>0; + } }