X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcom%2Findexdata%2Fpz2utils4jsf%2Fpazpar2%2FPz2Session.java;h=7c0cc8608201b8af78bc2ca7dd59dbd94b335cd4;hb=46a090cd2f2e2069c684084eeded75c9d5ed71f5;hp=58b296fffa1bdd9e1fb06b79243a98369c9c7d42;hpb=5ce9f5404929b726668d3332c5bdba4dbd1d1d1f;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 58b296f..7c0cc86 100644 --- a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java +++ b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Session.java @@ -6,16 +6,21 @@ import java.util.Map; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; -import javax.enterprise.context.SessionScoped; -import javax.inject.Named; +import javax.annotation.PostConstruct; +import javax.inject.Inject; import org.apache.log4j.Logger; -import com.indexdata.pz2utils4jsf.config.Pz2Configurator; +import com.indexdata.pz2utils4jsf.config.ConfigurationReader; import com.indexdata.pz2utils4jsf.controls.ResultsPager; +import com.indexdata.pz2utils4jsf.errors.ConfigurationError; import com.indexdata.pz2utils4jsf.errors.ConfigurationException; import com.indexdata.pz2utils4jsf.errors.ErrorHelper; import com.indexdata.pz2utils4jsf.errors.ErrorInterface; +import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandParameter; +import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandReadOnly; +import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command; +import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Commands; import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget; import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError; import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData; @@ -26,59 +31,71 @@ import com.indexdata.pz2utils4jsf.pazpar2.data.ShowResponse; import com.indexdata.pz2utils4jsf.pazpar2.data.StatResponse; import com.indexdata.pz2utils4jsf.pazpar2.data.TermListsResponse; import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse; -import com.indexdata.pz2utils4jsf.pazpar2.state.QueryStates; +import com.indexdata.pz2utils4jsf.pazpar2.state.StateListener; +import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager; import com.indexdata.pz2utils4jsf.utils.Utils; -@Named @SessionScoped -public class Pz2Session implements Pz2Interface { +@ForStraightPz2 +public class Pz2Session implements Pz2Interface, StateListener { 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 ErrorHelper errorHelper = null; + protected Map dataObjects = new ConcurrentHashMap(); - private List configurationErrors = null; - private SearchClient searchClient = null; - private TargetFilter targetFilter = null; - private ResultsPager pager = null; + @Inject StateManager stateMgr; + @Inject Pazpar2Commands req; + + 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) + "]"); + logger.info("Instantiating pz2 session object [" + Utils.objectId(this) + "]"); + } + + @PostConstruct + public void listenToStateManager() { + logger.debug("in post-construct of Pz2Session stateMgr is " + stateMgr); + logger.debug("in post-construct req is " + req); + stateMgr.addStateListener(this); } - public void init(SearchClient searchClient, Pz2Configurator configurator) { + public void configureClient(SearchClient searchClient, ConfigurationReader configReader) { configurationErrors = new ArrayList(); - errorHelper = new ErrorHelper(configurator); + errorHelper = new ErrorHelper(configReader); logger.debug(Utils.objectId(this) + " will configure search client for the session"); try { - searchClient.configure(configurator); - - // The cloning is a hack: + 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 not supported. - // Trying so will throw a WELD-001303 error. To avoid that, a context - // free client is spawned from the context dependent one. - this.searchClient = searchClient.cloneMe(); - + // 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) { - logger.info("Found " + configurationErrors.size() + " configuration errors"); - } + 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(); } public void doSearch() { - queryStates.hasPendingStateChange("search",false); + stateMgr.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()); + logger.debug(Utils.objectId(this) + " is searching using "+req.getCommandReadOnly("search").getUrlEncodedParameterValue("query")); doCommand("search"); } @@ -105,8 +122,8 @@ public class Pz2Session implements Pz2Interface { logger.debug("Processing request for " + commands); List threadList = new ArrayList(); StringTokenizer tokens = new StringTokenizer(commands,","); - while (tokens.hasMoreElements()) { - threadList.add(new CommandThread(getCommand(tokens.nextToken()),searchClient)); + while (tokens.hasMoreElements()) { + threadList.add(new CommandThread(req.getCommandReadOnly(tokens.nextToken()),searchClient)); } for (CommandThread thread : threadList) { thread.start(); @@ -125,7 +142,12 @@ public class Pz2Session implements Pz2Interface { 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(); @@ -137,113 +159,22 @@ public class Pz2Session implements Pz2Interface { } } - - public void setQuery (String query) { - logger.debug("Creating new command parameter for " + query); - setCommandParameter("search",new CommandParameter("query","=",query)); - } - - public String getQuery () { - return getCommandParameterValueSimple("search","query",null); - } - - public void setFacet (String facetKey, String term) { - if (term != null && term.length()>0) { - queryStates.getCurrentState().setCommandParameterExpression("search","query",new Expression(facetKey,"=",term),queryStates); - doSearch(); - } - } - - public void setFacetOnQuery (String facetKey, String term) { - String facetExpression = facetKey + "=" + term; - if (term != null && term.length()>0) { - setCommandParameter("search",new CommandParameter("query","=", getQuery() + " and " + facetExpression)); - doSearch(); - } - } - - public void removeFacet(String facetKey, String term) { - queryStates.getCurrentState().removeCommandParameterExpression("search","query",new Expression(facetKey,"=",term),queryStates); - doSearch(); - } - - public void setTargetFilter (String targetId, String targetName) { - if (hasTargetFilter(new TargetFilter(targetId,targetName))) { - logger.debug("Already using target filter " + this.targetFilter.getFilterExpression()); - } else { - this.targetFilter = new TargetFilter(targetId,targetName); - setCommandParameter("search",new CommandParameter("filter","=",this.targetFilter.getFilterExpression())); - doSearch(); - } - } - - public TargetFilter getTargetFilter () { - return targetFilter; - } - - public void removeTargetFilter () { - logger.debug("Removing target filter " + targetFilter.getFilterExpression()); - this.targetFilter = null; - removeCommandParameter("search","filter"); - doSearch(); - } - - public boolean hasTargetFilter() { - return targetFilter != null; - } - - public void setSort (String sortOption) { - logger.debug("Setting sort option: " + sortOption); - setCommandParameter("show",new CommandParameter("sort","=",sortOption)); - update("show"); - } - - public String getSort () { - return getCommandParameterValue("show","sort","relevance"); - } - - public void setPageSize (int perPageOption) { - if (getPageSize()!=perPageOption) { - logger.debug("Setting perpage option to " + perPageOption + " and resetting start page."); - setCommandParameter("show",new CommandParameter("num","=",perPageOption)); - setCommandParameter("show",new CommandParameter("start","=",0)); - update("show"); - } else { - logger.debug("Not updating page size, already is " + perPageOption); - } - } - - public int getPageSize () { - return getCommandParameterValue("show","num",20); - } - - public void setStart (int start) { - logger.debug("Setting start num to " + start); - setCommandParameter("show", new CommandParameter("start","=",start)); - update("show"); - } - - 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); + req.getRecord().setRecordId(recId); + return doCommand("record"); } } - private String updateRecord(String recId) { - setCommandParameter("record",new CommandParameter("id","=",recId)); - return doCommand("record"); - } - + @Override public boolean hasRecord (String recId) { - return getCommand("record").hasParameters() && getRecord().getRecId().equals(recId); + return req.getCommandReadOnly("record").hasParameters() && getRecord().getRecId().equals(recId); } public ShowResponse getShow () { @@ -276,11 +207,11 @@ public class Pz2Session implements Pz2Interface { public String getCurrentStateKey () { - return queryStates.getCurrentStateKey(); + return stateMgr.getCurrentState().getKey(); } public void setCurrentStateKey(String key) { - queryStates.setCurrentStateKey(key); + stateMgr.setCurrentStateKey(key); } public boolean hasConfigurationErrors () { @@ -332,14 +263,9 @@ public class Pz2Session implements Pz2Interface { error.setErrorHelper(errorHelper); return error; } - - - private boolean hasTargetFilter(TargetFilter targetFilter) { - return hasTargetFilter() && targetFilter.equals(this.targetFilter); - } - private boolean hasQuery() { - return !(getCommand("search").getParameter("query") == null); + protected boolean hasQuery() { + return req.getSearch().getParameter("query") != null && req.getSearch().getParameter("query").getValueWithExpressions().length()>0; } public boolean hasRecords () { @@ -356,7 +282,7 @@ public class Pz2Session implements Pz2Interface { } public ResultsPager setPager (int pageRange) { - pager = new ResultsPager(this,pageRange); + pager = new ResultsPager(this,pageRange,req); return pager; } @@ -364,24 +290,24 @@ public class Pz2Session implements Pz2Interface { return errorHelper; } - private void handleQueryStateChanges (String commands) { - if (queryStates.hasPendingStateChange("search")) { - logger.debug("Found pending search change. Doing search before updating " + commands); + protected void handleQueryStateChanges (String commands) { + if (stateMgr.hasPendingStateChange("search") && hasQuery()) { + logger.debug("Found pending search change. Doing search before updating " + commands); doSearch(); } - if (queryStates.hasPendingStateChange("record") && ! commands.equals("record")) { + if (stateMgr.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()); + stateMgr.hasPendingStateChange("record",false); + if (req.getCommandReadOnly("record").hasParameters()) { + update("record"); } else { removeCommand("record"); dataObjects.put("record", new RecordResponse()); } - } + } } - private String getActiveClients() { + protected String getActiveClients() { if (getShow()!=null) { logger.debug("Active clients: "+getShow().getActiveClients()); return getShow().getActiveClients(); @@ -390,65 +316,88 @@ public class Pz2Session implements Pz2Interface { } } - private Pazpar2Command getCommand(String name) { - return queryStates.getCurrentState().getCommand(name); + /** + * Returns a Pazpar2 command 'detached' from the current Pazpar2 state. + * + * 'Detached' is meant to imply that this is a copy of a command in the + * current state, detached so as to NOT change the current state if + * modified. It can be viewed and executed, however. + * + * In order to modify the command with effect for subsequent searches, + * it must be checked back into the StateManager, which will + * then create a new current Pazpar2 state as needed. + * + * @param name + * @return + */ + protected Pazpar2Command getCommand(String name) { + return req.getCommand(name); } - private void setCommandParameter(String commandName, CommandParameter parameter) { + /** + * Returns an interface to a Pazpar2Command with only String getters. + * + * Since the command cannot be modified (unless it is cast) we can avoid + * cloning it before returning it from the current state. + * It can be used for log statements, checks and for performing the + * actual pazpar2 request. + * + * @param name + * @return + */ + protected CommandReadOnly getCommandReadOnly(String name) { + return req.getCommandReadOnly(name); + } + + + protected void setCommandParameter(String commandName, CommandParameter parameter) { logger.debug("Setting parameter for " + commandName + ": " + parameter); - queryStates.getCurrentState().setCommandParameter(commandName, parameter, queryStates); + Pazpar2Command command = req.getCommand(commandName); + command.setParameter(parameter); + stateMgr.checkIn(command); } - private void removeCommandParameter(String commandName, String parameterName) { - queryStates.getCurrentState().removeCommandParameter(commandName,parameterName,queryStates); + protected void removeCommandParameter(String commandName, String parameterName) { + Pazpar2Command command = req.getCommand(commandName); + command.removeParameter(parameterName); + stateMgr.checkIn(command); } - private void removeCommand (String commandName) { - queryStates.getCurrentState().removeCommand(commandName, queryStates); + protected void removeCommand (String commandName) { + Pazpar2Command command = req.getCommand(commandName); + command.removeParameters(); + stateMgr.checkIn(command); } - private String getCommandParameterValue (String commandName, String parameterName, String defaultValue) { - Pazpar2Command command = getCommand(commandName); - if (command != null) { - CommandParameter parameter = command.getParameter(parameterName); - if (parameter != null) { - return parameter.getValueWithExpressions(); - } - } - return defaultValue; - } - - private String getCommandParameterValueSimple (String commandName, String parameterName, String defaultValue) { - Pazpar2Command command = getCommand(commandName); + protected String getCommandParameterValue (String commandName, String parameterName, String defaultValue) { + CommandReadOnly command = req.getCommandReadOnly(commandName); if (command != null) { - CommandParameter parameter = command.getParameter(parameterName); + String parameter = command.getParameterValue(parameterName); if (parameter != null) { - return parameter.getSimpleValue(); + return parameter; } } return defaultValue; } - - - private int getCommandParameterValue (String commandName, String parameterName, int defaultValue) { - Pazpar2Command command = getCommand(commandName); + + protected int getCommandParameterValue (String commandName, String parameterName, int defaultValue) { + CommandReadOnly command = req.getCommandReadOnly(commandName); if (command != null) { - CommandParameter parameter = command.getParameter(parameterName); + String parameter = command.getParameterValue(parameterName); if (parameter != null) { - return Integer.parseInt(parameter.getSimpleValue()); + return Integer.parseInt(parameter); } } return defaultValue; } - private String doCommand(String commandName) { - Pazpar2Command command = getCommand(commandName); - logger.debug(command.getEncodedQueryString() + ": Results for "+ getCommand("search").getEncodedQueryString()); - return update(commandName); + protected String doCommand(String commandName) { + logger.debug(req.getCommandReadOnly(commandName).getEncodedQueryString() + ": Results for "+ req.getCommandReadOnly("search").getEncodedQueryString()); + 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()); @@ -459,4 +408,14 @@ public class Pz2Session implements Pz2Interface { dataObjects.put("search", new SearchResponse()); } + + @Override + public void stateUpdated(String commandName) { + logger.debug("State change reported for [" + commandName + "]"); + if (commandName.equals("show")) { + logger.debug("Updating show"); + update(commandName); + } + } + }