X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcom%2Findexdata%2Fmkjsf%2Fpazpar2%2FPz2Bean.java;h=4faef7b231c4b4c229766717398d69fe3a5c574e;hb=5584e83f4b8d6c66999048dafcb9ce6999808894;hp=98f4c718fb5f5c5fdf6d5c41476394552e9d8587;hpb=28b5abb240eda1749703712a0ba19a5843f84ebc;p=mkjsf-moved-to-github.git diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java index 98f4c71..4faef7b 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java @@ -2,17 +2,21 @@ package com.indexdata.mkjsf.pazpar2; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.StringTokenizer; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; -import javax.enterprise.inject.Alternative; import javax.inject.Inject; import javax.inject.Named; import org.apache.log4j.Logger; +import com.indexdata.mkjsf.config.Configurable; +import com.indexdata.mkjsf.config.Configuration; import com.indexdata.mkjsf.config.ConfigurationReader; import com.indexdata.mkjsf.controls.ResultsPager; import com.indexdata.mkjsf.errors.ConfigurationError; @@ -21,31 +25,44 @@ import com.indexdata.mkjsf.errors.ErrorCentral; import com.indexdata.mkjsf.errors.ErrorHelper; import com.indexdata.mkjsf.pazpar2.commands.CommandParameter; import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands; -import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData; -import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseParser; -import com.indexdata.mkjsf.pazpar2.data.Pazpar2Responses; +import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject; +import com.indexdata.mkjsf.pazpar2.data.ResponseParser; +import com.indexdata.mkjsf.pazpar2.data.Responses; import com.indexdata.mkjsf.pazpar2.data.RecordResponse; +import com.indexdata.mkjsf.pazpar2.sp.auth.ServiceProxyUser; import com.indexdata.mkjsf.pazpar2.state.StateListener; import com.indexdata.mkjsf.pazpar2.state.StateManager; import com.indexdata.mkjsf.utils.Utils; -@Named("pz2") @SessionScoped @Alternative -public class Pz2Bean implements Pz2Interface, StateListener, Serializable { +@Named("pz2") @SessionScoped +public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Serializable { + + private static final String MODULE_NAME = "service"; + private static String SERVICE_TYPE_TBD = "TBD", SERVICE_TYPE_PZ2 = "PZ2", SERVICE_TYPE_SP = "SP"; + private static final List serviceTypes = + Arrays.asList(SERVICE_TYPE_PZ2,SERVICE_TYPE_SP,SERVICE_TYPE_TBD); + private String serviceType = SERVICE_TYPE_TBD; + private List serviceProxyUrls = new ArrayList(); + public static final String SERVICE_PROXY_URL_LIST = "SERVICE_PROXY_URL_LIST"; + private List pazpar2Urls = new ArrayList(); + public static final String PAZPAR2_URL_LIST = "PAZPAR2_URL_LIST"; + private static final long serialVersionUID = 3440277287081557861L; private static Logger logger = Logger.getLogger(Pz2Bean.class); - private static Logger responseLogger = Logger.getLogger("com.indexdata.mkjsf.pazpar2.responses"); - - protected SearchClient searchClient = null; - + private static Logger responseLogger = Logger.getLogger("com.indexdata.mkjsf.pazpar2.responses"); + protected Pz2Client pz2Client = null; + protected ServiceProxyClient spClient = null; + protected SearchClient searchClient = null; + @Inject ConfigurationReader configurator; @Inject StateManager stateMgr; @Inject Pazpar2Commands pzreq; - @Inject Pazpar2Responses pzresp; + @Inject Responses pzresp; @Inject ErrorCentral errors; + @Inject ServiceProxyUser user; protected ResultsPager pager = null; - protected ErrorHelper errorHelper = null; @@ -55,25 +72,36 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { @PostConstruct public void postConstruct() { - logger.debug("in start of Pz2Bean post-construct configurator is " + configurator); + logger.debug("Pz2Bean post-construct: Configurator is " + configurator); logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next."); - searchClient = new Pz2Client(); - logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" - + Utils.objectId(configurator) + "]" ); - configureClient(searchClient,configurator); + pz2Client = new Pz2Client(); + configureClient(pz2Client,configurator); + spClient = new ServiceProxyClient(); + configureClient(spClient,configurator); + try { + this.configure(configurator); + } catch (ConfigurationException e) { + logger.error("There was a problem configuring the Pz2Bean (\"pz2\")"); + e.printStackTrace(); + } stateMgr.addStateListener(this); } - public void configureClient(SearchClient searchClient, ConfigurationReader configReader) { + public void configureClient(SearchClient client, ConfigurationReader configReader) { logger.debug(Utils.objectId(this) + " will configure search client for the session"); try { - searchClient.configure(configReader); + client.configure(configReader); } catch (ConfigurationException e) { logger.debug("Pz2Bean adding configuration error"); errors.addConfigurationError(new ConfigurationError("Search Client","Configuration",e.getMessage())); } logger.info(configReader.document()); - pzresp.reset(); + pzresp.resetAllSessionData(); + } + + public void resetSearchAndRecordCommands () { + pzreq.getRecord().removeParametersInState(); + pzreq.getSearch().removeParametersInState(); } @@ -84,7 +112,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { public void doSearch() { stateMgr.hasPendingStateChange("search",false); - pzresp.reset(); + pzresp.resetSearchResponses(); // resets some record and show command parameters without // changing state or creating state change feedback pzreq.getRecord().removeParametersInState(); @@ -110,9 +138,10 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { * @return Number of activeclients at the time of the 'show' command */ public String update (String commands) { + try { if (! errors.hasConfigurationErrors()) { if (commandsAreValid(commands)) { - if (hasQuery() || (commands.equals("record") && pzreq.getCommand("record").hasParameterSet("recordquery"))) { + if (hasQuery() || (commands.equals("record") && pzreq.getCommand("record").hasParameterValue("recordquery"))) { handleQueryStateChanges(commands); logger.debug("Processing request for " + commands); List threadList = new ArrayList(); @@ -131,38 +160,59 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { } } for (CommandThread thread : threadList) { - String commandName = thread.getCommand().getName(); - String response = thread.getResponse(); - responseLogger.debug("Response was: " + response); - Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response); - pzresp.put(commandName, responseObject); + String commandName = thread.getCommand().getCommandName(); + ClientCommandResponse response = (ClientCommandResponse) thread.getCommandResponse(); + responseLogger.debug("Response was: " + response.getResponseString()); + ResponseDataObject responseObject = ResponseParser.getParser().getDataObject(response); + if (ResponseParser.docTypes.contains(responseObject.getType())) { + pzresp.put(commandName, responseObject); + } else { + if (commandName.equals("record") && + (pzreq.getRecord().hasParameterValue("offset") || + pzreq.getRecord().hasParameterValue("checksum"))) { + RecordResponse recordResponse = new RecordResponse(); + recordResponse.setType("record"); + recordResponse.setXml(responseObject.getXml()); + recordResponse.setAttribute("activeclients", "0"); + pzresp.put(commandName, recordResponse); + } + } } - if (commands.equals("record")) { - logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients()); + if (commands.equals("record")) { return pzresp.getRecord().getActiveClients(); } else { return pzresp.getActiveClients(); } } else { logger.debug("Skipped requests for " + commands + " as there's not yet a query."); - pzresp.reset(); + pzresp.resetSearchResponses(); return "0"; } } else { - logger.error("Did not attemt to run command(s) due to a validation error."); + logger.debug("Did not attempt to run command(s) that were not ready."); return "0"; } } else { logger.error("Did not attempt to execute query since there are configuration errors."); return "0"; } + } catch (ClassCastException cce) { + cce.printStackTrace(); + return ""; + } catch (NullPointerException npe) { + npe.printStackTrace(); + return ""; + } catch (Exception e) { + e.printStackTrace(); + return ""; + } } public boolean commandsAreValid(String commands) { if (commands.equals("record")) { - if (!pzreq.getCommand("record").hasParameterSet("id")) { - logger.error("Attempt to send record command without the id parameter"); + if (!pzreq.getCommand("record").hasParameterValue("id")) { + logger.debug("Attempt to send record command without the id parameter"); return false; } } @@ -194,7 +244,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { } protected boolean hasQuery() { - return pzreq.getCommand("search").hasParameterSet("query"); + return pzreq.getCommand("search").hasParameterValue("query"); } @@ -220,7 +270,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) { logger.debug("Found pending record ID change. Doing record before updating " + commands); stateMgr.hasPendingStateChange("record",false); - if (pzreq.getCommand("record").hasParameterSet("id")) { + if (pzreq.getCommand("record").hasParameterValue("id")) { update("record"); } else { pzresp.put("record", new RecordResponse()); @@ -242,9 +292,91 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { } } + public void setServiceProxyUrl(String url) { + searchClient = spClient; + setServiceType(SERVICE_TYPE_SP); + setServiceUrl(url); + } + + public String getServiceProxyUrl () { + if (isServiceProxyService()) { + return spClient.getServiceUrl(); + } else { + return ""; + } + } + + public void setPazpar2Url(String url) { + searchClient = pz2Client; + setServiceType(SERVICE_TYPE_PZ2); + setServiceUrl(url); + } + + public String getPazpar2Url() { + if (isPazpar2Service()) { + return pz2Client.getServiceUrl(); + } else { + return ""; + } + } + + + @Override + public void setServiceUrl(String url) { + if (url!=null && searchClient != null && !url.equals(searchClient.getServiceUrl())) { + pzreq.getRecord().removeParametersInState(); + pzreq.getSearch().removeParametersInState(); + pzresp.resetAllSessionData(); + user.clear(); + searchClient.setServiceUrl(url); + } + } + + public String getServiceUrl() { + return (searchClient!=null ? searchClient.getServiceUrl() : ""); + } + + public boolean getServiceUrlIsDefined() { + return (searchClient != null && searchClient.hasServiceUrl()); + } + + public List getServiceProxyUrls() { + List urls = new ArrayList(); + urls.add(""); + urls.addAll(serviceProxyUrls); + return urls; + } + + public List getPazpar2Urls () { + List urls = new ArrayList(); + urls.add(""); + urls.addAll(pazpar2Urls); + return urls; + } + + public String getServiceType () { + return serviceType; + } + + public boolean isPazpar2Service () { + return serviceType.equals(SERVICE_TYPE_PZ2); + } + + public boolean isServiceProxyService() { + return serviceType.equals(SERVICE_TYPE_SP); + } + + public boolean serviceIsToBeDecided () { + return serviceType.equals(SERVICE_TYPE_TBD); + } + + public ServiceProxyClient getSpClient () { + return spClient; + } + @Override public boolean getAuthenticationRequired () { - return searchClient.isAuthenticatingClient(); + return spClient.isAuthenticatingClient(); } @Override @@ -261,5 +393,77 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { public String getWatchActiveclientsRecord () { return ":pz2watch:activeclientsForm:activeclientsFieldRecord"; } + + @Override + public void configure(ConfigurationReader reader) + throws ConfigurationException { + Configuration config = reader.getConfiguration(this); + if (config == null) { + serviceType = SERVICE_TYPE_TBD; + } else { + String service = config.get("TYPE"); + if (service == null || service.length()==0) { + serviceType = SERVICE_TYPE_TBD; + } else if (serviceTypes.contains(service.toUpperCase())) { + setServiceType(service.toUpperCase()); + } else { + logger.error("Unknown serviceType type in configuration [" + service + "], can be one of " + serviceTypes); + serviceType = SERVICE_TYPE_TBD; + } + serviceProxyUrls = config.getMultiProperty(SERVICE_PROXY_URL_LIST,","); + pazpar2Urls = config.getMultiProperty(PAZPAR2_URL_LIST, ","); + } + logger.info("Service Type is configured to " + serviceType); + + } + + @Override + public Map getDefaults() { + return new HashMap(); + } + + @Override + public String getModuleName() { + return MODULE_NAME; + } + + @Override + public List documentConfiguration() { + return new ArrayList(); + } + + @Override + public void setServiceTypePZ2() { + setServiceType(SERVICE_TYPE_PZ2); + } + + @Override + public void setServiceTypeSP() { + setServiceType(SERVICE_TYPE_SP); + } + + @Override + public void setServiceTypeTBD() { + setServiceType(SERVICE_TYPE_TBD); + } + + private void setServiceType(String type) { + if (!serviceType.equals(type) && + !serviceType.equals(SERVICE_TYPE_TBD)) { + resetSearchAndRecordCommands(); + pzresp.resetAllSessionData(); + } + serviceType = type; + if (serviceType.equals(SERVICE_TYPE_PZ2)) { + searchClient = pz2Client; + logger.info("Setting a Pazpar2 client to serve requests."); + } else if (serviceType.equals(SERVICE_TYPE_SP)) { + searchClient = spClient; + logger.info("Setting a Service Proxy client to serve requests."); + } else { + logger.info("Clearing search client. No client defined to serve requests at this point."); + searchClient = null; + } + } }