--- /dev/null
+package com.indexdata.mkjsf.config;\r
+\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+\r
+/**\r
+ * Interface to be implemented by any part of an application that wish to\r
+ * use a ConfigurationReader for it's configuration. The Configurables that\r
+ * come with the project are a Pazpar2 client and a Service Proxy client\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public interface Configurable {\r
+\r
+ /**\r
+ * Configures the Configurable using the configuration obtained by the \r
+ * provided configuration reader\r
+ * @param reader used for reading the configuration \r
+ * @throws ConfigurationException\r
+ */\r
+ public void configure(ConfigurationReader reader) throws ConfigurationException;\r
+ \r
+ /**\r
+ * Returns the default parameters that the configurable has defined for itself\r
+ * Should be invoked by the configuration reader before it possibly overrides\r
+ * some parameters obtained from the external configuration source \r
+ * @return\r
+ */\r
+ public Map<String,String> getDefaults();\r
+ \r
+ /**\r
+ * Returns the name of the module, can be used by a configuration reader that \r
+ * has distinguishes between sets of configuration properties by component name\r
+ * @return name of the part that is to be configured\r
+ */\r
+ public String getModuleName();\r
+ \r
+ /**\r
+ * The components documentation of how it was configured. \r
+ * \r
+ * @return a list of Strings describing configuration details\r
+ */\r
+ public List<String> documentConfiguration(); \r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.config;\r
+\r
+import java.io.Serializable;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+/**\r
+ * Represents a configuration as a set of key-value pairs\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public class Configuration implements Serializable {\r
+\r
+ private static final long serialVersionUID = -6801241975338182197L;\r
+ private static Logger logger = Logger.getLogger(Configuration.class);\r
+ Map<String,String> properties = new HashMap<String,String>();\r
+ \r
+ public Configuration () {\r
+ logger.debug(Utils.objectId(this) + " being constructed with no argument"); \r
+ }\r
+ \r
+ public Configuration(Map<String,String> parameters) {\r
+ addAll(parameters);\r
+ }\r
+ \r
+ public void addAll(Map<String,String> parameters) {\r
+ for (String key : parameters.keySet()) {\r
+ properties.put(key, parameters.get(key));\r
+ } \r
+ }\r
+ \r
+ public void addAll(Map<String,String> defaults, Map<String,String> parameters) {\r
+ for (String key : defaults.keySet()) {\r
+ properties.put(key, defaults.get(key));\r
+ } \r
+ for (String key : parameters.keySet()) {\r
+ properties.put(key, parameters.get(key));\r
+ } \r
+ }\r
+ \r
+ public String get(String key) {\r
+ return properties.get(key); \r
+ }\r
+ \r
+ public void set(String key, String value) {\r
+ properties.put(key, value);\r
+ }\r
+ \r
+ public String get(String key, String defaultValue) {\r
+ if (properties.containsKey(key)) {\r
+ return properties.get(key);\r
+ } else {\r
+ return defaultValue;\r
+ }\r
+ }\r
+ \r
+ public String getMandatory(String key) throws MissingMandatoryParameterException {\r
+ if (properties.containsKey(key)) {\r
+ return properties.get(key);\r
+ } \r
+ throw new MissingMandatoryParameterException("Missing mandatory parameter: " + key); \r
+ }\r
+\r
+ public String getConfigFilePath() {
+ return get("configpath","nopathgiven");\r
+ }\r
+ \r
+ public Map<String,String> getConfigMap() {\r
+ return properties;\r
+ }\r
+ \r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.config;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+\r
+/**\r
+ * Interface to be implemented by classes that read configurations from a source -\r
+ * i.e. from web.xml, the file system, a database or hard-coded. \r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public interface ConfigurationReader extends Serializable {\r
+ \r
+ /**\r
+ * Returns a Configuration to be used by the given Configurable\r
+ * \r
+ * @param configurable the configurable to be configured by a configuration obtained by this reader\r
+ * @return a Configuration, basically a set of key-value pairs\r
+ * @throws ConfigurationException\r
+ */\r
+ public Configuration getConfiguration(Configurable configurable) throws ConfigurationException;\r
+ \r
+ /**\r
+ * Returns documentation for the key-value pairs obtained by this reader\r
+ * @return\r
+ */\r
+ public List<String> document();\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.config;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.enterprise.inject.Alternative;\r
+import javax.faces.context.ExternalContext;\r
+import javax.faces.context.FacesContext;\r
+import javax.inject.Named;\r
+import javax.servlet.ServletContext;\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.masterkey.config.MasterkeyConfiguration;\r
+import com.indexdata.masterkey.config.ModuleConfiguration;\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+/**\r
+ * Reads configuration from a MasterKey configuration scheme\r
+ * \r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+@Named @SessionScoped @Alternative\r
+public class Mk2ConfigReader implements ConfigurationReader {\r
+\r
+ private static final long serialVersionUID = 8865086878660568870L;\r
+ private static Logger logger = Logger.getLogger(Mk2ConfigReader.class);\r
+ private Map<String,Configuration> configs = new HashMap<String,Configuration>(); \r
+ private Map<String,Configurable> configurables = new HashMap<String,Configurable>();\r
+\r
+ public Mk2ConfigReader () throws IOException {\r
+ logger.info(Utils.objectId(this) + " is instantiating Pazpar2 service configuration by MasterKey configuration scheme.");\r
+ }\r
+\r
+ @Override\r
+ public Configuration getConfiguration(Configurable configurable) throws ConfigurationException { \r
+ if (configs.get(configurable.getModuleName()) == null) {\r
+ Configuration config = readConfig(configurable);\r
+ configs.put(configurable.getModuleName(), config); \r
+ configurables.put(configurable.getModuleName(), configurable);\r
+ }\r
+ return configs.get(configurable.getModuleName()); \r
+ }\r
+ \r
+ private Configuration readConfig (Configurable configurable) throws ConfigurationException {\r
+ Configuration config = new Configuration();\r
+ ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
+ ServletContext servletContext = (ServletContext) externalContext.getContext(); \r
+ MasterkeyConfiguration mkConfigContext;\r
+ try {\r
+ mkConfigContext = MasterkeyConfiguration.getInstance(servletContext,\r
+ "pazpar-application-jsf", ((HttpServletRequest) externalContext.getRequest()).getServerName());\r
+ } catch (IOException e) {\r
+ throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '" + configurable.getModuleName() + "' using MasterKey configuration scheme: "+e.getMessage(),e);\r
+ } \r
+ try {\r
+ ModuleConfiguration moduleConfig = mkConfigContext.getModuleConfiguration(configurable.getModuleName()); \r
+ config.addAll(configurable.getDefaults(),moduleConfig.getConfigMap());\r
+ config.set("configpath", moduleConfig.getConfigFilePath()); \r
+ } catch (IOException e) {\r
+ throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '"+ configurable.getModuleName() + "': "+e.getMessage(),e);\r
+ } \r
+ return config;\r
+ }\r
+ \r
+ public List<String> document() {\r
+ List<String> doc = new ArrayList<String>();\r
+ doc.add("Application properties as read by " + this.getClass());\r
+ for (String moduleName : configs.keySet()) {\r
+ doc.add(nl+"Module: " + moduleName);\r
+ Configurable module = configurables.get(moduleName);\r
+ Map<String,String> map = configs.get(moduleName).getConfigMap();\r
+ for (String key : map.keySet()) {\r
+ doc.add(nl+key+": "+ map.get(key) +\r
+ (module.getDefaults().containsKey(key) ? \r
+ (module.getDefaults().get(key).equals(map.get(key)) ? " [default]" : " [override]")\r
+ : "")); \r
+ }\r
+ }\r
+ return doc;\r
+ }\r
+ \r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.config;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Enumeration;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.enterprise.inject.Alternative;\r
+import javax.faces.context.ExternalContext;\r
+import javax.faces.context.FacesContext;\r
+import javax.inject.Named;\r
+import javax.servlet.ServletContext;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+\r
+/**\r
+ * Reads a configuration from the context parameters of the deployment descriptor (web.xml)\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+@Named @SessionScoped @Alternative\r
+public class WebXmlConfigReader implements ConfigurationReader {\r
+\r
+ private static final long serialVersionUID = 144390224959311772L;\r
+ private static Logger logger = Logger.getLogger(WebXmlConfigReader.class);\r
+ private Configuration config = null;\r
+ private Map<String,String> parameters = new HashMap<String,String>(); \r
+ \r
+ public WebXmlConfigReader () {\r
+ logger.info("Instantiating Pazpar2 service configuration by web.xml parameters");\r
+ }\r
+ \r
+ public Configuration getConfiguration(Configurable configurable) throws ConfigurationException {\r
+ if (config == null) {\r
+ parameters.putAll(configurable.getDefaults());\r
+ parameters.putAll(readConfig());\r
+ config = new Configuration(parameters);\r
+ }\r
+ return config;\r
+ }\r
+ \r
+ private Map<String,String> readConfig () throws ConfigurationException {\r
+ Map<String,String> map = new HashMap<String,String>();\r
+ ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
+ ServletContext servletContext = (ServletContext) externalContext.getContext(); \r
+ Enumeration<String> enumer = servletContext.getInitParameterNames();\r
+ while (enumer.hasMoreElements()) {\r
+ String name = enumer.nextElement();\r
+ map.put(name,servletContext.getInitParameter(name));\r
+ }\r
+ return map; \r
+ }\r
+ \r
+ public List<String> document() {\r
+ List<String> doc = new ArrayList<String>();\r
+ doc.add("Application properties as read by " + this.getClass());\r
+ for (String key : parameters.keySet()) {\r
+ doc.add(nl+key+": "+ parameters.get(key));\r
+ }\r
+ return doc;\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.controls;\r
+\r
+import java.io.Serializable;\r
+\r
+import com.indexdata.mkjsf.controls.ResultsPager;\r
+\r
+public class PageLink implements Serializable {\r
+\r
+ private static final long serialVersionUID = -468888598965842949L;\r
+ String text = "";\r
+ int page = 0;\r
+ ResultsPager pager;\r
+ public PageLink(String text, int page, ResultsPager pager) {\r
+ this.text = text;\r
+ this.page = page;\r
+ this.pager = pager;\r
+ }\r
+ \r
+ public boolean isLink() {\r
+ return page>0;\r
+ }\r
+ \r
+ public boolean isCurrent() {\r
+ return (pager.getCurrentPageNum()==page);\r
+ }\r
+ \r
+ public String getText() {\r
+ return text;\r
+ }\r
+ \r
+ public int getPage() {\r
+ return page;\r
+ }\r
+ \r
+ public int getStart() {\r
+ return pager.getPageSize()*(page-1);\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.controls;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2Responses;\r
+\r
+public class ResultsPager implements Serializable {\r
+\r
+ private static final long serialVersionUID = 8854795222615583071L;\r
+ private Pazpar2Responses data = null;\r
+ private int pageRangeLength = 13;\r
+ private Pazpar2Commands req;\r
+ \r
+ public ResultsPager(Pazpar2Responses data) {\r
+ this.data = data; \r
+ }\r
+ \r
+ public ResultsPager(Pazpar2Responses data, int pageRange, Pazpar2Commands req) {\r
+ this.data = data;\r
+ this.pageRangeLength = pageRange;\r
+ this.req = req;\r
+ }\r
+ \r
+ private boolean hasHits () {\r
+ return (data.getShow().getMerged()>0);\r
+ }\r
+ \r
+ public int getCurrentPageNum () {\r
+ if (hasHits() && data.getShow().getNum()>0) { \r
+ return (data.getShow().getStart()/data.getShow().getNum())+1;\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+ \r
+ public int getPageSize() {\r
+ return data.getShow().getNum();\r
+ }\r
+ \r
+ public int getFirstDisplayedPageNum () {\r
+ if (hasHits()) {\r
+ if (getCurrentPageNum() - (pageRangeLength/2) < 1) {\r
+ return 1;\r
+ } else {\r
+ return (getCurrentPageNum()-(pageRangeLength/2));\r
+ }\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+ \r
+ public int getLastDisplayedPageNum () {\r
+ if (hasHits()) {\r
+ if ((getFirstDisplayedPageNum() + pageRangeLength-1) > getLastPageNum()) {\r
+ return getLastPageNum();\r
+ } else {\r
+ return getFirstDisplayedPageNum() + pageRangeLength - 1;\r
+ }\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+ \r
+ public int getLastPageNum () {\r
+ if (hasHits()) {\r
+ return (int) Math.ceil(new Double(data.getShow().getMerged())/new Double(data.getShow().getNum()));\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+ \r
+ public List<PageLink> setPageLinks (int rangeLength) {\r
+ this.pageRangeLength = rangeLength;\r
+ return getPageLinks();\r
+ }\r
+ \r
+ public List<PageLink> getPageLinks () { \r
+ ArrayList<PageLink> range = new ArrayList<PageLink>();\r
+ if (hasHits()) {\r
+ for (int i = getFirstDisplayedPageNum(); i>0 && i<=getLastDisplayedPageNum();i++) {\r
+ range.add(new PageLink(i+"",i,this));\r
+ }\r
+ }\r
+ return range;\r
+ }\r
+\r
+ \r
+ public PageLink getPreviousPageLink (String text) { \r
+ String linkText = (text!=null && text.length()>0 ? text : "Prev");\r
+ if (hasHits() && getCurrentPageNum()>1) { \r
+ return new PageLink(linkText,getCurrentPageNum()-1,this);\r
+ } else {\r
+ return new PageLink(linkText,0,this);\r
+ }\r
+ }\r
+ \r
+ public PageLink getNextPageLink (String text) { \r
+ String linkText = (text!=null && text.length()>0 ? text : "Next");\r
+ if (hasHits() && getCurrentPageNum()<getLastPageNum()) {\r
+ return new PageLink(linkText,getCurrentPageNum()+1,this);\r
+ } else {\r
+ return new PageLink(linkText,0,this);\r
+ } \r
+ }\r
+ \r
+ public int getCurrentPage() {\r
+ return (data.getShow().getStart()/getPageSize()+1);\r
+ }\r
+ \r
+ public void goToPage(int page) { \r
+ req.getShow().setStart((page-1)*getPageSize());\r
+ }\r
+ \r
+ public void goToPreviousPage() {\r
+ if (hasPreviousPage()) {\r
+ goToPage(getCurrentPage()-1); \r
+ } \r
+ }\r
+ \r
+ public void goToNextPage() {\r
+ if (hasNextPage()) {\r
+ goToPage(getCurrentPage()+1);\r
+ }\r
+ }\r
+ \r
+ public boolean hasPreviousPage() {\r
+ return getCurrentPage()>1;\r
+ }\r
+ \r
+ public boolean hasNextPage () {\r
+ return getCurrentPage() < getLastPageNum();\r
+ }\r
+ \r
+ public boolean hasPageAfterLastDisplayed() {\r
+ return getLastDisplayedPageNum() < getLastPageNum();\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.errors;\r
+\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.errors.ErrorHelper.ErrorCode;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2Error;\r
+\r
+\r
+public class ConfigurationError implements ErrorInterface {\r
+\r
+ private static final long serialVersionUID = -6599667223782130838L;\r
+ private String label;\r
+ private String message;\r
+ private String exception;\r
+ private ErrorHelper helper;\r
+ private ErrorCode applicationErrorCode;\r
+ \r
+ public ConfigurationError(String label, String exception, String message) {\r
+ this.label = label;\r
+ this.message = message; \r
+ this.exception = exception;\r
+ }\r
+ \r
+ public List<String> getSuggestions() {\r
+ return helper.getSuggestions(this);\r
+ }\r
+\r
+ @Override\r
+ public String getLabel() {\r
+ return label;\r
+ }\r
+\r
+ @Override\r
+ public String getMessage() {\r
+ return message;\r
+ }\r
+ \r
+ @Override\r
+ public String getException() {\r
+ return exception;\r
+ }\r
+ \r
+ @Override\r
+ public void setErrorHelper (ErrorHelper helper) {\r
+ this.helper = helper;\r
+ }\r
+\r
+ @Override\r
+ public void setApplicationErrorCode(ErrorCode code) {\r
+ this.applicationErrorCode = code;\r
+ }\r
+\r
+ @Override\r
+ public ErrorCode getApplicationErrorCode() {\r
+ return applicationErrorCode;\r
+ }\r
+ \r
+ public boolean hasPazpar2Error () {\r
+ return false;\r
+ }\r
+ \r
+ public Pazpar2Error getPazpar2Error() {\r
+ return null;\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.errors;\r
+\r
+public class ConfigurationException extends Exception {\r
+\r
+ private static final long serialVersionUID = -2406313397798065423L;\r
+\r
+ public ConfigurationException() {\r
+ // TODO Auto-generated constructor stub\r
+ }\r
+\r
+ public ConfigurationException(String message) {\r
+ super(message);\r
+ // TODO Auto-generated constructor stub\r
+ }\r
+\r
+ public ConfigurationException(Throwable cause) {\r
+ super(cause);\r
+ // TODO Auto-generated constructor stub\r
+ }\r
+\r
+ public ConfigurationException(String message, Throwable cause) {\r
+ super(message, cause);\r
+ // TODO Auto-generated constructor stub\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.errors;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.inject.Inject;\r
+import javax.inject.Named;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2Responses;\r
+\r
+@Named("errors") @SessionScoped\r
+public class ErrorCentral implements Serializable {\r
+\r
+ private static final long serialVersionUID = -1658192041068396628L;\r
+ private static Logger logger = Logger.getLogger(ErrorCentral.class); \r
+ private ErrorHelper errorHelper = null;\r
+ \r
+ @Inject Pazpar2Responses pzresp;\r
+ @Inject ConfigurationReader configurator;\r
+ \r
+ private List<ErrorInterface> configurationErrors = new ArrayList<ErrorInterface>();\r
+\r
+ public ErrorCentral() {}\r
+ \r
+ @PostConstruct \r
+ public void postConstruct() {\r
+ errorHelper = new ErrorHelper(configurator);\r
+ pzresp.setErrorHelper(errorHelper); \r
+ }\r
+ \r
+ public void addConfigurationError (ErrorInterface configError) {\r
+ configError.setErrorHelper(errorHelper);\r
+ configurationErrors.add(configError);\r
+ }\r
+ \r
+ public boolean hasConfigurationErrors () {\r
+ return (configurationErrors.size()>0); \r
+ }\r
+\r
+ public boolean hasCommandErrors () {\r
+ return pzresp.hasApplicationError();\r
+ }\r
+ \r
+ public ErrorInterface getCommandError () {\r
+ return pzresp.getCommandError();\r
+ }\r
+\r
+ /**\r
+ * Returns true if application error found in any response data objects \r
+ */\r
+ public boolean hasErrors () {\r
+ logger.debug("Checking for configuration errors or command errors.");\r
+ return hasConfigurationErrors() || hasCommandErrors();\r
+ }\r
+ \r
+ public List<ErrorInterface> getConfigurationErrors() { \r
+ return configurationErrors;\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.errors;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+public class ErrorHelper implements Serializable {\r
+\r
+ public enum ErrorCode {PAZPAR2_404, \r
+ PAZPAR2_UNEXPECTED_RESPONSE,\r
+ PAZPAR2_ERRORS,\r
+ LOCAL_SERVICE_DEF_FILE_NOT_FOUND,\r
+ REMOTE_SERVICE_DEF_NOT_FOUND,\r
+ LOCAL_SETTINGS_FILE_NOT_FOUND,\r
+ MASTERKEY_CONFIG_FILE_NOT_FOUND,\r
+ MISSING_MANDATORY_PROPERTY,\r
+ MISSING_MK2_CONFIG_INIT_PARAMETER,\r
+ MISSING_CONTEXT_PARAMETER,\r
+ NOT_RESOLVED,\r
+ SKIP_SUGGESTIONS};\r
+\r
+ private static final long serialVersionUID = 2860804561068279131L;\r
+ private static Pattern httpResponsePattern = Pattern.compile("Unexpected HTTP response code \\(([0-9]*)\\).*");\r
+ \r
+ private static Logger logger = Logger.getLogger(ErrorHelper.class);\r
+ \r
+ private ConfigurationReader configurator = null;\r
+ \r
+ public ErrorHelper(ConfigurationReader configurator) {\r
+ this.configurator = configurator;\r
+ }\r
+ \r
+ public ErrorHelper.ErrorCode getErrorCode(ErrorInterface appError) {\r
+ String errmsg = appError.getMessage();\r
+ if (appError.hasPazpar2Error()) {\r
+ if (appError.getPazpar2Error().getMsg().contains("target settings from file")) {\r
+ return ErrorCode.LOCAL_SETTINGS_FILE_NOT_FOUND;\r
+ } else {\r
+ return ErrorCode.PAZPAR2_ERRORS;\r
+ }\r
+ } else if (errmsg.startsWith("Unexpected HTTP response")) {\r
+ Matcher m = httpResponsePattern.matcher(appError.getMessage());\r
+ if (m.matches()) {\r
+ String errorCode = m.group(1);\r
+ if (errorCode.equals("404")) {\r
+ return ErrorCode.PAZPAR2_404;\r
+ } else {\r
+ return ErrorCode.PAZPAR2_UNEXPECTED_RESPONSE;\r
+ }\r
+ } \r
+ } else if (errmsg.contains("Configuration file") & appError.getMessage().contains("properties")) {\r
+ return ErrorCode.MASTERKEY_CONFIG_FILE_NOT_FOUND; \r
+ } else if (errmsg.contains("Error reading service definition XML")) {\r
+ return ErrorCode.LOCAL_SERVICE_DEF_FILE_NOT_FOUND; \r
+ } else if (errmsg.contains("Cannot query Pazpar2 while there are configuration errors")) {\r
+ return ErrorCode.SKIP_SUGGESTIONS;\r
+ } else if (errmsg.contains("Missing mandatory parameter")) {\r
+ return ErrorCode.MISSING_MANDATORY_PROPERTY;\r
+ } else if (errmsg.contains("ConfigureByMk2Config") && errmsg.contains("Init parameter") && (errmsg.contains("missing"))) { \r
+ return ErrorCode.MISSING_MK2_CONFIG_INIT_PARAMETER;\r
+ } else if (appError.getMessage().contains("WebXmlConfigReader could not find mandatory context-param")) {\r
+ return ErrorCode.MISSING_CONTEXT_PARAMETER;\r
+ }\r
+ return ErrorCode.NOT_RESOLVED;\r
+ }\r
+ \r
+ public ArrayList<String> getSuggestions(ErrorInterface error) {\r
+ ArrayList<String> suggestions = new ArrayList<String>();\r
+ ErrorCode code = getErrorCode(error);\r
+ switch (code) {\r
+ case MISSING_MK2_CONFIG_INIT_PARAMETER:\r
+ suggestions.add("A mandatory init parameter (context-param) was not found in the deployment descriptor (web.xml)." +\r
+ " Following init parameters must be present when using the MasterKey configuration scheme (ConfigureByMk2Config):" +\r
+ " MASTERKEY_ROOT_CONFIG_DIR (i.e. '/etc/masterkey'), MASTERKEY_COMPONENT_CONFIG_DIR (i.e. '/myapp'), " +\r
+ " MASTERKEY_CONFIG_FILE_NAME (i.e. 'myapp.properties'"); \r
+ break;\r
+ case MISSING_CONTEXT_PARAMETER:\r
+ suggestions.add("A mandatory init parameter (context-param) was not found in the deployment descriptor (web.xml)." +\r
+ " Following init parameters must be present when using WebXmlConfigReader:" +\r
+ " PAZPAR2_URL, PAZPAR2_SERVICE_ID"); \r
+ break;\r
+ case MISSING_MANDATORY_PROPERTY:\r
+ suggestions.add("A mandatory configuration parameter was not found in the MK2 config properties" +\r
+ " file used. Please check the property file for the parameter given in the error message ");\r
+ addConfigurationDocumentation(suggestions);\r
+ break; \r
+ case MASTERKEY_CONFIG_FILE_NOT_FOUND: \r
+ suggestions.add("The main configuration file that is looked up using parameters" +\r
+ " in web.xml (MASTERKEY_ROOT_CONFIG_DIR,MASTERKEY_COMPONENT_CONFIG_DIR,MASTERKEY_CONFIG_FILE_NAME)" +\r
+ " could not be found. Please check the web.xml parameters and the expected file system location. "); \r
+ break;\r
+ case LOCAL_SERVICE_DEF_FILE_NOT_FOUND:\r
+ suggestions.add("The service definition file could not be loaded.");\r
+ suggestions.add("Please check the configuration and verify that the file exists");\r
+ addConfigurationDocumentation(suggestions); \r
+ break;\r
+ case REMOTE_SERVICE_DEF_NOT_FOUND:\r
+ break;\r
+ case LOCAL_SETTINGS_FILE_NOT_FOUND:\r
+ suggestions.add("A configuration using local target settings file was found, but " +\r
+ " the file itself could not be found. Please check the configuration.");\r
+ addConfigurationDocumentation(suggestions);\r
+ break;\r
+ case PAZPAR2_404:\r
+ suggestions.add("Pazpar2 service not found (404). ");\r
+ suggestions.add("Please check the PAZPAR2_URL configuration and verify "\r
+ + "that a pazpar2 service is running at the given address.");\r
+ addConfigurationDocumentation(suggestions); \r
+ break;\r
+ case PAZPAR2_UNEXPECTED_RESPONSE:\r
+ suggestions.add("Unexpected response code from Pazpar2. " + nl\r
+ + "Please check the PAZPAR2_URL configuration and verify "\r
+ + "that a pazpar2 service is running at the given address." + nl);\r
+ break; \r
+ case PAZPAR2_ERRORS:\r
+ if (error.hasPazpar2Error()) { \r
+ int pz2code = Integer.parseInt(error.getPazpar2Error().getCode());\r
+ switch (pz2code) {\r
+ case 3:\r
+ suggestions.add("The search experienced a problem with the query terms.");\r
+ break;\r
+ case 12:\r
+ suggestions.add("The Pazpar2 server does not have a service defined by the requested ID ");\r
+ suggestions.add("Please check the service ID set in the configuration and compare it with the " +\r
+ " configuration on the Pazpar2 server-side.");\r
+ addConfigurationDocumentation(suggestions); \r
+ break;\r
+ case 100:\r
+ suggestions.add("Pazpar2 Service Proxy error");\r
+ suggestions.add("A request was made to the Pazpar2 Service Proxy, but the Service Proxy reports ");\r
+ suggestions.add(" that authentication is lacking. Could be no successful authentication request was made or");\r
+ suggestions.add(" that the Service Proxy session timed out.");\r
+ break;\r
+ default:\r
+ suggestions.add("Pazpar2 error: " + error.getPazpar2Error().getMsg() + " (Pazpar2 # "+error.getPazpar2Error().getCode()+")");\r
+ }\r
+ break;\r
+ } else {\r
+ logger.error("Programming problem. An application error was categorized as a Papzar2 error yet does not have Pazpar2 error information as expected.");\r
+ }\r
+ break;\r
+ case SKIP_SUGGESTIONS:\r
+ break; \r
+ case NOT_RESOLVED:\r
+ suggestions.add("Sorry, no troubleshooting suggestions were written for this error scenario just yet.");\r
+ break; \r
+ }\r
+ return suggestions;\r
+ }\r
+ \r
+ private void addConfigurationDocumentation (ArrayList<String> suggestions) {\r
+ suggestions.add("The application was configured using the configurator " + Utils.baseObjectName(configurator));\r
+ suggestions.add("This configurator reports that following configuration was used: ");\r
+ suggestions.addAll(configurator.document());\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.errors;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.errors.ErrorHelper.ErrorCode;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2Error;\r
+\r
+\r
+public interface ErrorInterface extends Serializable {\r
+ \r
+ public String getLabel();\r
+ public String getMessage(); \r
+ public String getException();\r
+ public void setApplicationErrorCode(ErrorCode code);\r
+ public ErrorCode getApplicationErrorCode();\r
+ public List<String> getSuggestions();\r
+ public void setErrorHelper(ErrorHelper helper);\r
+ public boolean hasPazpar2Error();\r
+ public Pazpar2Error getPazpar2Error();\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+public interface CommandResponse {\r
+ public int getStatusCode();\r
+ public String getContentType();\r
+ public String getResponseString();\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.pazpar2.data.CommandError;\r
+\r
+public class CommandThread extends Thread {\r
+\r
+ private static Logger logger = Logger.getLogger(CommandThread.class);\r
+ Pazpar2Command command;\r
+ SearchClient client;\r
+ private ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
+ private StringBuilder response = new StringBuilder(""); \r
+ \r
+ public CommandThread (Pazpar2Command command, SearchClient client) {\r
+ this.command = command;\r
+ this.client = client;\r
+ }\r
+ \r
+ /**\r
+ * Runs the specified command using the specified Pazpar2 client\r
+ * Sets the Pazpar2 response as an XML response string to be retrieved by\r
+ * getResponse().\r
+ * \r
+ * In case of an exception, an error response is generated, the document\r
+ * element being the same as it would have been if successful (named after\r
+ * the command, that is). \r
+ * \r
+ */\r
+ public void run() {\r
+ \r
+ if (command.getName().equals("search")) {\r
+ client.setSearchCommand(command);\r
+ }\r
+ try {\r
+ long start = System.currentTimeMillis();\r
+ CommandResponse commandResponse = client.executeCommand(command, baos);\r
+ if (commandResponse.getStatusCode()==200) {\r
+ response.append(commandResponse.getResponseString()); \r
+ } else if (commandResponse.getStatusCode()==417) { \r
+ logger.error("Pazpar2 status code 417: " + baos.toString("UTF-8"));\r
+ response.append(CommandError.insertPazpar2ErrorXml(command.getName(), "Expectation failed (417)", commandResponse.getResponseString())); \r
+ } else {\r
+ String resp = baos.toString("UTF-8");\r
+ logger.error("Pazpar2 status code was " + commandResponse.getStatusCode() + ": " + resp);\r
+ throw new Pazpar2ErrorException(resp,commandResponse.getStatusCode(),resp,null);\r
+ } \r
+ long end = System.currentTimeMillis(); \r
+ logger.debug("Executed " + command.getName() + " in " + (end-start) + " ms." );\r
+ } catch (IOException e) {\r
+ response.append(CommandError.createErrorXml(command.getName(), "io", e.getMessage())); \r
+ logger.error(response.toString());\r
+ } catch (Pazpar2ErrorException e) {\r
+ response.append(CommandError.createErrorXml(command.getName(), "pazpar2error", e.getMessage())); \r
+ logger.error(response.toString());\r
+ } catch (Exception e) {\r
+ response.append(CommandError.createErrorXml(command.getName(), "general", e.getMessage())); \r
+ logger.error(response.toString()); \r
+ }\r
+ }\r
+ \r
+ /**\r
+ * \r
+ * @return Pazpar2 response as an XML string, possibly a generated error XML\r
+ */\r
+ public String getResponse () {\r
+ return response.toString();\r
+ }\r
+ \r
+ public Pazpar2Command getCommand() {\r
+ return command;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.StringTokenizer;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.enterprise.inject.Alternative;\r
+import javax.inject.Inject;\r
+import javax.inject.Named;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.controls.ResultsPager;\r
+import com.indexdata.mkjsf.errors.ConfigurationError;\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.errors.ErrorCentral;\r
+import com.indexdata.mkjsf.errors.ErrorHelper;\r
+import com.indexdata.mkjsf.pazpar2.commands.CommandParameter;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseParser;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2Responses;\r
+import com.indexdata.mkjsf.pazpar2.data.RecordResponse;\r
+import com.indexdata.mkjsf.pazpar2.state.StateListener;\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+@Named("pz2") @SessionScoped @Alternative\r
+public class Pz2Bean implements Pz2Interface, StateListener, Serializable {\r
+\r
+ private static final long serialVersionUID = 3440277287081557861L;\r
+ private static Logger logger = Logger.getLogger(Pz2Bean.class);\r
+ private static Logger responseLogger = Logger.getLogger("com.indexdata.mkjsf.pazpar2.responses");\r
+ \r
+ protected SearchClient searchClient = null;\r
+ \r
+ @Inject ConfigurationReader configurator;\r
+ @Inject StateManager stateMgr;\r
+ @Inject Pazpar2Commands pzreq;\r
+ @Inject Pazpar2Responses pzresp;\r
+ @Inject ErrorCentral errors;\r
+ \r
+ protected ResultsPager pager = null; \r
+\r
+ \r
+ protected ErrorHelper errorHelper = null;\r
+ \r
+ public Pz2Bean () {\r
+ logger.info("Instantiating pz2 bean [" + Utils.objectId(this) + "]"); \r
+ }\r
+ \r
+ @PostConstruct\r
+ public void postConstruct() { \r
+ logger.debug("in start of Pz2Bean post-construct configurator is " + configurator);\r
+ logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");\r
+ searchClient = new Pz2Client();\r
+ logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" \r
+ + Utils.objectId(configurator) + "]" ); \r
+ configureClient(searchClient,configurator); \r
+ stateMgr.addStateListener(this); \r
+ } \r
+ \r
+ public void configureClient(SearchClient searchClient, ConfigurationReader configReader) {\r
+ logger.debug(Utils.objectId(this) + " will configure search client for the session");\r
+ try {\r
+ searchClient.configure(configReader); \r
+ } catch (ConfigurationException e) {\r
+ logger.debug("Pz2Bean adding configuration error");\r
+ errors.addConfigurationError(new ConfigurationError("Search Client","Configuration",e.getMessage())); \r
+ } \r
+ logger.info(configReader.document());\r
+ pzresp.reset(); \r
+ }\r
+\r
+ \r
+ public void doSearch(String query) {\r
+ pzreq.getSearch().setParameter(new CommandParameter("query","=",query)); \r
+ doSearch();\r
+ }\r
+\r
+ public void doSearch() { \r
+ stateMgr.hasPendingStateChange("search",false);\r
+ pzresp.reset();\r
+ // resets some record and show command parameters without \r
+ // changing state or creating state change feedback\r
+ pzreq.getRecord().removeParametersInState(); \r
+ pzreq.getShow().setParameterInState(new CommandParameter("start","=",0)); \r
+ logger.debug(Utils.objectId(this) + " is searching using "+pzreq.getCommand("search").getUrlEncodedParameterValue("query"));\r
+ doCommand("search"); \r
+ }\r
+ \r
+ /**\r
+ * Refreshes 'show', 'stat', 'termlist', and 'bytarget' data object from pazpar2\r
+ * \r
+ * @return Number of activeclients at the time of the 'show' command.\r
+ */\r
+ public String update () {\r
+ logger.debug("Updating show,stat,termlist,bytarget from pazpar2");\r
+ return update("show,stat,termlist,bytarget");\r
+ }\r
+ \r
+ /**\r
+ * Refreshes the data objects listed in 'commands' from pazpar2\r
+ * \r
+ * @param commands\r
+ * @return Number of activeclients at the time of the 'show' command\r
+ */\r
+ public String update (String commands) {\r
+ if (! errors.hasConfigurationErrors()) {\r
+ if (commandsAreValid(commands)) {\r
+ if (hasQuery()) {\r
+ handleQueryStateChanges(commands);\r
+ logger.debug("Processing request for " + commands); \r
+ List<CommandThread> threadList = new ArrayList<CommandThread>();\r
+ StringTokenizer tokens = new StringTokenizer(commands,",");\r
+ while (tokens.hasMoreElements()) { \r
+ threadList.add(new CommandThread(pzreq.getCommand(tokens.nextToken()),searchClient)); \r
+ }\r
+ for (CommandThread thread : threadList) {\r
+ thread.start();\r
+ }\r
+ for (CommandThread thread : threadList) {\r
+ try {\r
+ thread.join();\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ for (CommandThread thread : threadList) {\r
+ String commandName = thread.getCommand().getName();\r
+ String response = thread.getResponse();\r
+ responseLogger.debug("Response was: " + response);\r
+ Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response);\r
+ pzresp.put(commandName, responseObject); \r
+ }\r
+ if (commands.equals("record")) {\r
+ logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients());\r
+ return pzresp.getRecord().getActiveClients();\r
+ } else {\r
+ return pzresp.getActiveClients();\r
+ } \r
+ } else {\r
+ logger.debug("Skipped requests for " + commands + " as there's not yet a query."); \r
+ pzresp.reset();\r
+ return "0";\r
+ }\r
+ } else {\r
+ logger.error("Did not attemt to run command(s) due to a validation error.");\r
+ return "0";\r
+ }\r
+ } else { \r
+ logger.error("Did not attempt to execute query since there are configuration errors.");\r
+ return "0";\r
+ }\r
+ \r
+ }\r
+ \r
+ public boolean commandsAreValid(String commands) {\r
+ if (commands.equals("record")) {\r
+ if (!pzreq.getCommand("record").hasParameterSet("id")) {\r
+ logger.error("Attempt to send record command without the id parameter");\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ public String toggleRecord (String recId) {\r
+ if (hasRecord(recId)) {\r
+ pzreq.getRecord().removeParameters(); \r
+ pzresp.put("record", new RecordResponse());\r
+ return "";\r
+ } else {\r
+ pzreq.getRecord().setId(recId);\r
+ return doCommand("record");\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public boolean hasRecord (String recId) {\r
+ return pzreq.getCommand("record").hasParameters() && pzresp.getRecord().getRecId().equals(recId);\r
+ }\r
+ \r
+ public String getCurrentStateKey () { \r
+ return stateMgr.getCurrentState().getKey();\r
+ }\r
+ \r
+ public void setCurrentStateKey(String key) { \r
+ stateMgr.setCurrentStateKey(key);\r
+ }\r
+ \r
+ \r
+ \r
+ protected boolean hasQuery() { \r
+ return pzreq.getCommand("search").hasParameterSet("query"); \r
+ }\r
+ \r
+ \r
+ public ResultsPager getPager () {\r
+ if (pager == null) {\r
+ pager = new ResultsPager(pzresp); \r
+ } \r
+ return pager; \r
+ }\r
+ \r
+ public ResultsPager setPager (int pageRange) {\r
+ pager = new ResultsPager(pzresp,pageRange,pzreq);\r
+ return pager;\r
+ }\r
+ \r
+ protected void handleQueryStateChanges (String commands) {\r
+ if (stateMgr.hasPendingStateChange("search") && hasQuery()) { \r
+ logger.debug("Found pending search change. Doing search before updating " + commands); \r
+ doSearch();\r
+ } \r
+ if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) { \r
+ logger.debug("Found pending record ID change. Doing record before updating " + commands);\r
+ stateMgr.hasPendingStateChange("record",false);\r
+ if (pzreq.getCommand("record").hasParameterSet("id")) {\r
+ update("record");\r
+ } else { \r
+ pzresp.put("record", new RecordResponse());\r
+ }\r
+ }\r
+ }\r
+ \r
+ protected String doCommand(String commandName) { \r
+ logger.debug(pzreq.getCommand(commandName).getEncodedQueryString() + ": Results for "+ pzreq.getCommand("search").getEncodedQueryString());\r
+ return update(commandName);\r
+ }\r
+ \r
+ @Override\r
+ public void stateUpdated(String commandName) {\r
+ logger.debug("State change reported for [" + commandName + "]");\r
+ if (commandName.equals("show")) {\r
+ logger.debug("Updating show");\r
+ update(commandName);\r
+ } \r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
+import com.indexdata.masterkey.config.ModuleConfigurationGetter;\r
+import com.indexdata.masterkey.pazpar2.client.ClientCommand;\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2Client;\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientConfiguration;\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientGeneric;\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
+import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.masterkey.pazpar2.client.exceptions.ProxyErrorException;\r
+import com.indexdata.mkjsf.config.Configuration;\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+public class Pz2Client implements SearchClient {\r
+\r
+ private static final long serialVersionUID = 5414266730169982028L;\r
+ private static Logger logger = Logger.getLogger(Pz2Client.class);\r
+ private Pazpar2Client client = null;\r
+ private Pazpar2ClientConfiguration cfg = null;\r
+ public static final String MODULENAME = "pz2client";\r
+ public static Map<String,String> DEFAULTS = new HashMap<String,String>();\r
+ Configuration config = null;\r
+ \r
+ static { \r
+ DEFAULTS.put("PROXY_MODE","1");\r
+ DEFAULTS.put("SERIALIZE_REQUESTS", "false");\r
+ DEFAULTS.put("STREAMBUFF_SIZE", "4096");\r
+ DEFAULTS.put("PARSE_RESPONSES", "true"); \r
+ }\r
+ \r
+ public Pz2Client() {}\r
+ \r
+ @Override\r
+ public void configure(ConfigurationReader configReader) throws ConfigurationException { \r
+ logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader));\r
+ try {\r
+ config = configReader.getConfiguration(this);\r
+ cfg = new Pazpar2ClientConfiguration(new ConfigurationGetter(config));\r
+ } catch (ProxyErrorException pe) {\r
+ logger.error("Could not configure Pazpar2 client: " + pe.getMessage());\r
+ throw new ConfigurationException("Could not configure Pz2Client: "+ pe.getMessage(),pe);\r
+ } \r
+ if (cfg != null) {\r
+ try {\r
+ client = new Pazpar2ClientGeneric(cfg); \r
+ } catch (ProxyErrorException pe) {\r
+ logger.error("Could not configure Pazpar2 client: " + pe.getMessage());\r
+ throw new ConfigurationException("Could not configure Pz2Client: "+ pe.getMessage(),pe);\r
+ }\r
+ } else {\r
+ logger.error("There was a problem creating Pz2Client. Client is null after configuration.");\r
+ throw new ConfigurationException("Pazpar2Client is null after configuration");\r
+ } \r
+ }\r
+ \r
+ public boolean isAuthenticatingClient () {\r
+ return false;\r
+ }\r
+ \r
+ public boolean isAuthenticated() {\r
+ return false;\r
+ }\r
+ \r
+ public boolean authenticate() {\r
+ throw new UnsupportedOperationException("No authentication mechanism for straight pazpar2 client");\r
+ }\r
+ \r
+ @Override\r
+ public void setSearchCommand(Pazpar2Command command) {\r
+ ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
+ client.setSearchCommand(clientCommand); \r
+ }\r
+\r
+ @Override\r
+ public CommandResponse executeCommand(Pazpar2Command command, ByteArrayOutputStream baos) \r
+ throws Pazpar2ErrorException, IOException {\r
+ ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
+ Pazpar2HttpResponse pz2HttpResponse = client.executeCommand(clientCommand, baos);\r
+ return new Pz2CommandResponse(pz2HttpResponse,baos);\r
+ }\r
+\r
+ public Pz2Client cloneMe() {\r
+ logger.debug("Cloning Pz2Client");\r
+ Pz2Client clone = new Pz2Client();\r
+ clone.client = this.client;\r
+ clone.cfg = this.cfg;\r
+ return clone;\r
+ }\r
+\r
+ @Override\r
+ public Map<String, String> getDefaults() {\r
+ return DEFAULTS;\r
+ }\r
+\r
+ @Override\r
+ public String getModuleName() {\r
+ return MODULENAME;\r
+ }\r
+ \r
+ class ConfigurationGetter implements ModuleConfigurationGetter {\r
+ Configuration config = null;\r
+ ConfigurationGetter(Configuration configuration) {\r
+ config = configuration;\r
+ }\r
+ @Override\r
+ public String get(String value) {\r
+ return config.get(value);\r
+ }\r
+ @Override\r
+ public String get(String value, String defaultValue) {\r
+ return config.get(value,defaultValue);\r
+ }\r
+ @Override\r
+ public String getMandatory(String name)\r
+ throws MissingMandatoryParameterException {\r
+ return config.getMandatory(name);\r
+ }\r
+ @Override\r
+ public String getConfigFilePath() {\r
+ return config.getConfigFilePath();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public List<String> documentConfiguration() {\r
+ List<String> doc = new ArrayList<String>();\r
+ doc.add(nl+ MODULENAME + " was configured to access Pazpar2 at : " + cfg.PAZPAR2_URL); \r
+ return new ArrayList<String>();\r
+ }\r
+ \r
+ public Configuration getConfiguration () {\r
+ return config;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.UnsupportedEncodingException;\r
+\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
+\r
+public class Pz2CommandResponse implements CommandResponse {\r
+ \r
+ private Pazpar2HttpResponse pz2httpResponse = null;\r
+ private ByteArrayOutputStream content = null;\r
+ \r
+ public Pz2CommandResponse(Pazpar2HttpResponse pz2response, ByteArrayOutputStream content) {\r
+ pz2httpResponse = pz2response;\r
+ this.content = content;\r
+ }\r
+\r
+ @Override\r
+ public int getStatusCode() { \r
+ return pz2httpResponse.getStatusCode();\r
+ }\r
+\r
+ @Override\r
+ public String getContentType() {\r
+ return pz2httpResponse.getContentType();\r
+ }\r
+\r
+ @Override\r
+ public String getResponseString() {\r
+ try {\r
+ return content.toString("UTF-8");\r
+ } catch (UnsupportedEncodingException e) { \r
+ e.printStackTrace();\r
+ return null;\r
+ }\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.Serializable;\r
+\r
+import com.indexdata.mkjsf.controls.ResultsPager;\r
+\r
+public interface Pz2Interface extends Serializable {\r
+\r
+ /**\r
+ * Executes a Pazpar2 search using the given query string\r
+ * \r
+ * @param query\r
+ */\r
+ public void doSearch(String query);\r
+ \r
+ /**\r
+ * Executes a Pazpar2 search using the current query \r
+ */\r
+ public void doSearch();\r
+ \r
+ /**\r
+ * Updates display data objects by issuing the following pazpar2 commands: \r
+ * 'show', 'stat', 'termlist' and 'bytarget'.\r
+ * \r
+ * Returns a count of the remaining active clients from the most recent search.\r
+ * \r
+ * After refreshing the data from pazpar2 the UI components displaying those \r
+ * data should be re-rendered.\r
+ * \r
+ * @return count of activeclients \r
+ */\r
+ public String update();\r
+ \r
+ /**\r
+ * Updates the data objects given by a comma separated list of one or more commands - \r
+ * i.e. "show,state,termlist,bytarget".\r
+ * \r
+ * May not be useful for the UI directly. \r
+ * \r
+ * @param commands Command separated list of pazpar2 commands.\r
+ * @return count of activeclients \r
+ * \r
+ */\r
+ public String update (String commands);\r
+ \r
+ /**\r
+ * Will retrieve or remove the record with the given recid from memory.\r
+ * \r
+ * A pazpar2 'record' command will then be issued. The part of the UI \r
+ * showing record data should thus be re-rendered.\r
+ * \r
+ * @param recid\r
+ * @return\r
+ */\r
+ public String toggleRecord(String recid);\r
+ \r
+ /**\r
+ * Resolves whether the backend has a record with the given recid in memory \r
+ * \r
+ * @return true if the bean currently holds the record with recid\r
+ */ \r
+ public boolean hasRecord (String recId);\r
+ \r
+ \r
+ /**\r
+ * Initiates a pager object, a component holding the data to draw a sequence\r
+ * of page numbers to navigate by and mechanisms to navigate with\r
+ * \r
+ * @param pageRange number of pages to display in the pager\r
+ * @return ResultsPager the initiated pager component\r
+ */\r
+ public ResultsPager setPager(int pageRange);\r
+ \r
+ /**\r
+ * Gives a component for drawing a pager to navigate by.\r
+ * @return ResultsPager pager component\r
+ */\r
+ public ResultsPager getPager();\r
+ \r
+ /**\r
+ * Returns the current hash key used, as used for internal session state tracking\r
+ * and potentially for browser history entries as well\r
+ * \r
+ * A UI author would not normally be concerned with retrieving this. It's used by the\r
+ * framework internally\r
+ * \r
+ * @return string that can be used for browsers window.location.hash\r
+ */\r
+ public String getCurrentStateKey ();\r
+ \r
+ /**\r
+ * Sets the current state key, i.e. when user clicks back or forward in browser history.\r
+ * Would normally be automatically handled by the frameworks components.\r
+ * \r
+ * @param key corresponding to browsers hash string\r
+ */\r
+ public void setCurrentStateKey(String key);\r
+ \r
+\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.IOException;\r
+import java.io.UnsupportedEncodingException;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.enterprise.inject.Alternative;\r
+import javax.inject.Inject;\r
+import javax.inject.Named;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.pazpar2.sp.ServiceProxyClient;\r
+import com.indexdata.mkjsf.pazpar2.sp.ServiceProxyInterface;\r
+import com.indexdata.mkjsf.pazpar2.sp.auth.ServiceProxyUser;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+@Named("pz2") @SessionScoped @Alternative\r
+public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface {\r
+ \r
+ private static final long serialVersionUID = 4221824985678758225L;\r
+ private static Logger logger = Logger.getLogger(Pz2ProxyBean.class); \r
+ private String initDocFileName = "";\r
+ private String initDocResponse = "";\r
+ private String serviceProxyUrl = ""; \r
+ \r
+ @Inject ConfigurationReader configurator;\r
+ @Inject ServiceProxyUser user; \r
+ \r
+ public Pz2ProxyBean() {\r
+ }\r
+ \r
+ @PostConstruct\r
+ public void postConstruct() {\r
+ if (searchClient == null) {\r
+ logger.debug(Utils.objectId(this) + " will instantiate a ServiceProxyClient next."); \r
+ searchClient = new ServiceProxyClient();\r
+ logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" \r
+ + Utils.objectId(configurator) + "]" ); \r
+ configureClient(searchClient,configurator);\r
+ stateMgr.addStateListener(this);\r
+ } else {\r
+ logger.debug("Pz2ProxyBean:postConstruct: searchClient already instantiated " +\r
+ "during construction of parent object Pz2Bean.");\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public String login(String navigateTo) {\r
+ logger.info("doing login");\r
+ ((ServiceProxyClient)searchClient).authenticate(user); \r
+ pzreq.getRecord().removeParametersInState();\r
+ pzreq.getSearch().removeParametersInState();\r
+ pzresp.reset();\r
+ return navigateTo;\r
+ }\r
+\r
+ @Override\r
+ public void setServiceProxyUrl(String url) {\r
+ logger.info("Setting Service Proxy url: " + url);\r
+ serviceProxyUrl = url;\r
+ pzreq.getRecord().removeParametersInState();\r
+ pzreq.getSearch().removeParametersInState();\r
+ pzresp.reset();\r
+ }\r
+ \r
+ public String getServiceProxyUrl() {\r
+ return serviceProxyUrl;\r
+ }\r
+ \r
+ public String getInitDocPath () {\r
+ return searchClient.getConfiguration().get("INIT_DOC_PATH");\r
+ }\r
+ \r
+ @Override\r
+ public void setInitFileName(String fileName) {\r
+ this.initDocFileName = fileName;\r
+ \r
+ }\r
+\r
+ @Override\r
+ public String getInitFileName() {\r
+ return initDocFileName;\r
+ }\r
+\r
+ @Override\r
+ public String postInit() throws UnsupportedEncodingException, IOException { \r
+ String initDocPath = ((ServiceProxyClient)searchClient).getInitDocPaths()[0];\r
+ logger.info("Paths: " + ((ServiceProxyClient)searchClient).getInitDocPaths());\r
+ logger.info("Path: " + initDocPath);\r
+ pzresp.reset();\r
+ byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDocPath + getInitFileName());\r
+ initDocResponse = new String(response,"UTF-8");\r
+ return initDocResponse;\r
+ }\r
+ \r
+ @Override\r
+ public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException { \r
+ pzresp.reset();\r
+ byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDoc);\r
+ initDocResponse = new String(response,"UTF-8");\r
+ return initDocResponse;\r
+ }\r
+\r
+\r
+ @Override\r
+ public String getInitResponse() {\r
+ return initDocResponse;\r
+ }\r
+ \r
+ public void setAceFilter(String filterExpression) {\r
+ //setCommandParameter("record",new CommandParameter("acefilter","=",filterExpression));\r
+ }\r
+ \r
+ public String getAceFilter () {\r
+ return null;\r
+ // return getCommandParameterValue("record","acefilter","");\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.io.Serializable;\r
+\r
+import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.mkjsf.config.Configurable;\r
+import com.indexdata.mkjsf.config.Configuration;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+\r
+public interface SearchClient extends Configurable, Serializable {\r
+ \r
+ public void setSearchCommand(Pazpar2Command command);\r
+ public CommandResponse executeCommand(Pazpar2Command command, ByteArrayOutputStream baos) throws Pazpar2ErrorException, IOException;\r
+ \r
+ // Use cloneMe() method if injecting the client with CDI.\r
+ // The client is used for asynchronously sending off requests\r
+ // to the server AND propagation of context to threads is currently \r
+ // not supported. Trying to do so throws a WELD-001303 error. \r
+ // If propagation to threads gets supported, the cloning can go.\r
+ public SearchClient cloneMe();\r
+ \r
+ public boolean isAuthenticatingClient(); \r
+ public Configuration getConfiguration();\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class BytargetCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = 9070458716105294392L;\r
+\r
+ public BytargetCommand(StateManager stateMgr) {\r
+ super("bytarget",stateMgr);\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import java.io.Serializable;\r
+import java.io.UnsupportedEncodingException;\r
+import java.net.URLEncoder;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.CommandParameter;\r
+\r
+public class CommandParameter implements Serializable {\r
+\r
+ private static Logger logger = Logger.getLogger(CommandParameter.class);\r
+ \r
+ private static final long serialVersionUID = 625502285668766749L;\r
+ String name = null;\r
+ String operator = null;\r
+ String value = null;\r
+ Map<String,Expression> expressions = new HashMap<String,Expression>();\r
+ \r
+ public CommandParameter (String name) {\r
+ logger.debug("Instantiating command parameter '" + name + "'");\r
+ this.name = name;\r
+ }\r
+ \r
+ public CommandParameter (String name, String operator, String value, Expression... expressions) {\r
+ logger.debug("Instantiating command parameter " + name + " with expressions: [" + expressions + "]");\r
+ this.name = name;\r
+ this.operator = operator;\r
+ this.value = value;\r
+ for (Expression expr : expressions) {\r
+ this.expressions.put(expr.toString(), expr);\r
+ }\r
+ }\r
+\r
+ public CommandParameter (String name, String operator, String value) {\r
+ logger.debug("Instantiating command parameter '" + name + "' with String: [" + value + "]");\r
+ this.name = name;\r
+ this.operator = operator;\r
+ this.value = value; \r
+ }\r
+ \r
+ public CommandParameter (String name, String operator, int value) {\r
+ logger.debug("Instantiating command parameter '" + name + "' with int: [" + value + "]");\r
+ this.name = name;\r
+ this.operator = operator;\r
+ this.value = value+""; \r
+ }\r
+\r
+ \r
+ public String getName () {\r
+ return name;\r
+ }\r
+ \r
+ public Map<String,Expression> getExpressions () {\r
+ return expressions;\r
+ }\r
+ \r
+ public void addExpression(Expression expression) {\r
+ logger.debug("Adding expression [" + expression + "] to '" + name + "'");\r
+ this.expressions.put(expression.toString(),expression);\r
+ }\r
+ \r
+ public void removeExpression(Expression expression) {\r
+ this.expressions.remove(expression.toString());\r
+ }\r
+ \r
+ \r
+ public boolean hasOperator() {\r
+ return operator != null;\r
+ }\r
+ \r
+ public String getEncodedQueryString () {\r
+ try {\r
+ return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8");\r
+ } catch (UnsupportedEncodingException e) {\r
+ e.printStackTrace();\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public String getSimpleValue() { \r
+ return value; \r
+ }\r
+ \r
+ public String getValueWithExpressions () {\r
+ StringBuilder completeValue = new StringBuilder((value==null ? "" : value)); \r
+ for (String key : expressions.keySet()) { \r
+ completeValue.append(" and " + expressions.get(key));\r
+ }\r
+ return completeValue.toString();\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public boolean equals (Object otherParameter) {\r
+ return\r
+ ((otherParameter instanceof CommandParameter)\r
+ && this.getValueWithExpressions().equals(((CommandParameter) otherParameter).getValueWithExpressions()));\r
+ }\r
+ \r
+ @Override\r
+ public int hashCode () {\r
+ return getValueWithExpressions().hashCode();\r
+ }\r
+ \r
+ public String toString() {\r
+ return getValueWithExpressions();\r
+ }\r
+ \r
+ public CommandParameter copy() {\r
+ logger.debug("Copying parameter '"+ name + "' for modification");\r
+ CommandParameter newParam = new CommandParameter(name);\r
+ newParam.value = this.value;\r
+ newParam.operator = this.operator;\r
+ for (String key : expressions.keySet()) {\r
+ newParam.addExpression(expressions.get(key).copy()); \r
+ }\r
+ return newParam;\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.Expression;\r
+\r
+public class Expression {\r
+ \r
+ String leftEntity;\r
+ String operator;\r
+ String rightEntity;\r
+ public Expression (String leftEntity, String operator, String rightEntity) {\r
+ this.leftEntity = leftEntity;\r
+ this.operator = operator;\r
+ this.rightEntity = rightEntity; \r
+ }\r
+ \r
+ public Expression copy() {\r
+ return new Expression(leftEntity,operator,rightEntity);\r
+ }\r
+ \r
+ public String toString() {\r
+ return leftEntity + operator + rightEntity;\r
+ }\r
+ \r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class InitCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = -4915976465898889987L;\r
+\r
+ public InitCommand(StateManager stateMgr) {\r
+ super("init",stateMgr);\r
+ }\r
+ \r
+ public void setClear(String clear) { \r
+ setParameter(new CommandParameter("clear","=",clear));\r
+ }\r
+ \r
+ public void setService(String serviceId) { \r
+ setParameter(new CommandParameter("service","=",serviceId));\r
+ }\r
+ \r
+ @Override\r
+ public void setSession (String sessionId) {\r
+ throw new UnsupportedOperationException("Cannot set session id on init command");\r
+ }\r
+ \r
+ @Override\r
+ public String getSession () {\r
+ throw new UnsupportedOperationException("Cannot set or get session id on init command");\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import java.io.Serializable;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class Pazpar2Command implements Serializable {\r
+ \r
+ private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
+ private static final long serialVersionUID = -6825491856480675917L; \r
+ private String name = "";\r
+ protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();\r
+ \r
+ StateManager stateMgr;\r
+ \r
+ public Pazpar2Command (String name, StateManager stateMgr) {\r
+ this.name = name;\r
+ if (stateMgr == null) {\r
+ // Sets throw-away state\r
+ this.stateMgr = new StateManager();\r
+ } else {\r
+ this.stateMgr = stateMgr;\r
+ }\r
+ }\r
+ \r
+ public Pazpar2Command copy () {\r
+ Pazpar2Command newCommand = new Pazpar2Command(name,stateMgr);\r
+ for (String parameterName : parameters.keySet()) {\r
+ newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
+ } \r
+ return newCommand;\r
+ }\r
+ \r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ public void setParameter (CommandParameter parameter) {\r
+ Pazpar2Command copy = this.copy();\r
+ logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
+ copy.parameters.put(parameter.getName(),parameter);\r
+ stateMgr.checkIn(copy);\r
+ }\r
+ \r
+ public void setParameters (CommandParameter... params) {\r
+ Pazpar2Command copy = this.copy();\r
+ for (CommandParameter param : params) {\r
+ logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
+ copy.parameters.put(param.getName(),param);\r
+ }\r
+ stateMgr.checkIn(copy);\r
+ }\r
+ \r
+ public void setParametersInState (CommandParameter... params) { \r
+ for (CommandParameter param : params) {\r
+ logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
+ parameters.put(param.getName(),param);\r
+ } \r
+ }\r
+ \r
+ public void setParameterInState (CommandParameter parameter) {\r
+ logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
+ parameters.put(parameter.getName(),parameter); \r
+ }\r
+ \r
+ \r
+ public CommandParameter getParameter (String name) {\r
+ return parameters.get(name);\r
+ }\r
+ \r
+ public void removeParameter (String name) {\r
+ Pazpar2Command copy = this.copy();\r
+ copy.parameters.remove(name);\r
+ stateMgr.checkIn(copy);\r
+ }\r
+ \r
+ public void removeParameters() {\r
+ Pazpar2Command copy = this.copy();\r
+ copy.parameters = new HashMap<String,CommandParameter>();\r
+ stateMgr.checkIn(copy);\r
+ }\r
+ \r
+ public void removeParametersInState() {\r
+ parameters = new HashMap<String,CommandParameter>(); \r
+ }\r
+\r
+ \r
+ public boolean hasParameters () {\r
+ return (parameters.keySet().size()>0);\r
+ }\r
+ \r
+ public boolean hasParameterSet(String parameterName) {\r
+ return (parameters.get(parameterName) != null);\r
+ }\r
+ \r
+ public String getEncodedQueryString () {\r
+ StringBuilder queryString = new StringBuilder("command="+name);\r
+ for (CommandParameter parameter : parameters.values()) {\r
+ queryString.append("&"+parameter.getEncodedQueryString()); \r
+ }\r
+ return queryString.toString();\r
+ } \r
+ \r
+ public String getValueWithExpressions() { \r
+ StringBuilder value = new StringBuilder("");\r
+ for (CommandParameter parameter : parameters.values()) {\r
+ value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions()); \r
+ }\r
+ return value.toString();\r
+ }\r
+ \r
+ @Override\r
+ public boolean equals (Object otherCommand) {\r
+ return\r
+ ((otherCommand instanceof Pazpar2Command)\r
+ && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
+ }\r
+ \r
+ @Override\r
+ public int hashCode () {\r
+ return getValueWithExpressions().hashCode();\r
+ }\r
+ \r
+ public String toString () {\r
+ return parameters.toString();\r
+ }\r
+\r
+ public String getParameterValue(String parameterName) {\r
+ return getParameter(parameterName).getValueWithExpressions();\r
+ \r
+ }\r
+\r
+ public String getUrlEncodedParameterValue(String parameterName) {\r
+ return getParameter(parameterName).getEncodedQueryString();\r
+ }\r
+ \r
+ public void setSession (String sessionId) {\r
+ setParameter(new CommandParameter("session","=",sessionId));\r
+ }\r
+ \r
+ public String getSession() {\r
+ return getParameterValue("session");\r
+ } \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import java.io.Serializable;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.inject.Inject;\r
+import javax.inject.Named;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+@Named("pzreq") @SessionScoped\r
+public class Pazpar2Commands implements Serializable {\r
+\r
+ private static final long serialVersionUID = -5172466320351302413L;\r
+ private static Logger logger = Logger.getLogger(Pazpar2Commands.class);\r
+\r
+ public static final String INIT = "init";\r
+ public static final String PING = "ping";\r
+ public static final String SETTINGS = "settings";\r
+ public static final String SEARCH = "search";\r
+ public static final String STAT = "stat";\r
+ public static final String SHOW = "show";\r
+ public static final String RECORD = "record";\r
+ public static final String TERMLIST = "termlist";\r
+ public static final String BYTARGET = "bytarget";\r
+ \r
+ @Inject StateManager stateMgr; \r
+ \r
+ public Pazpar2Commands() {\r
+ logger.info("Initializing Pazpar2Commands [" + Utils.objectId(this) + "]");\r
+ }\r
+ \r
+ @PostConstruct\r
+ public void postConstruct() {\r
+ logger.info("in post-construct stateMgr is " + stateMgr);\r
+ }\r
+ \r
+ public InitCommand getInit() {\r
+ return (InitCommand) (stateMgr.getCommand(INIT));\r
+ }\r
+ \r
+ public PingCommand getPing() {\r
+ return (PingCommand) (stateMgr.getCommand(PING));\r
+ }\r
+ \r
+ public SettingsCommand getSettings() {\r
+ return (SettingsCommand) (stateMgr.getCommand(SETTINGS));\r
+ }\r
+\r
+ public SearchCommand getSearch() {\r
+ return (SearchCommand) (stateMgr.getCommand(SEARCH));\r
+ }\r
+ \r
+ public StatCommand getStat() {\r
+ return (StatCommand) (stateMgr.getCommand(STAT));\r
+ }\r
+ \r
+ public ShowCommand getShow() {\r
+ return (ShowCommand) (stateMgr.getCommand(SHOW));\r
+ }\r
+ \r
+ public RecordCommand getRecord() {\r
+ return (RecordCommand) (stateMgr.getCommand(RECORD));\r
+ }\r
+\r
+ public TermlistCommand getTermlist() {\r
+ return (TermlistCommand) (stateMgr.getCommand(TERMLIST));\r
+ }\r
+ \r
+ public BytargetCommand getBytarget() {\r
+ return (BytargetCommand) (stateMgr.getCommand(BYTARGET));\r
+ }\r
+ \r
+ public Pazpar2Command getCommand(String name) {\r
+ return stateMgr.getCommand(name);\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class PingCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = 8876721711326535847L;\r
+\r
+ public PingCommand(StateManager stateMgr) {\r
+ super("ping",stateMgr); \r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class RecordCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = 2817539422114569506L;\r
+\r
+ public RecordCommand(StateManager stateMgr) {\r
+ super("record",stateMgr);\r
+ }\r
+ \r
+ public void setId(String recId) {\r
+ setParameter(new CommandParameter("id","=",recId));\r
+ }\r
+ \r
+ public String getId () {\r
+ return getParameterValue("id");\r
+ } \r
+\r
+ @Override\r
+ public RecordCommand copy () {\r
+ RecordCommand newCommand = new RecordCommand(stateMgr);\r
+ for (String parameterName : parameters.keySet()) {\r
+ newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
+ } \r
+ return newCommand;\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+@SessionScoped\r
+public class SearchCommand extends Pazpar2Command {\r
+ \r
+ private static final long serialVersionUID = -1888520867838597236L;\r
+ private static Logger logger = Logger.getLogger(SearchCommand.class);\r
+ private SingleTargetFilter singleTargetFilter = null;\r
+ \r
+ public SearchCommand(StateManager stateMgr) {\r
+ super("search",stateMgr);\r
+ }\r
+ \r
+ public void setQuery(String query) { \r
+ setParameter(new CommandParameter("query","=",query));\r
+ }\r
+ \r
+ public String getQuery () { \r
+ return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions();\r
+ }\r
+ \r
+ public void setFilter(String filterExpression) {\r
+ setParameter(new CommandParameter("filter","=",filterExpression));\r
+ }\r
+ \r
+ public String getFilter() {\r
+ return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
+ }\r
+ \r
+ public void addFilter(String filterExpression) {\r
+ // TODO: implement\r
+ if (hasParameterSet("filter")) {\r
+ setFilter(filterExpression);\r
+ } else {\r
+ getParameter("filter");\r
+ }\r
+ throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
+ }\r
+ \r
+ public void removeFilters () {\r
+ removeParameter("filter");\r
+ }\r
+ \r
+ public void removeFilter(String filterExpression) {\r
+ // TODO: implement\r
+ throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
+ }\r
+\r
+ public boolean hasFilter () {\r
+ return getFilter().length()>0;\r
+ }\r
+ \r
+ public void setLimit (String limitExpression) {\r
+ setParameter(new CommandParameter("limit","=",limitExpression));\r
+ }\r
+ \r
+ public String getLimit () {\r
+ return getParameterValue("limit");\r
+ }\r
+ \r
+ public void setStartrecs (String startrecs) {\r
+ setParameter(new CommandParameter("startrecs","=",startrecs));\r
+ }\r
+ \r
+ public String getStartrecs () {\r
+ return getParameterValue("startrecs");\r
+ }\r
+ \r
+ public void setMaxrecs (String maxrecs) {\r
+ setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
+ }\r
+ \r
+ public String getMaxrecs () {\r
+ return getParameterValue("maxrecs");\r
+ }\r
+ \r
+ public void setSort () {\r
+ setParameter(new CommandParameter("sort","=","sort"));\r
+ }\r
+ \r
+ public String getSort () {\r
+ return getParameterValue("sort");\r
+ }\r
+ \r
+ /**\r
+ * Sets a facet, in CQL, to restrict the current results,\r
+ * then executes the search \r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void setFacet(String facetKey, String term) {\r
+ if (term != null && term.length()>0) { \r
+ getParameter("query").addExpression(new Expression(facetKey,"=",term)); \r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Sets a facet to limit the current query by. The \r
+ * facet is appended to the query string itself (rather\r
+ * as a separately managed entity. It will thus appear\r
+ * in a query field as retrieved by getQuery(). It will\r
+ * not be removed by removeFacet(...)\r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void setFacetOnQuery (String facetKey, String term) {\r
+ String facetExpression = facetKey + "=" + term; \r
+ if (term != null && term.length()>0) {\r
+ String currentQuery= getParameterValue("query");\r
+ setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression)); \r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Removes a facet set by setFacet(...), then executes\r
+ * the search.\r
+ * \r
+ * Will not remove facets set by setFacetOnQuery(...)\r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void removeFacet(String facetKey, String term) {\r
+ if (getParameter("query") != null) {\r
+ getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
+ }\r
+ }\r
+ \r
+ \r
+ /**\r
+ * Adds a single target filter to restrict the current query by, \r
+ * then executes the current search.\r
+ * \r
+ * This is a special case of the general setFilter function, \r
+ * allowing to associate a descriptive target name with the \r
+ * filter expression for display in UI. \r
+ * \r
+ * @param targetId pazpar2's ID for the target to limit by\r
+ * @param targetName a descriptive name for the target\r
+ */\r
+ public void setSingleTargetFilter (String targetId, String targetName) { \r
+ if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
+ logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
+ } else { \r
+ this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
+ setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression())); \r
+ } \r
+ }\r
+\r
+ public SingleTargetFilter getSingleTargetFilter () {\r
+ logger.debug("request to get the current single target filter");\r
+ return singleTargetFilter;\r
+ }\r
+ \r
+ /**\r
+ * Removes the current target filter from the search\r
+ * \r
+ */\r
+ public void removeSingleTargetFilter () {\r
+ logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
+ this.singleTargetFilter = null;\r
+ removeParameter("filter"); \r
+ }\r
+ \r
+ /**\r
+ * \r
+ * @return The target filter set on the current search command\r
+ */\r
+ public boolean hasSingleTargetFilter() {\r
+ logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
+ return singleTargetFilter != null; \r
+ }\r
+\r
+ /**\r
+ * Resolves if the current search command has a target filter - to\r
+ * be used by the UI for conditional rendering of target filter info.\r
+ * \r
+ * @return true if the current search command is limited by a target \r
+ * filter\r
+ */\r
+ protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
+ return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
+ }\r
+ \r
+ public SearchCommand copy () {\r
+ SearchCommand newCommand = new SearchCommand(stateMgr);\r
+ for (String parameterName : parameters.keySet()) {\r
+ newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
+ }\r
+ newCommand.singleTargetFilter = this.singleTargetFilter;\r
+ return newCommand;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class SettingsCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = 2291179325470387102L;\r
+\r
+ public SettingsCommand(StateManager stateMgr) {\r
+ super("settings",stateMgr);\r
+ // TODO Auto-generated constructor stub\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class ShowCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = -8242768313266051307L;\r
+\r
+ public ShowCommand(StateManager stateMgr) {\r
+ super("show",stateMgr);\r
+ setParameterInState(new CommandParameter("start","=","0"));\r
+ }\r
+\r
+ /**\r
+ * Sets the sort order for results, the updates the 'show' data object\r
+ * from pazpar2. Set valid sort options in the documentation for pazpar2.\r
+ * \r
+ * The parts of the UI that display 'show' data should be rendered following\r
+ * this request.\r
+ * \r
+ * @param sortOption\r
+ */\r
+ public void setSort (String sort) {\r
+ setParameter(new CommandParameter("sort","=",sort));\r
+ }\r
+ \r
+ /**\r
+ * Retrieves the current sort order for results\r
+ * @return sort order - i.e. 'relevance'\r
+ */\r
+ public String getSort () {\r
+ return getParameter("sort") != null ? getParameter("sort").value : "relevance";\r
+ }\r
+ \r
+ /**\r
+ * Sets the number of records that pazpar2 should show at a time. Is \r
+ * followed by an update of the show data object from pazpar2. \r
+ * \r
+ * To be used by the UI for paging. After setting page size the parts\r
+ * of the UI that displays 'show' data should be rendered. \r
+ * \r
+ * @param perPageOption i.e. 10, default is 20.\r
+ */\r
+ public void setPageSize (String perPageOption) { \r
+ setParameters(new CommandParameter("num","=",perPageOption),\r
+ new CommandParameter("start","=",0));\r
+ }\r
+ \r
+ /**\r
+ * Retrieves the currently defined number of items to show at a time\r
+ * \r
+ * @return number of result records that will be shown from pazpar2\r
+ */\r
+ public String getPageSize () {\r
+ return getParameter("num") != null ? getParameter("num").value : "20";\r
+ }\r
+ \r
+ /**\r
+ * Sets the first record to show - starting at record '0'. After setting\r
+ * first record number, the 'show' data object will be updated from pazpar2,\r
+ * and the parts of the UI displaying show data should be re-rendered.\r
+ * \r
+ * To be used by the UI for paging.\r
+ * \r
+ * @param start first record to show\r
+ */\r
+ public void setStart (int start) { \r
+ setParameter(new CommandParameter("start","=",start)); \r
+ }\r
+ \r
+ /**\r
+ * Retrieves the sequence number of the record that pazpaz2 will return as\r
+ * the first record in 'show'\r
+ * \r
+ * @return sequence number of the first record to be shown (numbering starting at '0')\r
+ * \r
+ */\r
+ public int getStart() {\r
+ return getParameter("start") != null ? Integer.parseInt(getParameter("start").value) : 0;\r
+ }\r
+ \r
+ public void setNum (int num) {\r
+ setParameter(new CommandParameter("num","=",num));\r
+ }\r
+ \r
+ public int getNum () {\r
+ return getParameter("num") != null ? Integer.parseInt(getParameter("num").value) : 0;\r
+ }\r
+ \r
+ public ShowCommand copy () {\r
+ ShowCommand newCommand = new ShowCommand(stateMgr);\r
+ for (String parameterName : parameters.keySet()) {\r
+ newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
+ } \r
+ return newCommand;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import java.io.Serializable;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.SingleTargetFilter;\r
+\r
+public class SingleTargetFilter implements Serializable {\r
+\r
+ private static final long serialVersionUID = 2389085467202526537L;\r
+\r
+ private String targetName;\r
+ private String targetId;\r
+ \r
+ public SingleTargetFilter (String targetId, String targetName) {\r
+ this.targetId = targetId;\r
+ this.targetName = targetName;\r
+ }\r
+ \r
+ public String getTargetName () {\r
+ return targetName;\r
+ }\r
+ \r
+ public String getTargetId () {\r
+ return targetId; \r
+ }\r
+ \r
+ public String getFilterExpression () {\r
+ return "pz:id="+targetId;\r
+ }\r
+ \r
+ @Override\r
+ public boolean equals(Object o) {\r
+ if (o instanceof SingleTargetFilter) {\r
+ return targetName.equals(((SingleTargetFilter) o).getTargetName()) && \r
+ targetId.equals(((SingleTargetFilter) o).getTargetId());\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public int hashCode () {\r
+ return (targetId+targetName).hashCode();\r
+ }\r
+ \r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class StatCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = 3980630346114157336L;\r
+\r
+ public StatCommand(StateManager stateMgr) {\r
+ super("stat",stateMgr);\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.commands;\r
+\r
+import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+\r
+public class TermlistCommand extends Pazpar2Command {\r
+\r
+ private static final long serialVersionUID = -7067878552863021727L;\r
+\r
+ public TermlistCommand(StateManager stateMgr) {\r
+ super("termlist",stateMgr);\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+import com.indexdata.mkjsf.pazpar2.data.Target;\r
+\r
+public class ByTarget extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = 3960644950805644518L;\r
+ \r
+ public List<Target> getTargets() {\r
+ List<Target> targets = new ArrayList<Target>();\r
+ if (getElements("target") != null) {\r
+ for (Pazpar2ResponseData element : getElements("target")) {\r
+ targets.add((Target)element);\r
+ }\r
+ }\r
+ return targets;\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.regex.Pattern;\r
+\r
+import com.indexdata.mkjsf.errors.ErrorHelper;\r
+import com.indexdata.mkjsf.errors.ErrorInterface;\r
+import com.indexdata.mkjsf.errors.ErrorHelper.ErrorCode;\r
+import com.indexdata.utils.XmlUtils;\r
+\r
+/**\r
+ * Holds an error encountered during the execution of a command.\r
+ * \r
+ * An error can be received by a command thread as an exception message \r
+ * or as an error XML. In both cases the error (string or xml) will be embedded\r
+ * in a new 'applicationerror' element which in turn will be embedded in a\r
+ * command XML (i.e. a 'search' or a 'show' response XML) \r
+ * \r
+ * The command response XML is subsequently parsed by Pazpar2ResponseParser, \r
+ * which will then create the CommandError object.\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public class CommandError extends Pazpar2ResponseData implements ErrorInterface {\r
+\r
+ private static final long serialVersionUID = 8878776025779714122L;\r
+ private static Pattern xmlDeclaration = Pattern.compile("<\\?xml.*\\?>");\r
+ private ErrorCode applicationErrorCode;\r
+ private ErrorHelper errorHelper = null;\r
+ \r
+ \r
+ public CommandError () { \r
+ }\r
+ \r
+ public String getLabel() {\r
+ return getOneElementValue("commandname");\r
+ }\r
+ \r
+ public String getMessage() {\r
+ if (hasPazpar2Error()) { \r
+ return getPazpar2Error().getMsg();\r
+ } else { \r
+ return getOneElementValue("errormessage");\r
+ }\r
+ }\r
+ \r
+ public String getException () {\r
+ return getOneElementValue("exception");\r
+ }\r
+ \r
+ public List<String> getSuggestions() { \r
+ if (errorHelper!=null) {\r
+ return errorHelper.getSuggestions(this);\r
+ } else {\r
+ List<String> nohelper = new ArrayList<String>();\r
+ nohelper.add("Tips: could not generate tips due to a programming error, error helper was not set");\r
+ return nohelper;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Creates an XML string error message, embedded in an XML string document named by the command\r
+ * This is the XML that Pazpar2ResponseParser will turn into a CommandError object. \r
+ * @param commandName\r
+ * @param exceptionName\r
+ * @param errorMessage\r
+ * @return\r
+ */\r
+ public static String createErrorXml (String commandName, String exceptionName, String errorMessage) {\r
+ StringBuilder errorXml = new StringBuilder("");\r
+ errorXml.append("<" + commandName + ">"+nl);\r
+ errorXml.append(" <applicationerror>"+nl);\r
+ errorXml.append(" <commandname>" + commandName + "</commandname>"+nl);\r
+ errorXml.append(" <exception>" + XmlUtils.escape(exceptionName) + "</exception>"+nl); \r
+ errorXml.append(" <errormessage>" + XmlUtils.escape(errorMessage) + "</errormessage>"+nl); \r
+ errorXml.append(" </applicationerror>"+nl);\r
+ errorXml.append("</" + commandName + ">"+nl);\r
+ return errorXml.toString(); \r
+ }\r
+ \r
+ /**\r
+ * Embeds a Pazpar2 (or Pazpar2 client) error response document as a child element of\r
+ * a command response document (like 'search' or 'show').\r
+ * This is the XML that Pazpar2ResponseParser will turn into a CommandError object.\r
+ * \r
+ * \r
+ * @param commandName The name of the command during which's execution the error was encountered\r
+ * @param exceptionName The (possibly loosely defined) name of the exception that was thrown\r
+ * @param pazpar2ErrorXml The error document as created by Pazpar2, or the Service Proxy or \r
+ * by the Pazpar2 client itself. \r
+ * @return\r
+ */\r
+ public static String insertPazpar2ErrorXml (String commandName, String exceptionName, String pazpar2ErrorXml) {\r
+ StringBuilder errorXml = new StringBuilder("");\r
+ errorXml.append("<" + commandName + ">"+nl);\r
+ errorXml.append(" <applicationerror>"+nl);\r
+ errorXml.append(" <commandname>" + commandName + "</commandname>"+nl);\r
+ errorXml.append(" <exception>" + XmlUtils.escape(exceptionName) + "</exception>"+nl); \r
+ errorXml.append(xmlDeclaration.matcher(pazpar2ErrorXml).replaceAll("")+nl); \r
+ errorXml.append(" </applicationerror>"+nl);\r
+ errorXml.append("</" + commandName + ">"+nl);\r
+ return errorXml.toString(); \r
+ \r
+ }\r
+ \r
+ /**\r
+ * Sets the object that should be used to analyze the error\r
+ * \r
+ */\r
+ public void setErrorHelper (ErrorHelper errorHelper) {\r
+ this.errorHelper = errorHelper; \r
+ }\r
+\r
+ @Override\r
+ public void setApplicationErrorCode(ErrorCode code) {\r
+ this.applicationErrorCode = code; \r
+ }\r
+\r
+ @Override\r
+ public ErrorCode getApplicationErrorCode() {\r
+ return applicationErrorCode; \r
+ }\r
+ \r
+ public boolean hasPazpar2Error () {\r
+ return ( getOneElement("error") != null); \r
+ }\r
+ \r
+ public Pazpar2Error getPazpar2Error() {\r
+ return (Pazpar2Error) getOneElement("error");\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Location;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class Hit extends Pazpar2ResponseData {\r
+\r
+ \r
+ private static final long serialVersionUID = 9039281987691623220L;\r
+\r
+ public List<Location> getLocations() {\r
+ List<Location> locations = new ArrayList<Location>();\r
+ for (Pazpar2ResponseData element : getElements("location")) {\r
+ locations.add((Location)element);\r
+ }\r
+ return locations;\r
+ }\r
+ \r
+ public String getTitle () {\r
+ return getOneElementValue("md-title");\r
+ }\r
+ \r
+ public String getTitleRemainder() {\r
+ return getOneElementValue("md-title-remainder");\r
+ }\r
+ \r
+ public String getAuthor (String prefix) {\r
+ return getOneElement("md-author") != null ? prefix + getOneElement("md-author").getValue() : "";\r
+ }\r
+ \r
+ public String getAuthor () {\r
+ return getOneElementValue("md-author");\r
+ }\r
+ \r
+ public String getTitleResponsibility() {\r
+ return getOneElementValue("md-title-responsibility");\r
+ }\r
+ \r
+ public String getRecId() {\r
+ return getOneElementValue("recid");\r
+ }\r
+\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+\r
+public class Location extends Pazpar2ResponseData {\r
+ \r
+ private static final long serialVersionUID = -1386527442857478225L;\r
+\r
+ public String getId() {\r
+ return getAttribute("id");\r
+ }\r
+ \r
+ public String getName () {\r
+ return getAttribute("name");\r
+ }\r
+ \r
+ public String getSubject() {\r
+ return getOneElementValue("md-subject");\r
+ }\r
+ \r
+ public String getSubjects() {\r
+ StringBuilder builder = new StringBuilder("");\r
+ for (Pazpar2ResponseData data : getElements("md-subject")) {\r
+ if (builder.length()==0) {\r
+ builder.append(data.getValue());\r
+ } else {\r
+ builder.append(", ");\r
+ builder.append(data.getValue());\r
+ }\r
+ }\r
+ return builder.toString();\r
+ }\r
+\r
+ public String getAuthor() {\r
+ return getOneElementValue("md-author");\r
+ }\r
+ \r
+ public String getAuthors() {\r
+ StringBuilder builder = new StringBuilder("");\r
+ if (getElements("md-author") != null) {\r
+ for (Pazpar2ResponseData data : getElements("md-author")) {\r
+ if (builder.length()==0) {\r
+ builder.append(data.getValue());\r
+ } else {\r
+ builder.append(", ");\r
+ builder.append(data.getValue());\r
+ }\r
+ }\r
+ }\r
+ return builder.toString();\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+public class Pazpar2Error extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = -7060267782024414318L;\r
+\r
+ public String getCode() {\r
+ return getAttribute("code");\r
+ }\r
+ \r
+ public String getMsg() {\r
+ return getAttribute("msg");\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class Pazpar2ResponseData implements Serializable {\r
+\r
+ Logger logger = Logger.getLogger(Pazpar2ResponseData.class);\r
+ private static final long serialVersionUID = -3909755656714679959L;\r
+ String type = null;\r
+ HashMap<String,String> attributes = new HashMap<String,String>();\r
+ HashMap<String,List<Pazpar2ResponseData>> elements = new HashMap<String,List<Pazpar2ResponseData>>();\r
+ String textContent = "";\r
+ CommandError error = null;\r
+ String xml = null;\r
+ \r
+ public void setType (String type) {\r
+ this.type = type;\r
+ }\r
+ \r
+ public String getType () {\r
+ return type;\r
+ }\r
+ \r
+ public void setAttribute (String name, String value) {\r
+ attributes.put(name, value);\r
+ }\r
+ \r
+ public String getAttribute (String name) {\r
+ return attributes.get(name);\r
+ }\r
+ \r
+ public void addElement (String name, Pazpar2ResponseData value) { \r
+ if (elements.containsKey(name)) {\r
+ elements.get(name).add(value);\r
+ } else {\r
+ List<Pazpar2ResponseData> list = new ArrayList<Pazpar2ResponseData>();\r
+ list.add(value);\r
+ elements.put(name,list);\r
+ }\r
+ }\r
+ \r
+ public List<Pazpar2ResponseData> getElements (String name) {\r
+ return elements.get(name);\r
+ }\r
+ \r
+ public Pazpar2ResponseData getOneElement (String name) {\r
+ if (elements.get(name) != null) {\r
+ return elements.get(name).get(0);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Returns the text content of the first element found with the given\r
+ * name\r
+ * @param name of the element \r
+ * @return text value, empty string if none found\r
+ */\r
+ public String getOneElementValue (String name) {\r
+ if (getOneElement(name)!=null && getOneElement(name).getValue().length()>0) {\r
+ return getOneElement(name).getValue();\r
+ } else {\r
+ return "";\r
+ }\r
+ }\r
+ \r
+ public void appendContent (String content) {\r
+ textContent = textContent + content;\r
+ }\r
+ \r
+ public String getValue () {\r
+ return textContent;\r
+ }\r
+ \r
+ public String getProperty(String name) {\r
+ List<Pazpar2ResponseData> els = elements.get(name);\r
+ if (els != null) {\r
+ return els.get(0).getValue();\r
+ } else { \r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public int getIntValue(String name) {\r
+ String val = getOneElementValue(name);\r
+ if (val.length()==0) {\r
+ return 0;\r
+ } else {\r
+ return Integer.parseInt(val);\r
+ }\r
+ }\r
+ \r
+ public boolean hasApplicationError () {\r
+ return (getOneElement("applicationerror") != null); \r
+ }\r
+ \r
+ public CommandError getApplicationError() {\r
+ return (CommandError) getOneElement("applicationerror");\r
+ }\r
+ \r
+ public boolean hasPazpar2Error() {\r
+ return hasApplicationError() && getApplicationError().hasPazpar2Error();\r
+ }\r
+ \r
+ public void setXml(String xml) {\r
+ this.xml = xml; \r
+ }\r
+ \r
+ public String getXml() {\r
+ if (type != null && type.equals("record")) {\r
+ logger.debug("Getting XML for "+type + ": "+xml);\r
+ } \r
+ return xml == null ? "" : xml;\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.IOException;\r
+import java.io.UnsupportedEncodingException;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.Stack;\r
+\r
+import javax.xml.parsers.ParserConfigurationException;\r
+import javax.xml.parsers.SAXParser;\r
+import javax.xml.parsers.SAXParserFactory;\r
+\r
+import org.xml.sax.Attributes;\r
+import org.xml.sax.InputSource;\r
+import org.xml.sax.SAXException;\r
+import org.xml.sax.XMLReader;\r
+import org.xml.sax.helpers.DefaultHandler;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.ByTarget;\r
+import com.indexdata.mkjsf.pazpar2.data.Hit;\r
+import com.indexdata.mkjsf.pazpar2.data.Location;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+import com.indexdata.mkjsf.pazpar2.data.RecordResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.ShowResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.StatResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.Target;\r
+import com.indexdata.mkjsf.pazpar2.data.TermListResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.TermListsResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.TermResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.TermXTargetResponse;\r
+\r
+public class Pazpar2ResponseParser extends DefaultHandler {\r
+\r
+ private XMLReader xmlReader = null;\r
+ private Pazpar2ResponseData currentElement = null;\r
+ private Stack<Pazpar2ResponseData> dataElements = new Stack<Pazpar2ResponseData>();\r
+ private Pazpar2ResponseData result = null;\r
+ private String xml = null;\r
+\r
+ private static final List<String> docTypes = \r
+ Arrays.asList("bytarget","termlist","show","stat","record","search");\r
+ \r
+ public Pazpar2ResponseParser() { \r
+ try {\r
+ initSax();\r
+ } catch (ParserConfigurationException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (SAXException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
+ public static Pazpar2ResponseParser getParser() {\r
+ return new Pazpar2ResponseParser();\r
+ }\r
+ \r
+ private void initSax() throws ParserConfigurationException, SAXException {\r
+ SAXParserFactory spf = SAXParserFactory.newInstance();\r
+ spf.setNamespaceAware(true);\r
+ SAXParser saxParser = spf.newSAXParser();\r
+ xmlReader = saxParser.getXMLReader();\r
+ xmlReader.setContentHandler(this); \r
+ }\r
+ \r
+ /**\r
+ * Parses a Pazpar2 XML response -- or an error response as XML -- and produces a \r
+ * Pazpar2ResponseData object, i.e. a 'show' object\r
+ * \r
+ * @param response XML response string from Pazpar2\r
+ * @return Response data object\r
+ */\r
+ public Pazpar2ResponseData getDataObject (String response) {\r
+ this.xml = response;\r
+ try { \r
+ xmlReader.parse(new InputSource(new ByteArrayInputStream(response.getBytes("UTF-8"))));\r
+ } catch (UnsupportedEncodingException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace(); \r
+ } catch (IOException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (SAXException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace(); \r
+ }\r
+ return result;\r
+ }\r
+\r
+ /** \r
+ * Receive notification at the start of element \r
+ * \r
+ */\r
+ @Override\r
+ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {\r
+ if (localName.equals("show")) {\r
+ currentElement = new ShowResponse(); \r
+ } else if (localName.equals("hit")) {\r
+ currentElement = new Hit();\r
+ } else if (localName.equals("location")) {\r
+ currentElement = new Location();\r
+ } else if (localName.equals("bytarget")) {\r
+ currentElement = new ByTarget(); \r
+ } else if (localName.equals("target")) {\r
+ currentElement = new Target();\r
+ } else if (localName.equals("stat")) {\r
+ currentElement = new StatResponse(); \r
+ } else if (localName.equals("termlist")) {\r
+ currentElement = new TermListsResponse(); \r
+ } else if (localName.equals("list")) {\r
+ currentElement = new TermListResponse();\r
+ ((TermListResponse)currentElement).setName(atts.getValue("name"));\r
+ ((TermListsResponse)dataElements.peek()).addTermList((TermListResponse)currentElement);\r
+ } else if (localName.equals("term")) {\r
+ if (dataElements.peek().getAttribute("name").equals("xtargets")) {\r
+ currentElement = new TermXTargetResponse(); \r
+ } else {\r
+ currentElement = new TermResponse();\r
+ }\r
+ ((TermListResponse)dataElements.peek()).addTerm((TermResponse)currentElement);\r
+ } else if (localName.equals("record")) {\r
+ currentElement = new RecordResponse(); \r
+ } else if (localName.equals("search")) {\r
+ currentElement = new SearchResponse();\r
+ } else if (localName.equals("applicationerror")) {\r
+ currentElement = new CommandError();\r
+ } else if (localName.equals("error") && dataElements.peek().getType().equals("applicationerror")) {\r
+ currentElement = new Pazpar2Error(); \r
+ } else {\r
+ currentElement = new Pazpar2ResponseData();\r
+ }\r
+ currentElement.setType(localName);\r
+ for (int i=0; i< atts.getLength(); i++) {\r
+ currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i));\r
+ }\r
+ if (!docTypes.contains(localName)) {\r
+ dataElements.peek().addElement(localName, currentElement);\r
+ }\r
+ if (this.xml != null) { // Store XML for doc level elements\r
+ currentElement.setXml(xml);\r
+ xml = null;\r
+ }\r
+ dataElements.push(currentElement); \r
+ }\r
+ \r
+ @Override\r
+ public void characters(char[] ch, int start, int length) throws SAXException {\r
+ String data = new String(ch, start, length); \r
+ dataElements.peek().appendContent(data); \r
+ }\r
+ \r
+ @Override\r
+ public void endElement(String namespaceURI, String localName, String qName) throws SAXException {\r
+ if (dataElements.size()==1) {\r
+ result = dataElements.pop();\r
+ } else {\r
+ dataElements.pop();\r
+ }\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.inject.Named;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.errors.ErrorHelper;\r
+import com.indexdata.mkjsf.errors.ErrorInterface;\r
+\r
+@Named("pzresp") @SessionScoped\r
+public class Pazpar2Responses implements Serializable {\r
+ \r
+ private static final long serialVersionUID = -7543231258346154642L;\r
+ protected Map<String,Pazpar2ResponseData> dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
+ private static Logger logger = Logger.getLogger(Pazpar2Responses.class);\r
+ private ErrorHelper errorHelper = null;\r
+\r
+ public Pazpar2Responses() { \r
+ }\r
+ \r
+ public void put(String name, Pazpar2ResponseData responseData) {\r
+ dataObjects.put(name, responseData);\r
+ }\r
+ \r
+ public void setErrorHelper(ErrorHelper helper) { \r
+ this.errorHelper = helper;\r
+ }\r
+ \r
+ public boolean hasApplicationError () {\r
+ if (getSearch().hasApplicationError()) {\r
+ logger.info("Error detected in search");\r
+ return true;\r
+ }\r
+ for (String name : dataObjects.keySet()) {\r
+ if (dataObjects.get(name).hasApplicationError()) {\r
+ logger.info("Error detected in " + name);\r
+ return true;\r
+ }\r
+ } \r
+ return false;\r
+ }\r
+ \r
+ /**\r
+ * Returns a search command error, if any, otherwise the first\r
+ * error found for an arbitrary command, if any, otherwise\r
+ * an empty dummy error. \r
+ */ \r
+ public ErrorInterface getCommandError() {\r
+ CommandError error = new CommandError();\r
+ if (dataObjects.get("search").hasApplicationError()) {\r
+ error = dataObjects.get("search").getApplicationError();\r
+ error.setErrorHelper(errorHelper);\r
+ } else {\r
+ for (String name : dataObjects.keySet()) { \r
+ if (dataObjects.get(name).hasApplicationError()) { \r
+ error = dataObjects.get(name).getApplicationError();\r
+ error.setErrorHelper(errorHelper);\r
+ break;\r
+ } \r
+ }\r
+ }\r
+ return error; \r
+ }\r
+ \r
+ public void reset() {\r
+ logger.debug("Resetting show,stat,termlist,bytarget,search response objects.");\r
+ dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
+ dataObjects.put("show", new ShowResponse());\r
+ dataObjects.put("stat", new StatResponse());\r
+ dataObjects.put("termlist", new TermListsResponse());\r
+ dataObjects.put("bytarget", new ByTarget());\r
+ dataObjects.put("record", new RecordResponse());\r
+ dataObjects.put("search", new SearchResponse());\r
+ }\r
+\r
+ public ShowResponse getShow () {\r
+ return ((ShowResponse) dataObjects.get("show"));\r
+ }\r
+ \r
+ public StatResponse getStat () {\r
+ return ((StatResponse) dataObjects.get("stat"));\r
+ }\r
+ \r
+ public RecordResponse getRecord() {\r
+ return ((RecordResponse) dataObjects.get("record"));\r
+ }\r
+ \r
+ public SearchResponse getSearch() {\r
+ return ((SearchResponse) dataObjects.get("search"));\r
+ }\r
+ \r
+ public TermListsResponse getTermLists () {\r
+ return ((TermListsResponse) dataObjects.get("termlist"));\r
+ }\r
+ \r
+ public List<TermResponse> getFacetTerms (String facet, int count) {\r
+ return (getTermLists().getTermList(facet).getTerms(count));\r
+ }\r
+ \r
+ public List<TermResponse> getFacetTerms (String facet) {\r
+ return (getTermLists().getTermList(facet).getTerms());\r
+ }\r
+ \r
+ public ByTarget getByTarget() {\r
+ return ((ByTarget) dataObjects.get("bytarget"));\r
+ }\r
+\r
+ public boolean hasRecords () {\r
+ return getStat().getRecords() > 0 \r
+ && getShow().getHits() != null \r
+ && getShow().getHits().size()>0;\r
+ }\r
+ \r
+ public String getActiveClients() { \r
+ if (getShow()!=null) {\r
+ logger.debug("Active clients: "+getShow().getActiveClients());\r
+ return getShow().getActiveClients();\r
+ } else {\r
+ return "";\r
+ }\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Location;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class RecordResponse extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = 6682722004285796002L;\r
+\r
+ public String getRecId () {\r
+ return getOneElementValue("recid");\r
+ }\r
+ \r
+ public List<Location> getLocations() {\r
+ List<Location> locations = new ArrayList<Location>();\r
+ for (Pazpar2ResponseData element : getElements("location")) {\r
+ locations.add((Location)element);\r
+ }\r
+ return locations;\r
+ }\r
+\r
+ public String getTitle() {\r
+ return getOneElementValue("md-title");\r
+ }\r
+ \r
+ public String getDate() {\r
+ return getOneElementValue("md-date");\r
+ }\r
+ \r
+ public String getAuthor() {\r
+ return getOneElementValue("md-author");\r
+ }\r
+ \r
+ public String getSubject() {\r
+ return getOneElementValue("md-subject");\r
+ }\r
+ \r
+ public String getSubjects() {\r
+ StringBuilder builder = new StringBuilder("");\r
+ for (Pazpar2ResponseData data : getElements("md-subject")) {\r
+ if (builder.length()==0) {\r
+ builder.append(data.getValue());\r
+ } else {\r
+ builder.append(", ");\r
+ builder.append(data.getValue());\r
+ }\r
+ }\r
+ return builder.toString();\r
+ }\r
+ \r
+ public Location getFirstLocation () {\r
+ return getLocations().size()>0 ? getLocations().get(0) : null;\r
+ }\r
+ \r
+ public String getActiveClients () {\r
+ return getOneElementValue("activeclients");\r
+ }\r
+\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+public class SearchResponse extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = -3320013021497018972L;\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Hit;\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class ShowResponse extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = 7103554232106330370L;\r
+ \r
+\r
+ public String getStatus() {\r
+ return getOneElementValue("status");\r
+ }\r
+ \r
+ public String getActiveClients () {\r
+ return getOneElementValue("activeclients");\r
+ }\r
+ \r
+ public int getMerged () {\r
+ return getIntValue("merged");\r
+ }\r
+ \r
+ public String getTotal () {\r
+ return getOneElementValue("total"); \r
+ }\r
+ \r
+ public int getStart () {\r
+ return getIntValue("start");\r
+ }\r
+\r
+ public int getNum () {\r
+ return getIntValue("num");\r
+ }\r
+ \r
+ public List<Hit> getHits() {\r
+ List<Hit> hits = new ArrayList<Hit>();\r
+ if (getElements("hit") != null) {\r
+ for (Pazpar2ResponseData element : getElements("hit")) {\r
+ hits.add((Hit)element);\r
+ }\r
+ } \r
+ return hits;\r
+ }\r
+ \r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class StatResponse extends Pazpar2ResponseData {\r
+ \r
+ private static final long serialVersionUID = -6578979787689458761L;\r
+\r
+ public int getHits() { \r
+ return getProperty("hits")==null ? 0 : Integer.parseInt(getProperty("hits"));\r
+ }\r
+ \r
+ public int getClients () {\r
+ return getIntValue("clients");\r
+ }\r
+ \r
+ public int getActiveClients () {\r
+ return getIntValue("activeclients");\r
+ }\r
+\r
+ public int getRecords () {\r
+ return getIntValue("records");\r
+ }\r
+ \r
+ public String getUnconnected() {\r
+ return getOneElementValue("unconnected");\r
+ }\r
+ \r
+ public String getConnecting() {\r
+ return getOneElementValue("connecting");\r
+ }\r
+ \r
+ public String getWorking() {\r
+ return getOneElementValue("working");\r
+ }\r
+ \r
+ public String getIdle() {\r
+ return getOneElementValue("idle");\r
+ }\r
+ \r
+ public String getFailed() {\r
+ return getOneElementValue("failed");\r
+ }\r
+ \r
+ public String getError() {\r
+ return getOneElementValue("error");\r
+ }\r
+ \r
+ public String getProgress() {\r
+ return getOneElementValue("progress");\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class Target extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = 3343881183545520108L;\r
+\r
+ public String getId () {\r
+ return getOneElementValue("id");\r
+ }\r
+ \r
+ public String getName() {\r
+ return getOneElementValue("name");\r
+ }\r
+ \r
+ public String getHits() {\r
+ return getOneElementValue("hits");\r
+ }\r
+ \r
+ public String getDiagnostic() {\r
+ return getOneElementValue("diagnostic");\r
+ }\r
+ \r
+ public String getRecords() {\r
+ return getOneElementValue("records");\r
+ }\r
+ \r
+ public String getState () {\r
+ return getOneElementValue("state");\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+import com.indexdata.mkjsf.pazpar2.data.TermListResponse;\r
+import com.indexdata.mkjsf.pazpar2.data.TermResponse;\r
+\r
+public class TermListResponse extends Pazpar2ResponseData {\r
+\r
+ private static Logger logger = Logger.getLogger(TermListResponse.class);\r
+ private static final long serialVersionUID = 3838585739723097393L;\r
+ String name = "";\r
+ List<TermResponse> terms = new ArrayList<TermResponse>();\r
+ \r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ public void setName(String name) {\r
+ this.name = name;\r
+ }\r
+ \r
+ public List<TermResponse> getTerms() { \r
+ return terms;\r
+ }\r
+ \r
+ public List<TermResponse> getTerms(int count) {\r
+ List<TermResponse> firstTerms = new ArrayList<TermResponse>();\r
+ for (int i=0; i<count && i<terms.size(); i++) {\r
+ firstTerms.add(terms.get(i));\r
+ }\r
+ logger.trace("Returning " + count + " " + name + " terms: " + firstTerms);\r
+ return firstTerms;\r
+ }\r
+ \r
+ public void setTerms(List<TermResponse> terms) {\r
+ this.terms = terms;\r
+ }\r
+ \r
+ public void addTerm(TermResponse term) {\r
+ terms.add(term);\r
+ } \r
+ \r
+ public String toString () {\r
+ return terms.toString();\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+import com.indexdata.mkjsf.pazpar2.data.TermListResponse;\r
+\r
+public class TermListsResponse extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = -1370643625715834978L;\r
+ private int activeClients = -1;\r
+ private Map<String,TermListResponse> termLists = new HashMap<String,TermListResponse>(); \r
+ \r
+ public int getActiveClients() {\r
+ return activeClients;\r
+ }\r
+ public void setActiveClients(int activeClients) {\r
+ this.activeClients = activeClients;\r
+ }\r
+\r
+ public void addTermList(TermListResponse termList) { \r
+ this.termLists.put(termList.getName(),termList);\r
+ }\r
+ public TermListResponse getTermList(String name) { \r
+ return termLists.get(name);\r
+ }\r
+ \r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData;\r
+\r
+public class TermResponse extends Pazpar2ResponseData {\r
+\r
+ private static final long serialVersionUID = -8323959763575180678L;\r
+ \r
+ protected int frequency = -1;\r
+ \r
+ public String getName() {\r
+ return getProperty("name");\r
+ }\r
+ public int getFrequency() {\r
+ return Integer.parseInt(getProperty("frequency"));\r
+ }\r
+ \r
+ public String toString() {\r
+ return getProperty("name");\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import com.indexdata.mkjsf.pazpar2.data.TermResponse;\r
+\r
+public class TermXTargetResponse extends TermResponse {\r
+\r
+ private static final long serialVersionUID = 5201902652960804977L;\r
+ \r
+ public String getId() {\r
+ return getOneElement("id").getValue();\r
+ }\r
+ public int getApproximation () {\r
+ return Integer.parseInt(getOneElement("approximation").getValue());\r
+ }\r
+ public int getRecords () {\r
+ return Integer.parseInt(getOneElement("records").getValue());\r
+ }\r
+ public int getFiltered () {\r
+ return Integer.parseInt(getOneElement("filtered").getValue());\r
+ }\r
+ public String getState () {\r
+ return getOneElement("state").getValue();\r
+ }\r
+ public String getDiagnostic () {\r
+ return getOneElement("diagnostic").getValue();\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.sp;\r
+\r
+import static com.indexdata.mkjsf.utils.Utils.nl;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.File;\r
+import java.io.FileReader;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.http.HttpEntity;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.StatusLine;\r
+import org.apache.http.client.ClientProtocolException;\r
+import org.apache.http.client.HttpClient;\r
+import org.apache.http.client.ResponseHandler;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.apache.http.client.methods.HttpPost;\r
+import org.apache.http.conn.ClientConnectionManager;\r
+import org.apache.http.conn.scheme.PlainSocketFactory;\r
+import org.apache.http.conn.scheme.Scheme;\r
+import org.apache.http.conn.scheme.SchemeRegistry;\r
+import org.apache.http.entity.ByteArrayEntity;\r
+import org.apache.http.entity.FileEntity;\r
+import org.apache.http.impl.client.DefaultHttpClient;\r
+import org.apache.http.impl.conn.PoolingClientConnectionManager;\r
+import org.apache.http.util.EntityUtils;\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
+import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.mkjsf.config.Configuration;\r
+import com.indexdata.mkjsf.config.ConfigurationReader;\r
+import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.pazpar2.CommandResponse;\r
+import com.indexdata.mkjsf.pazpar2.SearchClient;\r
+import com.indexdata.mkjsf.pazpar2.commands.CommandParameter;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.pazpar2.sp.auth.AuthenticationEntity;\r
+import com.indexdata.mkjsf.pazpar2.sp.auth.ServiceProxyUser;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+\r
+public class ServiceProxyClient implements SearchClient {\r
+ \r
+ private static final long serialVersionUID = -4031644009579840277L;\r
+ private static Logger logger = Logger.getLogger(ServiceProxyClient.class);\r
+ public static final String MODULENAME = "proxyclient";\r
+ public static final String SERVICE_PROXY_URL = "SERVICE_PROXY_URL";\r
+ public static final String SP_INIT_DOC_PATHS = "SP_INIT_DOC_PATHS";\r
+ private String serviceUrl = "undefined";\r
+ private String[] initDocPaths = null;\r
+ private Configuration config = null;\r
+ \r
+ ProxyPz2ResponseHandler handler = new ProxyPz2ResponseHandler();\r
+ private HttpClient client;\r
+ private ServiceProxyUser user;\r
+\r
+ public ServiceProxyClient () {\r
+ SchemeRegistry schemeRegistry = new SchemeRegistry();\r
+ schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));\r
+ ClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);\r
+ client = new DefaultHttpClient(cm); \r
+ }\r
+ \r
+ @Override\r
+ public void configure (ConfigurationReader configReader) {\r
+ logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader));\r
+ try {\r
+ config = configReader.getConfiguration(this); \r
+ serviceUrl = config.getMandatory(SERVICE_PROXY_URL); \r
+ this.initDocPaths = getMultiProperty(config.get(SP_INIT_DOC_PATHS)); \r
+ } catch (ConfigurationException c) {\r
+ c.printStackTrace();\r
+ } catch (MissingMandatoryParameterException mmp) {\r
+ mmp.printStackTrace();\r
+ } \r
+ }\r
+ \r
+ private String[] getMultiProperty(String prop) { \r
+ if (prop != null) {\r
+ return prop.split(",");\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public boolean authenticate (AuthenticationEntity user) {\r
+ try { \r
+ logger.info("Authenticating [" + user.getProperty("name") + "]");\r
+ this.user = (ServiceProxyUser) user;\r
+ Pazpar2Command auth = new Pazpar2Command("auth",null);\r
+ auth.setParametersInState(new CommandParameter("action","=","login"), \r
+ new CommandParameter("username","=",user.getProperty("name")), \r
+ new CommandParameter("password","=",user.getProperty("password")));\r
+ byte[] response = send(auth);\r
+ String responseStr = new String(response,"UTF-8");\r
+ logger.info(responseStr); \r
+ if (responseStr.contains("FAIL")) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ } \r
+ } catch (ClientProtocolException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ return false;\r
+ } catch (IOException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ return false;\r
+ } \r
+ }\r
+ \r
+ public boolean checkAuthentication () {\r
+ try {\r
+ Pazpar2Command check = new Pazpar2Command("auth",null);\r
+ check.setParameter(new CommandParameter("action","=","check"));\r
+ byte[] response = send(check);\r
+ logger.info(new String(response,"UTF-8"));\r
+ } catch (ClientProtocolException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ return false;\r
+ } catch (IOException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ return false;\r
+ } \r
+ return true;\r
+ \r
+ }\r
+ \r
+ public boolean isAuthenticatingClient () {\r
+ return true;\r
+ }\r
+ \r
+ public boolean isAuthenticated () {\r
+ if (user.getProperty("name") != null && user.getProperty("password") != null) {\r
+ return checkAuthentication();\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Makes the request\r
+ * @param request\r
+ * @return HTTP response as a String\r
+ * @throws ClientProtocolException\r
+ * @throws IOException\r
+ */\r
+ private byte[] send(Pazpar2Command command) throws ClientProtocolException, IOException {\r
+ String url = serviceUrl + "?" + command.getEncodedQueryString(); \r
+ logger.info("Sending request "+url); \r
+ HttpGet httpget = new HttpGet(url); \r
+ byte[] response = client.execute(httpget, handler); \r
+ return response;\r
+ }\r
+ \r
+ public class ProxyPz2ResponseHandler implements ResponseHandler<byte[]> {\r
+ private StatusLine statusLine = null;\r
+ public byte[] handleResponse(HttpResponse response) throws ClientProtocolException, IOException {\r
+ byte[] resp = null;\r
+ HttpEntity entity = response.getEntity(); \r
+ statusLine = response.getStatusLine();\r
+ if (entity != null) { \r
+ resp = EntityUtils.toByteArray(entity); \r
+ } \r
+ EntityUtils.consume(entity);\r
+ return resp;\r
+ }\r
+ public int getStatusCode() {\r
+ return statusLine.getStatusCode();\r
+ } \r
+ public String getReasonPhrase() {\r
+ return statusLine.getReasonPhrase();\r
+ }\r
+ }\r
+\r
+ public int getStatusCode () {\r
+ return handler.getStatusCode();\r
+ }\r
+ \r
+ public String getReasonPhrase() {\r
+ return handler.getReasonPhrase();\r
+ }\r
+\r
+ @Override\r
+ public void setSearchCommand(Pazpar2Command command) {\r
+ // Do nothing, Service Proxy is handling this \r
+ }\r
+\r
+ @Override\r
+ public CommandResponse executeCommand(Pazpar2Command command,\r
+ ByteArrayOutputStream baos) throws Pazpar2ErrorException, IOException {\r
+ byte[] response = send(command);\r
+ baos.write(response);\r
+ return new ServiceProxyClientCommandResponse(getStatusCode(), new String(response,"UTF-8")); \r
+ }\r
+\r
+ public ServiceProxyClient cloneMe() {\r
+ logger.debug("Cloning Pz2Client");\r
+ ServiceProxyClient clone = new ServiceProxyClient();\r
+ clone.client = this.client;\r
+ clone.serviceUrl = this.serviceUrl;\r
+ clone.initDocPaths = this.initDocPaths;\r
+ return clone;\r
+ }\r
+\r
+ @Override\r
+ public Map<String, String> getDefaults() { \r
+ return new HashMap<String,String>();\r
+ }\r
+\r
+ @Override\r
+ public String getModuleName() {\r
+ return MODULENAME;\r
+ }\r
+ \r
+ @Override\r
+ public List<String> documentConfiguration () {\r
+ List<String> doc = new ArrayList<String>();\r
+ doc.add(nl+ MODULENAME + " was configured to access the Pazpar2 service proxy at: " + serviceUrl);\r
+ return null;\r
+ }\r
+ \r
+ public byte[] postInitDoc (String filePath) throws IOException {\r
+ logger.info("Looking to post the file in : [" + filePath +"]");\r
+ HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes");\r
+ File initDoc = new File(filePath);\r
+ logger.info("Posting to SP: ");\r
+ if (logger.isDebugEnabled()) {\r
+ BufferedReader reader = new BufferedReader(new FileReader(initDoc));\r
+ String line;\r
+ while ( (line = reader.readLine()) != null) {\r
+ System.out.println(line);\r
+ }\r
+ reader.close();\r
+ }\r
+ post.setEntity(new FileEntity(initDoc));\r
+ byte[] response = client.execute(post, handler);\r
+ logger.debug("Response on POST was: " + new String(response,"UTF-8")); \r
+ return response;\r
+ }\r
+ \r
+ public String[] getInitDocPaths () {\r
+ logger.debug("Get init doc paths ");\r
+ logger.debug("length: " + initDocPaths.length);\r
+ return initDocPaths;\r
+ }\r
+ \r
+ public byte[] postInitDoc(byte[] initDoc) throws IOException {\r
+ HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes");\r
+ post.setEntity(new ByteArrayEntity(initDoc));\r
+ byte[] response = client.execute(post, handler);\r
+ logger.debug("Response on POST was: " + new String(response,"UTF-8")); \r
+ return response;\r
+ }\r
+ \r
+ public void setServiceProxyUrl (String url) {\r
+ serviceUrl = url;\r
+ }\r
+ \r
+ public String getServiceProxyUrl () {\r
+ return serviceUrl;\r
+ }\r
+ \r
+ public Configuration getConfiguration () {\r
+ return config;\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.sp;\r
+\r
+import com.indexdata.mkjsf.pazpar2.CommandResponse;\r
+\r
+public class ServiceProxyClientCommandResponse implements CommandResponse {\r
+\r
+ private int statusCode = 0;\r
+ private String content = null;\r
+ \r
+ public ServiceProxyClientCommandResponse(int statusCode, String content) {\r
+ this.statusCode = statusCode;\r
+ this.content = content;\r
+ }\r
+\r
+ @Override\r
+ public int getStatusCode() {\r
+ return statusCode;\r
+ }\r
+\r
+ @Override\r
+ public String getContentType() {\r
+ return "text/xml;charset=UTF-8"; \r
+ }\r
+\r
+ @Override\r
+ public String getResponseString() {\r
+ return content;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.sp;\r
+\r
+import java.io.IOException;\r
+import java.io.UnsupportedEncodingException;\r
+\r
+import com.indexdata.mkjsf.pazpar2.Pz2Interface;\r
+\r
+public interface ServiceProxyInterface extends Pz2Interface { \r
+ public String login(String navigateTo); \r
+ public void setInitFileName (String fileName); \r
+ public String getInitFileName();\r
+ public String postInit() throws UnsupportedEncodingException, IOException;\r
+ public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException;\r
+ public String getInitResponse();\r
+ public void setServiceProxyUrl(String url);\r
+ public String getServiceProxyUrl();\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.sp.auth;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+public interface AuthenticationEntity extends Serializable{\r
+ \r
+ \r
+ public String getProperty(String key); \r
+ \r
+ public Map<String,String> getPropertyMap();\r
+\r
+ public List<String> getPossibleProperties();\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.sp.auth;\r
+\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+import javax.inject.Named;\r
+\r
+@Named("user") @SessionScoped\r
+public class ServiceProxyUser implements AuthenticationEntity {\r
+\r
+ private static final long serialVersionUID = 2351542518778803071L;\r
+ private List<String> possibleProperties = Arrays.asList("name","password","realm");\r
+ private Map<String,String> actualProperties = new HashMap<String,String>();\r
+\r
+ public ServiceProxyUser() {}\r
+ \r
+ public void setAuthenticationMethod() {\r
+ \r
+ }\r
+\r
+ public String getName() { \r
+ return actualProperties.get("name"); \r
+ }\r
+ \r
+ public void setName(String newValue) { \r
+ actualProperties.put("name", newValue); \r
+ }\r
+ \r
+ public String getPassword() { \r
+ return actualProperties.get("password"); \r
+ }\r
+ \r
+ public void setPassword(String newValue) { \r
+ actualProperties.put("password", newValue);\r
+ }\r
+ \r
+ public void setRealm(String realm) {\r
+ actualProperties.put("realm", realm);\r
+ }\r
+ \r
+ public String getRealm() {\r
+ return actualProperties.get("realm");\r
+ }\r
+ \r
+\r
+ @Override\r
+ public String getProperty(String key) {\r
+ return actualProperties.get(key);\r
+ }\r
+\r
+ @Override\r
+ public Map<String, String> getPropertyMap() {\r
+ return actualProperties;\r
+ }\r
+\r
+ @Override\r
+ public List<String> getPossibleProperties() {\r
+ return possibleProperties;\r
+ } \r
+ \r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.state;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.BytargetCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.InitCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
+import com.indexdata.mkjsf.pazpar2.commands.PingCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.RecordCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.SearchCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.SettingsCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.ShowCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.StatCommand;\r
+import com.indexdata.mkjsf.pazpar2.commands.TermlistCommand;\r
+\r
+/**\r
+ * Holds a 'pazpar2 state', understood as a full set of pazpar2 commands and \r
+ * all their parameter settings at a given point in time.\r
+ * \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+public class Pazpar2State {\r
+\r
+ String key = null;\r
+ Map<String,Pazpar2Command> commands = new HashMap<String,Pazpar2Command>();;\r
+\r
+ public Pazpar2State (StateManager mgr) {\r
+ commands.put(Pazpar2Commands.INIT, new InitCommand(mgr));\r
+ commands.put(Pazpar2Commands.PING, new PingCommand(mgr));\r
+ commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand(mgr));\r
+ commands.put(Pazpar2Commands.SEARCH, new SearchCommand(mgr));\r
+ commands.put(Pazpar2Commands.STAT, new StatCommand(mgr));\r
+ commands.put(Pazpar2Commands.SHOW, new ShowCommand(mgr));\r
+ commands.put(Pazpar2Commands.RECORD, new RecordCommand(mgr));\r
+ commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand(mgr));\r
+ commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand(mgr)); \r
+ key = "#1";\r
+ }\r
+ \r
+ /**\r
+ * Creates new state by cloning all commands of the provided state and \r
+ * then overriding one of them with the provided state changing command.\r
+ * \r
+ * @param previousState\r
+ * @param newCommand\r
+ */\r
+ public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
+ for (String commandName : previousState.commands.keySet()) {\r
+ this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
+ }\r
+ this.commands.put(newCommand.getName(),newCommand);\r
+ this.key = getKey(); \r
+ }\r
+ \r
+ /**\r
+ * Generates a state key that can be used by the browser to pick\r
+ * up this state again at a later point in time.\r
+ * \r
+ * @return\r
+ */\r
+ public String getKey() {\r
+ if (key == null) {\r
+ StringBuilder querystatebuilder = new StringBuilder("");\r
+ for (Pazpar2Command command : commands.values()) {\r
+ if (command.hasParameters()) {\r
+ querystatebuilder.append("||"+command.getName()+"::");\r
+ querystatebuilder.append(command.getValueWithExpressions());\r
+ } \r
+ } \r
+ key = "#"+querystatebuilder.toString().hashCode();\r
+ return key;\r
+ } else { \r
+ return key;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Checks if a command represents a change of this state\r
+ * \r
+ * @param command\r
+ * @return true if the command causes a change of state\r
+ */\r
+ public boolean stateMutating (Pazpar2Command command) {\r
+ if (command == null) {\r
+ return true;\r
+ } else if (commands.get(command.getName()) == null) {\r
+ return true;\r
+ } else if ((command.equals(commands.get(command.getName())))) {\r
+ return false; \r
+ } else {\r
+ return true;\r
+ }\r
+ } \r
+ \r
+ /**\r
+ * Returns a command from this state\r
+ * \r
+ * @param name\r
+ * @return\r
+ */ \r
+ public Pazpar2Command getCommand(String name) {\r
+ return commands.get(name);\r
+ }\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.state;\r
+\r
+public interface StateListener {\r
+\r
+ public void stateUpdated(String commandName);\r
+ \r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pazpar2.state;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.enterprise.context.SessionScoped;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+@SessionScoped\r
+public class StateManager implements Serializable {\r
+ \r
+ private static final long serialVersionUID = 8152558351351730035L;\r
+\r
+ Map<String, Pazpar2State> states = new HashMap<String, Pazpar2State>();\r
+ String currentKey = "";\r
+ private static List<String> allCommands = new ArrayList<String>(Arrays.asList("init","ping","settings","search","stat","show","record","termlist","bytarget"));\r
+ Map<String,Boolean> pendingStateChanges = new HashMap<String,Boolean>();\r
+ private static Logger logger = Logger.getLogger(StateManager.class);\r
+ private List<StateListener> listeners = new ArrayList<StateListener>();\r
+ \r
+ public StateManager () {\r
+ logger.info("Initializing a Pazpar2 state manager [" + Utils.objectId(this) + "]");\r
+ Pazpar2State initialState = new Pazpar2State(this);\r
+ states.put(initialState.getKey(), initialState);\r
+ currentKey = initialState.getKey();\r
+ for (String command : allCommands) {\r
+ pendingStateChanges.put(command, new Boolean(false));\r
+ }\r
+ }\r
+ \r
+ public void addStateListener(StateListener listener) {\r
+ listeners.add(listener);\r
+ }\r
+ \r
+ public void removeStateListener (StateListener listener) {\r
+ listeners.remove(listener);\r
+ }\r
+ \r
+ private void updateListeners (String command) {\r
+ for (StateListener lsnr : listeners) {\r
+ lsnr.stateUpdated(command);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Registers a Pazpar2 command for execution.\r
+ * \r
+ * The state manager will update current state and flag that\r
+ * a request change was made but that it was not yet carried \r
+ * out against Pazpar2.\r
+ * \r
+ * Any command that is created or modified must be checked in\r
+ * like this to come into effect.\r
+ * \r
+ * @param command\r
+ */\r
+ public void checkIn(Pazpar2Command command) {\r
+ if (getCurrentState().stateMutating(command)) {\r
+ logger.debug("State changed by: " + command.getName());\r
+ Pazpar2State state = new Pazpar2State(getCurrentState(),command);\r
+ states.put(state.getKey(), state);\r
+ currentKey = state.getKey();\r
+ hasPendingStateChange(command.getName(),new Boolean(true)); \r
+ logger.debug("Updating " + listeners.size() + " listener(s) with state change from " + command);\r
+ updateListeners(command.getName()); \r
+ } else {\r
+ logger.debug("Command " + command.getName() + " not found to change the state [" + command.getEncodedQueryString() + "]");\r
+ }\r
+ }\r
+ \r
+ public Pazpar2Command getCommand (String commandName) {\r
+ return getCurrentState().getCommand(commandName);\r
+ }\r
+ \r
+ public Pazpar2State getCurrentState () {\r
+ return states.get(currentKey);\r
+ }\r
+ \r
+ /**\r
+ * Changes the current state key. Invoked from the UI to have the state \r
+ * manager switch to another state than the current one. \r
+ * \r
+ * @param key\r
+ */\r
+ public void setCurrentStateKey(String key) { \r
+ if (currentKey.equals(key)) {\r
+ logger.debug("setCurrentStateKey: no key change detected");\r
+ } else {\r
+ logger.debug("State key change. Was: [" + currentKey + "]. Will be ["+key+"]");\r
+ if (states.get(key)==null) {\r
+ logger.error("The back-end received an unknow state key."); \r
+ } else {\r
+ if (states.get(key).getCommand("search").equals(states.get(currentKey).getCommand("search"))) {\r
+ logger.debug("No search change detected");\r
+ } else {\r
+ hasPendingStateChange("search",true);\r
+ }\r
+ if (states.get(key).getCommand("record").equals(states.get(currentKey).getCommand("record"))) {\r
+ logger.debug("No record change detected");\r
+ } else {\r
+ hasPendingStateChange("record",true);\r
+ }\r
+ currentKey = key;\r
+ } \r
+ }\r
+ }\r
+\r
+ /**\r
+ * Sets a pending-state-change flag for the given command and notifies\r
+ * registered listeners. \r
+ * \r
+ * It is up to the listener to reset the flag as needed.\r
+ * \r
+ * @param command\r
+ * @param bool\r
+ */\r
+ public void hasPendingStateChange(String command, boolean bool) {\r
+ pendingStateChanges.put(command, new Boolean(bool));\r
+ }\r
+ \r
+ /**\r
+ * \r
+ * @param command\r
+ * @return true if there is a non-executed command change in this state\r
+ */\r
+ public boolean hasPendingStateChange (String command) {\r
+ return pendingStateChanges.get(command).booleanValue();\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.pz2utils;\r
+\r
+import java.io.Serializable;\r
+\r
+import javax.enterprise.context.ApplicationScoped;\r
+import javax.inject.Named;\r
+\r
+@Named("pz2watch")\r
+@ApplicationScoped\r
+public class ListenerFieldIds implements Serializable {\r
+ \r
+ private static final long serialVersionUID = -57079241763914538L;\r
+ \r
+ public String getHistory () {\r
+ return ":pz2watch:stateForm:windowlocationhash";\r
+ }\r
+ \r
+ public String getActiveclients () {\r
+ return ":pz2watch:activeclientsForm:activeclientsField";\r
+ }\r
+ \r
+ public String getActiveclientsRecord () {\r
+ return ":pz2watch:activeclientsForm:activeclientsFieldRecord";\r
+ }\r
+ \r
+ public String getErrorMessages () {\r
+ return ":pz2watch:activeclientsForm:errorMessages";\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.indexdata.mkjsf.utils;\r
+\r
+public class Utils {\r
+ \r
+ public static String nl = System.getProperty("line.separator"); \r
+\r
+ public static String objectId(Object o) {\r
+ int lastdot = o.toString().lastIndexOf('.');\r
+ if (lastdot>-1 && lastdot+1<o.toString().length()) {\r
+ return o.toString().substring(lastdot+1);\r
+ } else {\r
+ return o.toString();\r
+ }\r
+ }\r
+ \r
+ public static String baseObjectName(Object o) {\r
+ String objName = o.getClass().getName();\r
+ if (objName.contains("$")) {\r
+ return objectId(objName.substring(0,objName.indexOf("$"))); \r
+ } else {\r
+ return objectId(objName);\r
+ }\r
+ }\r
+}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.config;\r
-\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-\r
-/**\r
- * Interface to be implemented by any part of an application that wish to\r
- * use a ConfigurationReader for it's configuration. The Configurables that\r
- * come with the project are a Pazpar2 client and a Service Proxy client\r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-public interface Configurable {\r
-\r
- /**\r
- * Configures the Configurable using the configuration obtained by the \r
- * provided configuration reader\r
- * @param reader used for reading the configuration \r
- * @throws ConfigurationException\r
- */\r
- public void configure(ConfigurationReader reader) throws ConfigurationException;\r
- \r
- /**\r
- * Returns the default parameters that the configurable has defined for itself\r
- * Should be invoked by the configuration reader before it possibly overrides\r
- * some parameters obtained from the external configuration source \r
- * @return\r
- */\r
- public Map<String,String> getDefaults();\r
- \r
- /**\r
- * Returns the name of the module, can be used by a configuration reader that \r
- * has distinguishes between sets of configuration properties by component name\r
- * @return name of the part that is to be configured\r
- */\r
- public String getModuleName();\r
- \r
- /**\r
- * The components documentation of how it was configured. \r
- * \r
- * @return a list of Strings describing configuration details\r
- */\r
- public List<String> documentConfiguration(); \r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.config;\r
-\r
-import java.io.Serializable;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-/**\r
- * Represents a configuration as a set of key-value pairs\r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-public class Configuration implements Serializable {\r
-\r
- private static final long serialVersionUID = -6801241975338182197L;\r
- private static Logger logger = Logger.getLogger(Configuration.class);\r
- Map<String,String> properties = new HashMap<String,String>();\r
- \r
- public Configuration () {\r
- logger.debug(Utils.objectId(this) + " being constructed with no argument"); \r
- }\r
- \r
- public Configuration(Map<String,String> parameters) {\r
- addAll(parameters);\r
- }\r
- \r
- public void addAll(Map<String,String> parameters) {\r
- for (String key : parameters.keySet()) {\r
- properties.put(key, parameters.get(key));\r
- } \r
- }\r
- \r
- public void addAll(Map<String,String> defaults, Map<String,String> parameters) {\r
- for (String key : defaults.keySet()) {\r
- properties.put(key, defaults.get(key));\r
- } \r
- for (String key : parameters.keySet()) {\r
- properties.put(key, parameters.get(key));\r
- } \r
- }\r
- \r
- public String get(String key) {\r
- return properties.get(key); \r
- }\r
- \r
- public void set(String key, String value) {\r
- properties.put(key, value);\r
- }\r
- \r
- public String get(String key, String defaultValue) {\r
- if (properties.containsKey(key)) {\r
- return properties.get(key);\r
- } else {\r
- return defaultValue;\r
- }\r
- }\r
- \r
- public String getMandatory(String key) throws MissingMandatoryParameterException {\r
- if (properties.containsKey(key)) {\r
- return properties.get(key);\r
- } \r
- throw new MissingMandatoryParameterException("Missing mandatory parameter: " + key); \r
- }\r
-\r
- public String getConfigFilePath() {
- return get("configpath","nopathgiven");\r
- }\r
- \r
- public Map<String,String> getConfigMap() {\r
- return properties;\r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.config;\r
-\r
-import java.io.Serializable;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-\r
-/**\r
- * Interface to be implemented by classes that read configurations from a source -\r
- * i.e. from web.xml, the file system, a database or hard-coded. \r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-public interface ConfigurationReader extends Serializable {\r
- \r
- /**\r
- * Returns a Configuration to be used by the given Configurable\r
- * \r
- * @param configurable the configurable to be configured by a configuration obtained by this reader\r
- * @return a Configuration, basically a set of key-value pairs\r
- * @throws ConfigurationException\r
- */\r
- public Configuration getConfiguration(Configurable configurable) throws ConfigurationException;\r
- \r
- /**\r
- * Returns documentation for the key-value pairs obtained by this reader\r
- * @return\r
- */\r
- public List<String> document();\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.config;\r
-\r
-import java.io.IOException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.enterprise.inject.Alternative;\r
-import javax.faces.context.ExternalContext;\r
-import javax.faces.context.FacesContext;\r
-import javax.inject.Named;\r
-import javax.servlet.ServletContext;\r
-import javax.servlet.http.HttpServletRequest;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.masterkey.config.MasterkeyConfiguration;\r
-import com.indexdata.masterkey.config.ModuleConfiguration;\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-/**\r
- * Reads configuration from a MasterKey configuration scheme\r
- * \r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-@Named @SessionScoped @Alternative\r
-public class Mk2ConfigReader implements ConfigurationReader {\r
-\r
- private static final long serialVersionUID = 8865086878660568870L;\r
- private static Logger logger = Logger.getLogger(Mk2ConfigReader.class);\r
- private Map<String,Configuration> configs = new HashMap<String,Configuration>(); \r
- private Map<String,Configurable> configurables = new HashMap<String,Configurable>();\r
-\r
- public Mk2ConfigReader () throws IOException {\r
- logger.info(Utils.objectId(this) + " is instantiating Pazpar2 service configuration by MasterKey configuration scheme.");\r
- }\r
-\r
- @Override\r
- public Configuration getConfiguration(Configurable configurable) throws ConfigurationException { \r
- if (configs.get(configurable.getModuleName()) == null) {\r
- Configuration config = readConfig(configurable);\r
- configs.put(configurable.getModuleName(), config); \r
- configurables.put(configurable.getModuleName(), configurable);\r
- }\r
- return configs.get(configurable.getModuleName()); \r
- }\r
- \r
- private Configuration readConfig (Configurable configurable) throws ConfigurationException {\r
- Configuration config = new Configuration();\r
- ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
- ServletContext servletContext = (ServletContext) externalContext.getContext(); \r
- MasterkeyConfiguration mkConfigContext;\r
- try {\r
- mkConfigContext = MasterkeyConfiguration.getInstance(servletContext,\r
- "pazpar-application-jsf", ((HttpServletRequest) externalContext.getRequest()).getServerName());\r
- } catch (IOException e) {\r
- throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '" + configurable.getModuleName() + "' using MasterKey configuration scheme: "+e.getMessage(),e);\r
- } \r
- try {\r
- ModuleConfiguration moduleConfig = mkConfigContext.getModuleConfiguration(configurable.getModuleName()); \r
- config.addAll(configurable.getDefaults(),moduleConfig.getConfigMap());\r
- config.set("configpath", moduleConfig.getConfigFilePath()); \r
- } catch (IOException e) {\r
- throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '"+ configurable.getModuleName() + "': "+e.getMessage(),e);\r
- } \r
- return config;\r
- }\r
- \r
- public List<String> document() {\r
- List<String> doc = new ArrayList<String>();\r
- doc.add("Application properties as read by " + this.getClass());\r
- for (String moduleName : configs.keySet()) {\r
- doc.add(nl+"Module: " + moduleName);\r
- Configurable module = configurables.get(moduleName);\r
- Map<String,String> map = configs.get(moduleName).getConfigMap();\r
- for (String key : map.keySet()) {\r
- doc.add(nl+key+": "+ map.get(key) +\r
- (module.getDefaults().containsKey(key) ? \r
- (module.getDefaults().get(key).equals(map.get(key)) ? " [default]" : " [override]")\r
- : "")); \r
- }\r
- }\r
- return doc;\r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.config;\r
-\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Enumeration;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.enterprise.inject.Alternative;\r
-import javax.faces.context.ExternalContext;\r
-import javax.faces.context.FacesContext;\r
-import javax.inject.Named;\r
-import javax.servlet.ServletContext;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-\r
-/**\r
- * Reads a configuration from the context parameters of the deployment descriptor (web.xml)\r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-@Named @SessionScoped @Alternative\r
-public class WebXmlConfigReader implements ConfigurationReader {\r
-\r
- private static final long serialVersionUID = 144390224959311772L;\r
- private static Logger logger = Logger.getLogger(WebXmlConfigReader.class);\r
- private Configuration config = null;\r
- private Map<String,String> parameters = new HashMap<String,String>(); \r
- \r
- public WebXmlConfigReader () {\r
- logger.info("Instantiating Pazpar2 service configuration by web.xml parameters");\r
- }\r
- \r
- public Configuration getConfiguration(Configurable configurable) throws ConfigurationException {\r
- if (config == null) {\r
- parameters.putAll(configurable.getDefaults());\r
- parameters.putAll(readConfig());\r
- config = new Configuration(parameters);\r
- }\r
- return config;\r
- }\r
- \r
- private Map<String,String> readConfig () throws ConfigurationException {\r
- Map<String,String> map = new HashMap<String,String>();\r
- ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
- ServletContext servletContext = (ServletContext) externalContext.getContext(); \r
- Enumeration<String> enumer = servletContext.getInitParameterNames();\r
- while (enumer.hasMoreElements()) {\r
- String name = enumer.nextElement();\r
- map.put(name,servletContext.getInitParameter(name));\r
- }\r
- return map; \r
- }\r
- \r
- public List<String> document() {\r
- List<String> doc = new ArrayList<String>();\r
- doc.add("Application properties as read by " + this.getClass());\r
- for (String key : parameters.keySet()) {\r
- doc.add(nl+key+": "+ parameters.get(key));\r
- }\r
- return doc;\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.controls;\r
-\r
-import java.io.Serializable;\r
-\r
-import com.indexdata.pz2utils4jsf.controls.ResultsPager;\r
-\r
-public class PageLink implements Serializable {\r
-\r
- private static final long serialVersionUID = -468888598965842949L;\r
- String text = "";\r
- int page = 0;\r
- ResultsPager pager;\r
- public PageLink(String text, int page, ResultsPager pager) {\r
- this.text = text;\r
- this.page = page;\r
- this.pager = pager;\r
- }\r
- \r
- public boolean isLink() {\r
- return page>0;\r
- }\r
- \r
- public boolean isCurrent() {\r
- return (pager.getCurrentPageNum()==page);\r
- }\r
- \r
- public String getText() {\r
- return text;\r
- }\r
- \r
- public int getPage() {\r
- return page;\r
- }\r
- \r
- public int getStart() {\r
- return pager.getPageSize()*(page-1);\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.controls;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Commands;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Responses;\r
-\r
-public class ResultsPager implements Serializable {\r
-\r
- private static final long serialVersionUID = 8854795222615583071L;\r
- private Pazpar2Responses data = null;\r
- private int pageRangeLength = 13;\r
- private Pazpar2Commands req;\r
- \r
- public ResultsPager(Pazpar2Responses data) {\r
- this.data = data; \r
- }\r
- \r
- public ResultsPager(Pazpar2Responses data, int pageRange, Pazpar2Commands req) {\r
- this.data = data;\r
- this.pageRangeLength = pageRange;\r
- this.req = req;\r
- }\r
- \r
- private boolean hasHits () {\r
- return (data.getShow().getMerged()>0);\r
- }\r
- \r
- public int getCurrentPageNum () {\r
- if (hasHits() && data.getShow().getNum()>0) { \r
- return (data.getShow().getStart()/data.getShow().getNum())+1;\r
- } else {\r
- return 0;\r
- }\r
- }\r
- \r
- public int getPageSize() {\r
- return data.getShow().getNum();\r
- }\r
- \r
- public int getFirstDisplayedPageNum () {\r
- if (hasHits()) {\r
- if (getCurrentPageNum() - (pageRangeLength/2) < 1) {\r
- return 1;\r
- } else {\r
- return (getCurrentPageNum()-(pageRangeLength/2));\r
- }\r
- } else {\r
- return 0;\r
- }\r
- }\r
- \r
- public int getLastDisplayedPageNum () {\r
- if (hasHits()) {\r
- if ((getFirstDisplayedPageNum() + pageRangeLength-1) > getLastPageNum()) {\r
- return getLastPageNum();\r
- } else {\r
- return getFirstDisplayedPageNum() + pageRangeLength - 1;\r
- }\r
- } else {\r
- return 0;\r
- }\r
- }\r
- \r
- public int getLastPageNum () {\r
- if (hasHits()) {\r
- return (int) Math.ceil(new Double(data.getShow().getMerged())/new Double(data.getShow().getNum()));\r
- } else {\r
- return 0;\r
- }\r
- }\r
- \r
- public List<PageLink> setPageLinks (int rangeLength) {\r
- this.pageRangeLength = rangeLength;\r
- return getPageLinks();\r
- }\r
- \r
- public List<PageLink> getPageLinks () { \r
- ArrayList<PageLink> range = new ArrayList<PageLink>();\r
- if (hasHits()) {\r
- for (int i = getFirstDisplayedPageNum(); i>0 && i<=getLastDisplayedPageNum();i++) {\r
- range.add(new PageLink(i+"",i,this));\r
- }\r
- }\r
- return range;\r
- }\r
-\r
- \r
- public PageLink getPreviousPageLink (String text) { \r
- String linkText = (text!=null && text.length()>0 ? text : "Prev");\r
- if (hasHits() && getCurrentPageNum()>1) { \r
- return new PageLink(linkText,getCurrentPageNum()-1,this);\r
- } else {\r
- return new PageLink(linkText,0,this);\r
- }\r
- }\r
- \r
- public PageLink getNextPageLink (String text) { \r
- String linkText = (text!=null && text.length()>0 ? text : "Next");\r
- if (hasHits() && getCurrentPageNum()<getLastPageNum()) {\r
- return new PageLink(linkText,getCurrentPageNum()+1,this);\r
- } else {\r
- return new PageLink(linkText,0,this);\r
- } \r
- }\r
- \r
- public int getCurrentPage() {\r
- return (data.getShow().getStart()/getPageSize()+1);\r
- }\r
- \r
- public void goToPage(int page) { \r
- req.getShow().setStart((page-1)*getPageSize());\r
- }\r
- \r
- public void goToPreviousPage() {\r
- if (hasPreviousPage()) {\r
- goToPage(getCurrentPage()-1); \r
- } \r
- }\r
- \r
- public void goToNextPage() {\r
- if (hasNextPage()) {\r
- goToPage(getCurrentPage()+1);\r
- }\r
- }\r
- \r
- public boolean hasPreviousPage() {\r
- return getCurrentPage()>1;\r
- }\r
- \r
- public boolean hasNextPage () {\r
- return getCurrentPage() < getLastPageNum();\r
- }\r
- \r
- public boolean hasPageAfterLastDisplayed() {\r
- return getLastDisplayedPageNum() < getLastPageNum();\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.errors;\r
-\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper.ErrorCode;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Error;\r
-\r
-\r
-public class ConfigurationError implements ErrorInterface {\r
-\r
- private static final long serialVersionUID = -6599667223782130838L;\r
- private String label;\r
- private String message;\r
- private String exception;\r
- private ErrorHelper helper;\r
- private ErrorCode applicationErrorCode;\r
- \r
- public ConfigurationError(String label, String exception, String message) {\r
- this.label = label;\r
- this.message = message; \r
- this.exception = exception;\r
- }\r
- \r
- public List<String> getSuggestions() {\r
- return helper.getSuggestions(this);\r
- }\r
-\r
- @Override\r
- public String getLabel() {\r
- return label;\r
- }\r
-\r
- @Override\r
- public String getMessage() {\r
- return message;\r
- }\r
- \r
- @Override\r
- public String getException() {\r
- return exception;\r
- }\r
- \r
- @Override\r
- public void setErrorHelper (ErrorHelper helper) {\r
- this.helper = helper;\r
- }\r
-\r
- @Override\r
- public void setApplicationErrorCode(ErrorCode code) {\r
- this.applicationErrorCode = code;\r
- }\r
-\r
- @Override\r
- public ErrorCode getApplicationErrorCode() {\r
- return applicationErrorCode;\r
- }\r
- \r
- public boolean hasPazpar2Error () {\r
- return false;\r
- }\r
- \r
- public Pazpar2Error getPazpar2Error() {\r
- return null;\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.errors;\r
-\r
-public class ConfigurationException extends Exception {\r
-\r
- private static final long serialVersionUID = -2406313397798065423L;\r
-\r
- public ConfigurationException() {\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
- public ConfigurationException(String message) {\r
- super(message);\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
- public ConfigurationException(Throwable cause) {\r
- super(cause);\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
- public ConfigurationException(String message, Throwable cause) {\r
- super(message, cause);\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.errors;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.inject.Inject;\r
-import javax.inject.Named;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Responses;\r
-\r
-@Named("errors") @SessionScoped\r
-public class ErrorCentral implements Serializable {\r
-\r
- private static final long serialVersionUID = -1658192041068396628L;\r
- private static Logger logger = Logger.getLogger(ErrorCentral.class); \r
- private ErrorHelper errorHelper = null;\r
- \r
- @Inject Pazpar2Responses pzresp;\r
- @Inject ConfigurationReader configurator;\r
- \r
- private List<ErrorInterface> configurationErrors = new ArrayList<ErrorInterface>();\r
-\r
- public ErrorCentral() {}\r
- \r
- @PostConstruct \r
- public void postConstruct() {\r
- errorHelper = new ErrorHelper(configurator);\r
- pzresp.setErrorHelper(errorHelper); \r
- }\r
- \r
- public void addConfigurationError (ErrorInterface configError) {\r
- configError.setErrorHelper(errorHelper);\r
- configurationErrors.add(configError);\r
- }\r
- \r
- public boolean hasConfigurationErrors () {\r
- return (configurationErrors.size()>0); \r
- }\r
-\r
- public boolean hasCommandErrors () {\r
- return pzresp.hasApplicationError();\r
- }\r
- \r
- public ErrorInterface getCommandError () {\r
- return pzresp.getCommandError();\r
- }\r
-\r
- /**\r
- * Returns true if application error found in any response data objects \r
- */\r
- public boolean hasErrors () {\r
- logger.debug("Checking for configuration errors or command errors.");\r
- return hasConfigurationErrors() || hasCommandErrors();\r
- }\r
- \r
- public List<ErrorInterface> getConfigurationErrors() { \r
- return configurationErrors;\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.errors;\r
-\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-public class ErrorHelper implements Serializable {\r
-\r
- public enum ErrorCode {PAZPAR2_404, \r
- PAZPAR2_UNEXPECTED_RESPONSE,\r
- PAZPAR2_ERRORS,\r
- LOCAL_SERVICE_DEF_FILE_NOT_FOUND,\r
- REMOTE_SERVICE_DEF_NOT_FOUND,\r
- LOCAL_SETTINGS_FILE_NOT_FOUND,\r
- MASTERKEY_CONFIG_FILE_NOT_FOUND,\r
- MISSING_MANDATORY_PROPERTY,\r
- MISSING_MK2_CONFIG_INIT_PARAMETER,\r
- MISSING_CONTEXT_PARAMETER,\r
- NOT_RESOLVED,\r
- SKIP_SUGGESTIONS};\r
-\r
- private static final long serialVersionUID = 2860804561068279131L;\r
- private static Pattern httpResponsePattern = Pattern.compile("Unexpected HTTP response code \\(([0-9]*)\\).*");\r
- \r
- private static Logger logger = Logger.getLogger(ErrorHelper.class);\r
- \r
- private ConfigurationReader configurator = null;\r
- \r
- public ErrorHelper(ConfigurationReader configurator) {\r
- this.configurator = configurator;\r
- }\r
- \r
- public ErrorHelper.ErrorCode getErrorCode(ErrorInterface appError) {\r
- String errmsg = appError.getMessage();\r
- if (appError.hasPazpar2Error()) {\r
- if (appError.getPazpar2Error().getMsg().contains("target settings from file")) {\r
- return ErrorCode.LOCAL_SETTINGS_FILE_NOT_FOUND;\r
- } else {\r
- return ErrorCode.PAZPAR2_ERRORS;\r
- }\r
- } else if (errmsg.startsWith("Unexpected HTTP response")) {\r
- Matcher m = httpResponsePattern.matcher(appError.getMessage());\r
- if (m.matches()) {\r
- String errorCode = m.group(1);\r
- if (errorCode.equals("404")) {\r
- return ErrorCode.PAZPAR2_404;\r
- } else {\r
- return ErrorCode.PAZPAR2_UNEXPECTED_RESPONSE;\r
- }\r
- } \r
- } else if (errmsg.contains("Configuration file") & appError.getMessage().contains("properties")) {\r
- return ErrorCode.MASTERKEY_CONFIG_FILE_NOT_FOUND; \r
- } else if (errmsg.contains("Error reading service definition XML")) {\r
- return ErrorCode.LOCAL_SERVICE_DEF_FILE_NOT_FOUND; \r
- } else if (errmsg.contains("Cannot query Pazpar2 while there are configuration errors")) {\r
- return ErrorCode.SKIP_SUGGESTIONS;\r
- } else if (errmsg.contains("Missing mandatory parameter")) {\r
- return ErrorCode.MISSING_MANDATORY_PROPERTY;\r
- } else if (errmsg.contains("ConfigureByMk2Config") && errmsg.contains("Init parameter") && (errmsg.contains("missing"))) { \r
- return ErrorCode.MISSING_MK2_CONFIG_INIT_PARAMETER;\r
- } else if (appError.getMessage().contains("WebXmlConfigReader could not find mandatory context-param")) {\r
- return ErrorCode.MISSING_CONTEXT_PARAMETER;\r
- }\r
- return ErrorCode.NOT_RESOLVED;\r
- }\r
- \r
- public ArrayList<String> getSuggestions(ErrorInterface error) {\r
- ArrayList<String> suggestions = new ArrayList<String>();\r
- ErrorCode code = getErrorCode(error);\r
- switch (code) {\r
- case MISSING_MK2_CONFIG_INIT_PARAMETER:\r
- suggestions.add("A mandatory init parameter (context-param) was not found in the deployment descriptor (web.xml)." +\r
- " Following init parameters must be present when using the MasterKey configuration scheme (ConfigureByMk2Config):" +\r
- " MASTERKEY_ROOT_CONFIG_DIR (i.e. '/etc/masterkey'), MASTERKEY_COMPONENT_CONFIG_DIR (i.e. '/myapp'), " +\r
- " MASTERKEY_CONFIG_FILE_NAME (i.e. 'myapp.properties'"); \r
- break;\r
- case MISSING_CONTEXT_PARAMETER:\r
- suggestions.add("A mandatory init parameter (context-param) was not found in the deployment descriptor (web.xml)." +\r
- " Following init parameters must be present when using WebXmlConfigReader:" +\r
- " PAZPAR2_URL, PAZPAR2_SERVICE_ID"); \r
- break;\r
- case MISSING_MANDATORY_PROPERTY:\r
- suggestions.add("A mandatory configuration parameter was not found in the MK2 config properties" +\r
- " file used. Please check the property file for the parameter given in the error message ");\r
- addConfigurationDocumentation(suggestions);\r
- break; \r
- case MASTERKEY_CONFIG_FILE_NOT_FOUND: \r
- suggestions.add("The main configuration file that is looked up using parameters" +\r
- " in web.xml (MASTERKEY_ROOT_CONFIG_DIR,MASTERKEY_COMPONENT_CONFIG_DIR,MASTERKEY_CONFIG_FILE_NAME)" +\r
- " could not be found. Please check the web.xml parameters and the expected file system location. "); \r
- break;\r
- case LOCAL_SERVICE_DEF_FILE_NOT_FOUND:\r
- suggestions.add("The service definition file could not be loaded.");\r
- suggestions.add("Please check the configuration and verify that the file exists");\r
- addConfigurationDocumentation(suggestions); \r
- break;\r
- case REMOTE_SERVICE_DEF_NOT_FOUND:\r
- break;\r
- case LOCAL_SETTINGS_FILE_NOT_FOUND:\r
- suggestions.add("A configuration using local target settings file was found, but " +\r
- " the file itself could not be found. Please check the configuration.");\r
- addConfigurationDocumentation(suggestions);\r
- break;\r
- case PAZPAR2_404:\r
- suggestions.add("Pazpar2 service not found (404). ");\r
- suggestions.add("Please check the PAZPAR2_URL configuration and verify "\r
- + "that a pazpar2 service is running at the given address.");\r
- addConfigurationDocumentation(suggestions); \r
- break;\r
- case PAZPAR2_UNEXPECTED_RESPONSE:\r
- suggestions.add("Unexpected response code from Pazpar2. " + nl\r
- + "Please check the PAZPAR2_URL configuration and verify "\r
- + "that a pazpar2 service is running at the given address." + nl);\r
- break; \r
- case PAZPAR2_ERRORS:\r
- if (error.hasPazpar2Error()) { \r
- int pz2code = Integer.parseInt(error.getPazpar2Error().getCode());\r
- switch (pz2code) {\r
- case 3:\r
- suggestions.add("The search experienced a problem with the query terms.");\r
- break;\r
- case 12:\r
- suggestions.add("The Pazpar2 server does not have a service defined by the requested ID ");\r
- suggestions.add("Please check the service ID set in the configuration and compare it with the " +\r
- " configuration on the Pazpar2 server-side.");\r
- addConfigurationDocumentation(suggestions); \r
- break;\r
- case 100:\r
- suggestions.add("Pazpar2 Service Proxy error");\r
- suggestions.add("A request was made to the Pazpar2 Service Proxy, but the Service Proxy reports ");\r
- suggestions.add(" that authentication is lacking. Could be no successful authentication request was made or");\r
- suggestions.add(" that the Service Proxy session timed out.");\r
- break;\r
- default:\r
- suggestions.add("Pazpar2 error: " + error.getPazpar2Error().getMsg() + " (Pazpar2 # "+error.getPazpar2Error().getCode()+")");\r
- }\r
- break;\r
- } else {\r
- logger.error("Programming problem. An application error was categorized as a Papzar2 error yet does not have Pazpar2 error information as expected.");\r
- }\r
- break;\r
- case SKIP_SUGGESTIONS:\r
- break; \r
- case NOT_RESOLVED:\r
- suggestions.add("Sorry, no troubleshooting suggestions were written for this error scenario just yet.");\r
- break; \r
- }\r
- return suggestions;\r
- }\r
- \r
- private void addConfigurationDocumentation (ArrayList<String> suggestions) {\r
- suggestions.add("The application was configured using the configurator " + Utils.baseObjectName(configurator));\r
- suggestions.add("This configurator reports that following configuration was used: ");\r
- suggestions.addAll(configurator.document());\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.errors;\r
-\r
-import java.io.Serializable;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper.ErrorCode;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Error;\r
-\r
-\r
-public interface ErrorInterface extends Serializable {\r
- \r
- public String getLabel();\r
- public String getMessage(); \r
- public String getException();\r
- public void setApplicationErrorCode(ErrorCode code);\r
- public ErrorCode getApplicationErrorCode();\r
- public List<String> getSuggestions();\r
- public void setErrorHelper(ErrorHelper helper);\r
- public boolean hasPazpar2Error();\r
- public Pazpar2Error getPazpar2Error();\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-public interface CommandResponse {\r
- public int getStatusCode();\r
- public String getContentType();\r
- public String getResponseString();\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.IOException;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError;\r
-\r
-public class CommandThread extends Thread {\r
-\r
- private static Logger logger = Logger.getLogger(CommandThread.class);\r
- Pazpar2Command command;\r
- SearchClient client;\r
- private ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
- private StringBuilder response = new StringBuilder(""); \r
- \r
- public CommandThread (Pazpar2Command command, SearchClient client) {\r
- this.command = command;\r
- this.client = client;\r
- }\r
- \r
- /**\r
- * Runs the specified command using the specified Pazpar2 client\r
- * Sets the Pazpar2 response as an XML response string to be retrieved by\r
- * getResponse().\r
- * \r
- * In case of an exception, an error response is generated, the document\r
- * element being the same as it would have been if successful (named after\r
- * the command, that is). \r
- * \r
- */\r
- public void run() {\r
- \r
- if (command.getName().equals("search")) {\r
- client.setSearchCommand(command);\r
- }\r
- try {\r
- long start = System.currentTimeMillis();\r
- CommandResponse commandResponse = client.executeCommand(command, baos);\r
- if (commandResponse.getStatusCode()==200) {\r
- response.append(commandResponse.getResponseString()); \r
- } else if (commandResponse.getStatusCode()==417) { \r
- logger.error("Pazpar2 status code 417: " + baos.toString("UTF-8"));\r
- response.append(CommandError.insertPazpar2ErrorXml(command.getName(), "Expectation failed (417)", commandResponse.getResponseString())); \r
- } else {\r
- String resp = baos.toString("UTF-8");\r
- logger.error("Pazpar2 status code was " + commandResponse.getStatusCode() + ": " + resp);\r
- throw new Pazpar2ErrorException(resp,commandResponse.getStatusCode(),resp,null);\r
- } \r
- long end = System.currentTimeMillis(); \r
- logger.debug("Executed " + command.getName() + " in " + (end-start) + " ms." );\r
- } catch (IOException e) {\r
- response.append(CommandError.createErrorXml(command.getName(), "io", e.getMessage())); \r
- logger.error(response.toString());\r
- } catch (Pazpar2ErrorException e) {\r
- response.append(CommandError.createErrorXml(command.getName(), "pazpar2error", e.getMessage())); \r
- logger.error(response.toString());\r
- } catch (Exception e) {\r
- response.append(CommandError.createErrorXml(command.getName(), "general", e.getMessage())); \r
- logger.error(response.toString()); \r
- }\r
- }\r
- \r
- /**\r
- * \r
- * @return Pazpar2 response as an XML string, possibly a generated error XML\r
- */\r
- public String getResponse () {\r
- return response.toString();\r
- }\r
- \r
- public Pazpar2Command getCommand() {\r
- return command;\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.StringTokenizer;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.enterprise.inject.Alternative;\r
-import javax.inject.Inject;\r
-import javax.inject.Named;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.controls.ResultsPager;\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationError;\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper;\r
-import com.indexdata.pz2utils4jsf.errors.ErrorCentral;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandParameter;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Commands;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseParser;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2Responses;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateListener;\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-@Named("pz2") @SessionScoped @Alternative\r
-public class Pz2Bean implements Pz2Interface, StateListener, Serializable {\r
-\r
- private static final long serialVersionUID = 3440277287081557861L;\r
- private static Logger logger = Logger.getLogger(Pz2Bean.class);\r
- private static Logger responseLogger = Logger.getLogger("com.indexdata.pz2utils4jsf.pazpar2.responses");\r
- \r
- protected SearchClient searchClient = null;\r
- \r
- @Inject ConfigurationReader configurator;\r
- @Inject StateManager stateMgr;\r
- @Inject Pazpar2Commands pzreq;\r
- @Inject Pazpar2Responses pzresp;\r
- @Inject ErrorCentral errors;\r
- \r
- protected ResultsPager pager = null; \r
-\r
- \r
- protected ErrorHelper errorHelper = null;\r
- \r
- public Pz2Bean () {\r
- logger.info("Instantiating pz2 bean [" + Utils.objectId(this) + "]"); \r
- }\r
- \r
- @PostConstruct\r
- public void postConstruct() { \r
- logger.debug("in start of Pz2Bean post-construct configurator is " + configurator);\r
- logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");\r
- searchClient = new Pz2Client();\r
- logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" \r
- + Utils.objectId(configurator) + "]" ); \r
- configureClient(searchClient,configurator); \r
- stateMgr.addStateListener(this); \r
- } \r
- \r
- public void configureClient(SearchClient searchClient, ConfigurationReader configReader) {\r
- logger.debug(Utils.objectId(this) + " will configure search client for the session");\r
- try {\r
- searchClient.configure(configReader); \r
- } catch (ConfigurationException e) {\r
- logger.debug("Pz2Bean adding configuration error");\r
- errors.addConfigurationError(new ConfigurationError("Search Client","Configuration",e.getMessage())); \r
- } \r
- logger.info(configReader.document());\r
- pzresp.reset(); \r
- }\r
-\r
- \r
- public void doSearch(String query) {\r
- pzreq.getSearch().setParameter(new CommandParameter("query","=",query)); \r
- doSearch();\r
- }\r
-\r
- public void doSearch() { \r
- stateMgr.hasPendingStateChange("search",false);\r
- pzresp.reset();\r
- // resets some record and show command parameters without \r
- // changing state or creating state change feedback\r
- pzreq.getRecord().removeParametersInState(); \r
- pzreq.getShow().setParameterInState(new CommandParameter("start","=",0)); \r
- logger.debug(Utils.objectId(this) + " is searching using "+pzreq.getCommand("search").getUrlEncodedParameterValue("query"));\r
- doCommand("search"); \r
- }\r
- \r
- /**\r
- * Refreshes 'show', 'stat', 'termlist', and 'bytarget' data object from pazpar2\r
- * \r
- * @return Number of activeclients at the time of the 'show' command.\r
- */\r
- public String update () {\r
- logger.debug("Updating show,stat,termlist,bytarget from pazpar2");\r
- return update("show,stat,termlist,bytarget");\r
- }\r
- \r
- /**\r
- * Refreshes the data objects listed in 'commands' from pazpar2\r
- * \r
- * @param commands\r
- * @return Number of activeclients at the time of the 'show' command\r
- */\r
- public String update (String commands) {\r
- if (! errors.hasConfigurationErrors()) {\r
- if (commandsAreValid(commands)) {\r
- if (hasQuery()) {\r
- handleQueryStateChanges(commands);\r
- logger.debug("Processing request for " + commands); \r
- List<CommandThread> threadList = new ArrayList<CommandThread>();\r
- StringTokenizer tokens = new StringTokenizer(commands,",");\r
- while (tokens.hasMoreElements()) { \r
- threadList.add(new CommandThread(pzreq.getCommand(tokens.nextToken()),searchClient)); \r
- }\r
- for (CommandThread thread : threadList) {\r
- thread.start();\r
- }\r
- for (CommandThread thread : threadList) {\r
- try {\r
- thread.join();\r
- } catch (InterruptedException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
- for (CommandThread thread : threadList) {\r
- String commandName = thread.getCommand().getName();\r
- String response = thread.getResponse();\r
- responseLogger.debug("Response was: " + response);\r
- Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response);\r
- pzresp.put(commandName, responseObject); \r
- }\r
- if (commands.equals("record")) {\r
- logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients());\r
- return pzresp.getRecord().getActiveClients();\r
- } else {\r
- return pzresp.getActiveClients();\r
- } \r
- } else {\r
- logger.debug("Skipped requests for " + commands + " as there's not yet a query."); \r
- pzresp.reset();\r
- return "0";\r
- }\r
- } else {\r
- logger.error("Did not attemt to run command(s) due to a validation error.");\r
- return "0";\r
- }\r
- } else { \r
- logger.error("Did not attempt to execute query since there are configuration errors.");\r
- return "0";\r
- }\r
- \r
- }\r
- \r
- public boolean commandsAreValid(String commands) {\r
- if (commands.equals("record")) {\r
- if (!pzreq.getCommand("record").hasParameterSet("id")) {\r
- logger.error("Attempt to send record command without the id parameter");\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- \r
- public String toggleRecord (String recId) {\r
- if (hasRecord(recId)) {\r
- pzreq.getRecord().removeParameters(); \r
- pzresp.put("record", new RecordResponse());\r
- return "";\r
- } else {\r
- pzreq.getRecord().setId(recId);\r
- return doCommand("record");\r
- }\r
- }\r
- \r
- @Override\r
- public boolean hasRecord (String recId) {\r
- return pzreq.getCommand("record").hasParameters() && pzresp.getRecord().getRecId().equals(recId);\r
- }\r
- \r
- public String getCurrentStateKey () { \r
- return stateMgr.getCurrentState().getKey();\r
- }\r
- \r
- public void setCurrentStateKey(String key) { \r
- stateMgr.setCurrentStateKey(key);\r
- }\r
- \r
- \r
- \r
- protected boolean hasQuery() { \r
- return pzreq.getCommand("search").hasParameterSet("query"); \r
- }\r
- \r
- \r
- public ResultsPager getPager () {\r
- if (pager == null) {\r
- pager = new ResultsPager(pzresp); \r
- } \r
- return pager; \r
- }\r
- \r
- public ResultsPager setPager (int pageRange) {\r
- pager = new ResultsPager(pzresp,pageRange,pzreq);\r
- return pager;\r
- }\r
- \r
- protected void handleQueryStateChanges (String commands) {\r
- if (stateMgr.hasPendingStateChange("search") && hasQuery()) { \r
- logger.debug("Found pending search change. Doing search before updating " + commands); \r
- doSearch();\r
- } \r
- if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) { \r
- logger.debug("Found pending record ID change. Doing record before updating " + commands);\r
- stateMgr.hasPendingStateChange("record",false);\r
- if (pzreq.getCommand("record").hasParameterSet("id")) {\r
- update("record");\r
- } else { \r
- pzresp.put("record", new RecordResponse());\r
- }\r
- }\r
- }\r
- \r
- protected String doCommand(String commandName) { \r
- logger.debug(pzreq.getCommand(commandName).getEncodedQueryString() + ": Results for "+ pzreq.getCommand("search").getEncodedQueryString());\r
- return update(commandName);\r
- }\r
- \r
- @Override\r
- public void stateUpdated(String commandName) {\r
- logger.debug("State change reported for [" + commandName + "]");\r
- if (commandName.equals("show")) {\r
- logger.debug("Updating show");\r
- update(commandName);\r
- } \r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.IOException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
-import com.indexdata.masterkey.config.ModuleConfigurationGetter;\r
-import com.indexdata.masterkey.pazpar2.client.ClientCommand;\r
-import com.indexdata.masterkey.pazpar2.client.Pazpar2Client;\r
-import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientConfiguration;\r
-import com.indexdata.masterkey.pazpar2.client.Pazpar2ClientGeneric;\r
-import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
-import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
-import com.indexdata.masterkey.pazpar2.client.exceptions.ProxyErrorException;\r
-import com.indexdata.pz2utils4jsf.config.Configuration;\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-public class Pz2Client implements SearchClient {\r
-\r
- private static final long serialVersionUID = 5414266730169982028L;\r
- private static Logger logger = Logger.getLogger(Pz2Client.class);\r
- private Pazpar2Client client = null;\r
- private Pazpar2ClientConfiguration cfg = null;\r
- public static final String MODULENAME = "pz2client";\r
- public static Map<String,String> DEFAULTS = new HashMap<String,String>();\r
- Configuration config = null;\r
- \r
- static { \r
- DEFAULTS.put("PROXY_MODE","1");\r
- DEFAULTS.put("SERIALIZE_REQUESTS", "false");\r
- DEFAULTS.put("STREAMBUFF_SIZE", "4096");\r
- DEFAULTS.put("PARSE_RESPONSES", "true"); \r
- }\r
- \r
- public Pz2Client() {}\r
- \r
- @Override\r
- public void configure(ConfigurationReader configReader) throws ConfigurationException { \r
- logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader));\r
- try {\r
- config = configReader.getConfiguration(this);\r
- cfg = new Pazpar2ClientConfiguration(new ConfigurationGetter(config));\r
- } catch (ProxyErrorException pe) {\r
- logger.error("Could not configure Pazpar2 client: " + pe.getMessage());\r
- throw new ConfigurationException("Could not configure Pz2Client: "+ pe.getMessage(),pe);\r
- } \r
- if (cfg != null) {\r
- try {\r
- client = new Pazpar2ClientGeneric(cfg); \r
- } catch (ProxyErrorException pe) {\r
- logger.error("Could not configure Pazpar2 client: " + pe.getMessage());\r
- throw new ConfigurationException("Could not configure Pz2Client: "+ pe.getMessage(),pe);\r
- }\r
- } else {\r
- logger.error("There was a problem creating Pz2Client. Client is null after configuration.");\r
- throw new ConfigurationException("Pazpar2Client is null after configuration");\r
- } \r
- }\r
- \r
- public boolean isAuthenticatingClient () {\r
- return false;\r
- }\r
- \r
- public boolean isAuthenticated() {\r
- return false;\r
- }\r
- \r
- public boolean authenticate() {\r
- throw new UnsupportedOperationException("No authentication mechanism for straight pazpar2 client");\r
- }\r
- \r
- @Override\r
- public void setSearchCommand(Pazpar2Command command) {\r
- ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
- client.setSearchCommand(clientCommand); \r
- }\r
-\r
- @Override\r
- public CommandResponse executeCommand(Pazpar2Command command, ByteArrayOutputStream baos) \r
- throws Pazpar2ErrorException, IOException {\r
- ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
- Pazpar2HttpResponse pz2HttpResponse = client.executeCommand(clientCommand, baos);\r
- return new Pz2CommandResponse(pz2HttpResponse,baos);\r
- }\r
-\r
- public Pz2Client cloneMe() {\r
- logger.debug("Cloning Pz2Client");\r
- Pz2Client clone = new Pz2Client();\r
- clone.client = this.client;\r
- clone.cfg = this.cfg;\r
- return clone;\r
- }\r
-\r
- @Override\r
- public Map<String, String> getDefaults() {\r
- return DEFAULTS;\r
- }\r
-\r
- @Override\r
- public String getModuleName() {\r
- return MODULENAME;\r
- }\r
- \r
- class ConfigurationGetter implements ModuleConfigurationGetter {\r
- Configuration config = null;\r
- ConfigurationGetter(Configuration configuration) {\r
- config = configuration;\r
- }\r
- @Override\r
- public String get(String value) {\r
- return config.get(value);\r
- }\r
- @Override\r
- public String get(String value, String defaultValue) {\r
- return config.get(value,defaultValue);\r
- }\r
- @Override\r
- public String getMandatory(String name)\r
- throws MissingMandatoryParameterException {\r
- return config.getMandatory(name);\r
- }\r
- @Override\r
- public String getConfigFilePath() {\r
- return config.getConfigFilePath();\r
- }\r
- }\r
-\r
- @Override\r
- public List<String> documentConfiguration() {\r
- List<String> doc = new ArrayList<String>();\r
- doc.add(nl+ MODULENAME + " was configured to access Pazpar2 at : " + cfg.PAZPAR2_URL); \r
- return new ArrayList<String>();\r
- }\r
- \r
- public Configuration getConfiguration () {\r
- return config;\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.UnsupportedEncodingException;\r
-\r
-import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
-\r
-public class Pz2CommandResponse implements CommandResponse {\r
- \r
- private Pazpar2HttpResponse pz2httpResponse = null;\r
- private ByteArrayOutputStream content = null;\r
- \r
- public Pz2CommandResponse(Pazpar2HttpResponse pz2response, ByteArrayOutputStream content) {\r
- pz2httpResponse = pz2response;\r
- this.content = content;\r
- }\r
-\r
- @Override\r
- public int getStatusCode() { \r
- return pz2httpResponse.getStatusCode();\r
- }\r
-\r
- @Override\r
- public String getContentType() {\r
- return pz2httpResponse.getContentType();\r
- }\r
-\r
- @Override\r
- public String getResponseString() {\r
- try {\r
- return content.toString("UTF-8");\r
- } catch (UnsupportedEncodingException e) { \r
- e.printStackTrace();\r
- return null;\r
- }\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.Serializable;\r
-\r
-import com.indexdata.pz2utils4jsf.controls.ResultsPager;\r
-\r
-public interface Pz2Interface extends Serializable {\r
-\r
- /**\r
- * Executes a Pazpar2 search using the given query string\r
- * \r
- * @param query\r
- */\r
- public void doSearch(String query);\r
- \r
- /**\r
- * Executes a Pazpar2 search using the current query \r
- */\r
- public void doSearch();\r
- \r
- /**\r
- * Updates display data objects by issuing the following pazpar2 commands: \r
- * 'show', 'stat', 'termlist' and 'bytarget'.\r
- * \r
- * Returns a count of the remaining active clients from the most recent search.\r
- * \r
- * After refreshing the data from pazpar2 the UI components displaying those \r
- * data should be re-rendered.\r
- * \r
- * @return count of activeclients \r
- */\r
- public String update();\r
- \r
- /**\r
- * Updates the data objects given by a comma separated list of one or more commands - \r
- * i.e. "show,state,termlist,bytarget".\r
- * \r
- * May not be useful for the UI directly. \r
- * \r
- * @param commands Command separated list of pazpar2 commands.\r
- * @return count of activeclients \r
- * \r
- */\r
- public String update (String commands);\r
- \r
- /**\r
- * Will retrieve or remove the record with the given recid from memory.\r
- * \r
- * A pazpar2 'record' command will then be issued. The part of the UI \r
- * showing record data should thus be re-rendered.\r
- * \r
- * @param recid\r
- * @return\r
- */\r
- public String toggleRecord(String recid);\r
- \r
- /**\r
- * Resolves whether the backend has a record with the given recid in memory \r
- * \r
- * @return true if the bean currently holds the record with recid\r
- */ \r
- public boolean hasRecord (String recId);\r
- \r
- \r
- /**\r
- * Initiates a pager object, a component holding the data to draw a sequence\r
- * of page numbers to navigate by and mechanisms to navigate with\r
- * \r
- * @param pageRange number of pages to display in the pager\r
- * @return ResultsPager the initiated pager component\r
- */\r
- public ResultsPager setPager(int pageRange);\r
- \r
- /**\r
- * Gives a component for drawing a pager to navigate by.\r
- * @return ResultsPager pager component\r
- */\r
- public ResultsPager getPager();\r
- \r
- /**\r
- * Returns the current hash key used, as used for internal session state tracking\r
- * and potentially for browser history entries as well\r
- * \r
- * A UI author would not normally be concerned with retrieving this. It's used by the\r
- * framework internally\r
- * \r
- * @return string that can be used for browsers window.location.hash\r
- */\r
- public String getCurrentStateKey ();\r
- \r
- /**\r
- * Sets the current state key, i.e. when user clicks back or forward in browser history.\r
- * Would normally be automatically handled by the frameworks components.\r
- * \r
- * @param key corresponding to browsers hash string\r
- */\r
- public void setCurrentStateKey(String key);\r
- \r
-\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.IOException;\r
-import java.io.UnsupportedEncodingException;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.enterprise.inject.Alternative;\r
-import javax.inject.Inject;\r
-import javax.inject.Named;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.pazpar2.sp.ServiceProxyClient;\r
-import com.indexdata.pz2utils4jsf.pazpar2.sp.ServiceProxyInterface;\r
-import com.indexdata.pz2utils4jsf.pazpar2.sp.auth.ServiceProxyUser;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-@Named("pz2") @SessionScoped @Alternative\r
-public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface {\r
- \r
- private static final long serialVersionUID = 4221824985678758225L;\r
- private static Logger logger = Logger.getLogger(Pz2ProxyBean.class); \r
- private String initDocFileName = "";\r
- private String initDocResponse = "";\r
- private String serviceProxyUrl = ""; \r
- \r
- @Inject ConfigurationReader configurator;\r
- @Inject ServiceProxyUser user; \r
- \r
- public Pz2ProxyBean() {\r
- }\r
- \r
- @PostConstruct\r
- public void postConstruct() {\r
- if (searchClient == null) {\r
- logger.debug(Utils.objectId(this) + " will instantiate a ServiceProxyClient next."); \r
- searchClient = new ServiceProxyClient();\r
- logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" \r
- + Utils.objectId(configurator) + "]" ); \r
- configureClient(searchClient,configurator);\r
- stateMgr.addStateListener(this);\r
- } else {\r
- logger.debug("Pz2ProxyBean:postConstruct: searchClient already instantiated " +\r
- "during construction of parent object Pz2Bean.");\r
- }\r
- }\r
-\r
- @Override\r
- public String login(String navigateTo) {\r
- logger.info("doing login");\r
- ((ServiceProxyClient)searchClient).authenticate(user); \r
- pzreq.getRecord().removeParametersInState();\r
- pzreq.getSearch().removeParametersInState();\r
- pzresp.reset();\r
- return navigateTo;\r
- }\r
-\r
- @Override\r
- public void setServiceProxyUrl(String url) {\r
- logger.info("Setting Service Proxy url: " + url);\r
- serviceProxyUrl = url;\r
- pzreq.getRecord().removeParametersInState();\r
- pzreq.getSearch().removeParametersInState();\r
- pzresp.reset();\r
- }\r
- \r
- public String getServiceProxyUrl() {\r
- return serviceProxyUrl;\r
- }\r
- \r
- public String getInitDocPath () {\r
- return searchClient.getConfiguration().get("INIT_DOC_PATH");\r
- }\r
- \r
- @Override\r
- public void setInitFileName(String fileName) {\r
- this.initDocFileName = fileName;\r
- \r
- }\r
-\r
- @Override\r
- public String getInitFileName() {\r
- return initDocFileName;\r
- }\r
-\r
- @Override\r
- public String postInit() throws UnsupportedEncodingException, IOException { \r
- String initDocPath = ((ServiceProxyClient)searchClient).getInitDocPaths()[0];\r
- logger.info("Paths: " + ((ServiceProxyClient)searchClient).getInitDocPaths());\r
- logger.info("Path: " + initDocPath);\r
- pzresp.reset();\r
- byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDocPath + getInitFileName());\r
- initDocResponse = new String(response,"UTF-8");\r
- return initDocResponse;\r
- }\r
- \r
- @Override\r
- public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException { \r
- pzresp.reset();\r
- byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDoc);\r
- initDocResponse = new String(response,"UTF-8");\r
- return initDocResponse;\r
- }\r
-\r
-\r
- @Override\r
- public String getInitResponse() {\r
- return initDocResponse;\r
- }\r
- \r
- public void setAceFilter(String filterExpression) {\r
- //setCommandParameter("record",new CommandParameter("acefilter","=",filterExpression));\r
- }\r
- \r
- public String getAceFilter () {\r
- return null;\r
- // return getCommandParameterValue("record","acefilter","");\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.IOException;\r
-import java.io.Serializable;\r
-\r
-import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
-import com.indexdata.pz2utils4jsf.config.Configurable;\r
-import com.indexdata.pz2utils4jsf.config.Configuration;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-\r
-public interface SearchClient extends Configurable, Serializable {\r
- \r
- public void setSearchCommand(Pazpar2Command command);\r
- public CommandResponse executeCommand(Pazpar2Command command, ByteArrayOutputStream baos) throws Pazpar2ErrorException, IOException;\r
- \r
- // Use cloneMe() method if injecting the client with CDI.\r
- // The client is used for asynchronously sending off requests\r
- // to the server AND propagation of context to threads is currently \r
- // not supported. Trying to do so throws a WELD-001303 error. \r
- // If propagation to threads gets supported, the cloning can go.\r
- public SearchClient cloneMe();\r
- \r
- public boolean isAuthenticatingClient(); \r
- public Configuration getConfiguration();\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class BytargetCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = 9070458716105294392L;\r
-\r
- public BytargetCommand(StateManager stateMgr) {\r
- super("bytarget",stateMgr);\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import java.io.Serializable;\r
-import java.io.UnsupportedEncodingException;\r
-import java.net.URLEncoder;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandParameter;\r
-\r
-public class CommandParameter implements Serializable {\r
-\r
- private static Logger logger = Logger.getLogger(CommandParameter.class);\r
- \r
- private static final long serialVersionUID = 625502285668766749L;\r
- String name = null;\r
- String operator = null;\r
- String value = null;\r
- Map<String,Expression> expressions = new HashMap<String,Expression>();\r
- \r
- public CommandParameter (String name) {\r
- logger.debug("Instantiating command parameter '" + name + "'");\r
- this.name = name;\r
- }\r
- \r
- public CommandParameter (String name, String operator, String value, Expression... expressions) {\r
- logger.debug("Instantiating command parameter " + name + " with expressions: [" + expressions + "]");\r
- this.name = name;\r
- this.operator = operator;\r
- this.value = value;\r
- for (Expression expr : expressions) {\r
- this.expressions.put(expr.toString(), expr);\r
- }\r
- }\r
-\r
- public CommandParameter (String name, String operator, String value) {\r
- logger.debug("Instantiating command parameter '" + name + "' with String: [" + value + "]");\r
- this.name = name;\r
- this.operator = operator;\r
- this.value = value; \r
- }\r
- \r
- public CommandParameter (String name, String operator, int value) {\r
- logger.debug("Instantiating command parameter '" + name + "' with int: [" + value + "]");\r
- this.name = name;\r
- this.operator = operator;\r
- this.value = value+""; \r
- }\r
-\r
- \r
- public String getName () {\r
- return name;\r
- }\r
- \r
- public Map<String,Expression> getExpressions () {\r
- return expressions;\r
- }\r
- \r
- public void addExpression(Expression expression) {\r
- logger.debug("Adding expression [" + expression + "] to '" + name + "'");\r
- this.expressions.put(expression.toString(),expression);\r
- }\r
- \r
- public void removeExpression(Expression expression) {\r
- this.expressions.remove(expression.toString());\r
- }\r
- \r
- \r
- public boolean hasOperator() {\r
- return operator != null;\r
- }\r
- \r
- public String getEncodedQueryString () {\r
- try {\r
- return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8");\r
- } catch (UnsupportedEncodingException e) {\r
- e.printStackTrace();\r
- return null;\r
- }\r
- }\r
- \r
- public String getSimpleValue() { \r
- return value; \r
- }\r
- \r
- public String getValueWithExpressions () {\r
- StringBuilder completeValue = new StringBuilder((value==null ? "" : value)); \r
- for (String key : expressions.keySet()) { \r
- completeValue.append(" and " + expressions.get(key));\r
- }\r
- return completeValue.toString();\r
- \r
- }\r
- \r
- @Override\r
- public boolean equals (Object otherParameter) {\r
- return\r
- ((otherParameter instanceof CommandParameter)\r
- && this.getValueWithExpressions().equals(((CommandParameter) otherParameter).getValueWithExpressions()));\r
- }\r
- \r
- @Override\r
- public int hashCode () {\r
- return getValueWithExpressions().hashCode();\r
- }\r
- \r
- public String toString() {\r
- return getValueWithExpressions();\r
- }\r
- \r
- public CommandParameter copy() {\r
- logger.debug("Copying parameter '"+ name + "' for modification");\r
- CommandParameter newParam = new CommandParameter(name);\r
- newParam.value = this.value;\r
- newParam.operator = this.operator;\r
- for (String key : expressions.keySet()) {\r
- newParam.addExpression(expressions.get(key).copy()); \r
- }\r
- return newParam;\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Expression;\r
-\r
-public class Expression {\r
- \r
- String leftEntity;\r
- String operator;\r
- String rightEntity;\r
- public Expression (String leftEntity, String operator, String rightEntity) {\r
- this.leftEntity = leftEntity;\r
- this.operator = operator;\r
- this.rightEntity = rightEntity; \r
- }\r
- \r
- public Expression copy() {\r
- return new Expression(leftEntity,operator,rightEntity);\r
- }\r
- \r
- public String toString() {\r
- return leftEntity + operator + rightEntity;\r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class InitCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = -4915976465898889987L;\r
-\r
- public InitCommand(StateManager stateMgr) {\r
- super("init",stateMgr);\r
- }\r
- \r
- public void setClear(String clear) { \r
- setParameter(new CommandParameter("clear","=",clear));\r
- }\r
- \r
- public void setService(String serviceId) { \r
- setParameter(new CommandParameter("service","=",serviceId));\r
- }\r
- \r
- @Override\r
- public void setSession (String sessionId) {\r
- throw new UnsupportedOperationException("Cannot set session id on init command");\r
- }\r
- \r
- @Override\r
- public String getSession () {\r
- throw new UnsupportedOperationException("Cannot set or get session id on init command");\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import java.io.Serializable;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class Pazpar2Command implements Serializable {\r
- \r
- private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
- private static final long serialVersionUID = -6825491856480675917L; \r
- private String name = "";\r
- protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();\r
- \r
- StateManager stateMgr;\r
- \r
- public Pazpar2Command (String name, StateManager stateMgr) {\r
- this.name = name;\r
- if (stateMgr == null) {\r
- // Sets throw-away state\r
- this.stateMgr = new StateManager();\r
- } else {\r
- this.stateMgr = stateMgr;\r
- }\r
- }\r
- \r
- public Pazpar2Command copy () {\r
- Pazpar2Command newCommand = new Pazpar2Command(name,stateMgr);\r
- for (String parameterName : parameters.keySet()) {\r
- newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
- } \r
- return newCommand;\r
- }\r
- \r
- public String getName() {\r
- return name;\r
- }\r
- \r
- public void setParameter (CommandParameter parameter) {\r
- Pazpar2Command copy = this.copy();\r
- logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
- copy.parameters.put(parameter.getName(),parameter);\r
- stateMgr.checkIn(copy);\r
- }\r
- \r
- public void setParameters (CommandParameter... params) {\r
- Pazpar2Command copy = this.copy();\r
- for (CommandParameter param : params) {\r
- logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
- copy.parameters.put(param.getName(),param);\r
- }\r
- stateMgr.checkIn(copy);\r
- }\r
- \r
- public void setParametersInState (CommandParameter... params) { \r
- for (CommandParameter param : params) {\r
- logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
- parameters.put(param.getName(),param);\r
- } \r
- }\r
- \r
- public void setParameterInState (CommandParameter parameter) {\r
- logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
- parameters.put(parameter.getName(),parameter); \r
- }\r
- \r
- \r
- public CommandParameter getParameter (String name) {\r
- return parameters.get(name);\r
- }\r
- \r
- public void removeParameter (String name) {\r
- Pazpar2Command copy = this.copy();\r
- copy.parameters.remove(name);\r
- stateMgr.checkIn(copy);\r
- }\r
- \r
- public void removeParameters() {\r
- Pazpar2Command copy = this.copy();\r
- copy.parameters = new HashMap<String,CommandParameter>();\r
- stateMgr.checkIn(copy);\r
- }\r
- \r
- public void removeParametersInState() {\r
- parameters = new HashMap<String,CommandParameter>(); \r
- }\r
-\r
- \r
- public boolean hasParameters () {\r
- return (parameters.keySet().size()>0);\r
- }\r
- \r
- public boolean hasParameterSet(String parameterName) {\r
- return (parameters.get(parameterName) != null);\r
- }\r
- \r
- public String getEncodedQueryString () {\r
- StringBuilder queryString = new StringBuilder("command="+name);\r
- for (CommandParameter parameter : parameters.values()) {\r
- queryString.append("&"+parameter.getEncodedQueryString()); \r
- }\r
- return queryString.toString();\r
- } \r
- \r
- public String getValueWithExpressions() { \r
- StringBuilder value = new StringBuilder("");\r
- for (CommandParameter parameter : parameters.values()) {\r
- value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions()); \r
- }\r
- return value.toString();\r
- }\r
- \r
- @Override\r
- public boolean equals (Object otherCommand) {\r
- return\r
- ((otherCommand instanceof Pazpar2Command)\r
- && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
- }\r
- \r
- @Override\r
- public int hashCode () {\r
- return getValueWithExpressions().hashCode();\r
- }\r
- \r
- public String toString () {\r
- return parameters.toString();\r
- }\r
-\r
- public String getParameterValue(String parameterName) {\r
- return getParameter(parameterName).getValueWithExpressions();\r
- \r
- }\r
-\r
- public String getUrlEncodedParameterValue(String parameterName) {\r
- return getParameter(parameterName).getEncodedQueryString();\r
- }\r
- \r
- public void setSession (String sessionId) {\r
- setParameter(new CommandParameter("session","=",sessionId));\r
- }\r
- \r
- public String getSession() {\r
- return getParameterValue("session");\r
- } \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import java.io.Serializable;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.inject.Inject;\r
-import javax.inject.Named;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-@Named("pzreq") @SessionScoped\r
-public class Pazpar2Commands implements Serializable {\r
-\r
- private static final long serialVersionUID = -5172466320351302413L;\r
- private static Logger logger = Logger.getLogger(Pazpar2Commands.class);\r
-\r
- public static final String INIT = "init";\r
- public static final String PING = "ping";\r
- public static final String SETTINGS = "settings";\r
- public static final String SEARCH = "search";\r
- public static final String STAT = "stat";\r
- public static final String SHOW = "show";\r
- public static final String RECORD = "record";\r
- public static final String TERMLIST = "termlist";\r
- public static final String BYTARGET = "bytarget";\r
- \r
- @Inject StateManager stateMgr; \r
- \r
- public Pazpar2Commands() {\r
- logger.info("Initializing Pazpar2Commands [" + Utils.objectId(this) + "]");\r
- }\r
- \r
- @PostConstruct\r
- public void postConstruct() {\r
- logger.info("in post-construct stateMgr is " + stateMgr);\r
- }\r
- \r
- public InitCommand getInit() {\r
- return (InitCommand) (stateMgr.getCommand(INIT));\r
- }\r
- \r
- public PingCommand getPing() {\r
- return (PingCommand) (stateMgr.getCommand(PING));\r
- }\r
- \r
- public SettingsCommand getSettings() {\r
- return (SettingsCommand) (stateMgr.getCommand(SETTINGS));\r
- }\r
-\r
- public SearchCommand getSearch() {\r
- return (SearchCommand) (stateMgr.getCommand(SEARCH));\r
- }\r
- \r
- public StatCommand getStat() {\r
- return (StatCommand) (stateMgr.getCommand(STAT));\r
- }\r
- \r
- public ShowCommand getShow() {\r
- return (ShowCommand) (stateMgr.getCommand(SHOW));\r
- }\r
- \r
- public RecordCommand getRecord() {\r
- return (RecordCommand) (stateMgr.getCommand(RECORD));\r
- }\r
-\r
- public TermlistCommand getTermlist() {\r
- return (TermlistCommand) (stateMgr.getCommand(TERMLIST));\r
- }\r
- \r
- public BytargetCommand getBytarget() {\r
- return (BytargetCommand) (stateMgr.getCommand(BYTARGET));\r
- }\r
- \r
- public Pazpar2Command getCommand(String name) {\r
- return stateMgr.getCommand(name);\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class PingCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = 8876721711326535847L;\r
-\r
- public PingCommand(StateManager stateMgr) {\r
- super("ping",stateMgr); \r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class RecordCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = 2817539422114569506L;\r
-\r
- public RecordCommand(StateManager stateMgr) {\r
- super("record",stateMgr);\r
- }\r
- \r
- public void setId(String recId) {\r
- setParameter(new CommandParameter("id","=",recId));\r
- }\r
- \r
- public String getId () {\r
- return getParameterValue("id");\r
- } \r
-\r
- @Override\r
- public RecordCommand copy () {\r
- RecordCommand newCommand = new RecordCommand(stateMgr);\r
- for (String parameterName : parameters.keySet()) {\r
- newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
- } \r
- return newCommand;\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-@SessionScoped\r
-public class SearchCommand extends Pazpar2Command {\r
- \r
- private static final long serialVersionUID = -1888520867838597236L;\r
- private static Logger logger = Logger.getLogger(SearchCommand.class);\r
- private SingleTargetFilter singleTargetFilter = null;\r
- \r
- public SearchCommand(StateManager stateMgr) {\r
- super("search",stateMgr);\r
- }\r
- \r
- public void setQuery(String query) { \r
- setParameter(new CommandParameter("query","=",query));\r
- }\r
- \r
- public String getQuery () { \r
- return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions();\r
- }\r
- \r
- public void setFilter(String filterExpression) {\r
- setParameter(new CommandParameter("filter","=",filterExpression));\r
- }\r
- \r
- public String getFilter() {\r
- return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
- }\r
- \r
- public void addFilter(String filterExpression) {\r
- // TODO: implement\r
- if (hasParameterSet("filter")) {\r
- setFilter(filterExpression);\r
- } else {\r
- getParameter("filter");\r
- }\r
- throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
- }\r
- \r
- public void removeFilters () {\r
- removeParameter("filter");\r
- }\r
- \r
- public void removeFilter(String filterExpression) {\r
- // TODO: implement\r
- throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
- }\r
-\r
- public boolean hasFilter () {\r
- return getFilter().length()>0;\r
- }\r
- \r
- public void setLimit (String limitExpression) {\r
- setParameter(new CommandParameter("limit","=",limitExpression));\r
- }\r
- \r
- public String getLimit () {\r
- return getParameterValue("limit");\r
- }\r
- \r
- public void setStartrecs (String startrecs) {\r
- setParameter(new CommandParameter("startrecs","=",startrecs));\r
- }\r
- \r
- public String getStartrecs () {\r
- return getParameterValue("startrecs");\r
- }\r
- \r
- public void setMaxrecs (String maxrecs) {\r
- setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
- }\r
- \r
- public String getMaxrecs () {\r
- return getParameterValue("maxrecs");\r
- }\r
- \r
- public void setSort () {\r
- setParameter(new CommandParameter("sort","=","sort"));\r
- }\r
- \r
- public String getSort () {\r
- return getParameterValue("sort");\r
- }\r
- \r
- /**\r
- * Sets a facet, in CQL, to restrict the current results,\r
- * then executes the search \r
- * \r
- * @param facetKey i.e. 'au' for author\r
- * @param term i.e. 'Dickens, Charles'\r
- */\r
- public void setFacet(String facetKey, String term) {\r
- if (term != null && term.length()>0) { \r
- getParameter("query").addExpression(new Expression(facetKey,"=",term)); \r
- } \r
- }\r
- \r
- /**\r
- * Sets a facet to limit the current query by. The \r
- * facet is appended to the query string itself (rather\r
- * as a separately managed entity. It will thus appear\r
- * in a query field as retrieved by getQuery(). It will\r
- * not be removed by removeFacet(...)\r
- * \r
- * @param facetKey i.e. 'au' for author\r
- * @param term i.e. 'Dickens, Charles'\r
- */\r
- public void setFacetOnQuery (String facetKey, String term) {\r
- String facetExpression = facetKey + "=" + term; \r
- if (term != null && term.length()>0) {\r
- String currentQuery= getParameterValue("query");\r
- setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression)); \r
- } \r
- }\r
- \r
- /**\r
- * Removes a facet set by setFacet(...), then executes\r
- * the search.\r
- * \r
- * Will not remove facets set by setFacetOnQuery(...)\r
- * \r
- * @param facetKey i.e. 'au' for author\r
- * @param term i.e. 'Dickens, Charles'\r
- */\r
- public void removeFacet(String facetKey, String term) {\r
- if (getParameter("query") != null) {\r
- getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
- }\r
- }\r
- \r
- \r
- /**\r
- * Adds a single target filter to restrict the current query by, \r
- * then executes the current search.\r
- * \r
- * This is a special case of the general setFilter function, \r
- * allowing to associate a descriptive target name with the \r
- * filter expression for display in UI. \r
- * \r
- * @param targetId pazpar2's ID for the target to limit by\r
- * @param targetName a descriptive name for the target\r
- */\r
- public void setSingleTargetFilter (String targetId, String targetName) { \r
- if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
- logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
- } else { \r
- this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
- setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression())); \r
- } \r
- }\r
-\r
- public SingleTargetFilter getSingleTargetFilter () {\r
- logger.debug("request to get the current single target filter");\r
- return singleTargetFilter;\r
- }\r
- \r
- /**\r
- * Removes the current target filter from the search\r
- * \r
- */\r
- public void removeSingleTargetFilter () {\r
- logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
- this.singleTargetFilter = null;\r
- removeParameter("filter"); \r
- }\r
- \r
- /**\r
- * \r
- * @return The target filter set on the current search command\r
- */\r
- public boolean hasSingleTargetFilter() {\r
- logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
- return singleTargetFilter != null; \r
- }\r
-\r
- /**\r
- * Resolves if the current search command has a target filter - to\r
- * be used by the UI for conditional rendering of target filter info.\r
- * \r
- * @return true if the current search command is limited by a target \r
- * filter\r
- */\r
- protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
- return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
- }\r
- \r
- public SearchCommand copy () {\r
- SearchCommand newCommand = new SearchCommand(stateMgr);\r
- for (String parameterName : parameters.keySet()) {\r
- newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
- }\r
- newCommand.singleTargetFilter = this.singleTargetFilter;\r
- return newCommand;\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class SettingsCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = 2291179325470387102L;\r
-\r
- public SettingsCommand(StateManager stateMgr) {\r
- super("settings",stateMgr);\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class ShowCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = -8242768313266051307L;\r
-\r
- public ShowCommand(StateManager stateMgr) {\r
- super("show",stateMgr);\r
- setParameterInState(new CommandParameter("start","=","0"));\r
- }\r
-\r
- /**\r
- * Sets the sort order for results, the updates the 'show' data object\r
- * from pazpar2. Set valid sort options in the documentation for pazpar2.\r
- * \r
- * The parts of the UI that display 'show' data should be rendered following\r
- * this request.\r
- * \r
- * @param sortOption\r
- */\r
- public void setSort (String sort) {\r
- setParameter(new CommandParameter("sort","=",sort));\r
- }\r
- \r
- /**\r
- * Retrieves the current sort order for results\r
- * @return sort order - i.e. 'relevance'\r
- */\r
- public String getSort () {\r
- return getParameter("sort") != null ? getParameter("sort").value : "relevance";\r
- }\r
- \r
- /**\r
- * Sets the number of records that pazpar2 should show at a time. Is \r
- * followed by an update of the show data object from pazpar2. \r
- * \r
- * To be used by the UI for paging. After setting page size the parts\r
- * of the UI that displays 'show' data should be rendered. \r
- * \r
- * @param perPageOption i.e. 10, default is 20.\r
- */\r
- public void setPageSize (String perPageOption) { \r
- setParameters(new CommandParameter("num","=",perPageOption),\r
- new CommandParameter("start","=",0));\r
- }\r
- \r
- /**\r
- * Retrieves the currently defined number of items to show at a time\r
- * \r
- * @return number of result records that will be shown from pazpar2\r
- */\r
- public String getPageSize () {\r
- return getParameter("num") != null ? getParameter("num").value : "20";\r
- }\r
- \r
- /**\r
- * Sets the first record to show - starting at record '0'. After setting\r
- * first record number, the 'show' data object will be updated from pazpar2,\r
- * and the parts of the UI displaying show data should be re-rendered.\r
- * \r
- * To be used by the UI for paging.\r
- * \r
- * @param start first record to show\r
- */\r
- public void setStart (int start) { \r
- setParameter(new CommandParameter("start","=",start)); \r
- }\r
- \r
- /**\r
- * Retrieves the sequence number of the record that pazpaz2 will return as\r
- * the first record in 'show'\r
- * \r
- * @return sequence number of the first record to be shown (numbering starting at '0')\r
- * \r
- */\r
- public int getStart() {\r
- return getParameter("start") != null ? Integer.parseInt(getParameter("start").value) : 0;\r
- }\r
- \r
- public void setNum (int num) {\r
- setParameter(new CommandParameter("num","=",num));\r
- }\r
- \r
- public int getNum () {\r
- return getParameter("num") != null ? Integer.parseInt(getParameter("num").value) : 0;\r
- }\r
- \r
- public ShowCommand copy () {\r
- ShowCommand newCommand = new ShowCommand(stateMgr);\r
- for (String parameterName : parameters.keySet()) {\r
- newCommand.setParameterInState(parameters.get(parameterName).copy()); \r
- } \r
- return newCommand;\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import java.io.Serializable;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.SingleTargetFilter;\r
-\r
-public class SingleTargetFilter implements Serializable {\r
-\r
- private static final long serialVersionUID = 2389085467202526537L;\r
-\r
- private String targetName;\r
- private String targetId;\r
- \r
- public SingleTargetFilter (String targetId, String targetName) {\r
- this.targetId = targetId;\r
- this.targetName = targetName;\r
- }\r
- \r
- public String getTargetName () {\r
- return targetName;\r
- }\r
- \r
- public String getTargetId () {\r
- return targetId; \r
- }\r
- \r
- public String getFilterExpression () {\r
- return "pz:id="+targetId;\r
- }\r
- \r
- @Override\r
- public boolean equals(Object o) {\r
- if (o instanceof SingleTargetFilter) {\r
- return targetName.equals(((SingleTargetFilter) o).getTargetName()) && \r
- targetId.equals(((SingleTargetFilter) o).getTargetId());\r
- } else {\r
- return false;\r
- }\r
- }\r
- \r
- @Override\r
- public int hashCode () {\r
- return (targetId+targetName).hashCode();\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class StatCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = 3980630346114157336L;\r
-\r
- public StatCommand(StateManager stateMgr) {\r
- super("stat",stateMgr);\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.commands;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
-\r
-public class TermlistCommand extends Pazpar2Command {\r
-\r
- private static final long serialVersionUID = -7067878552863021727L;\r
-\r
- public TermlistCommand(StateManager stateMgr) {\r
- super("termlist",stateMgr);\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Target;\r
-\r
-public class ByTarget extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = 3960644950805644518L;\r
- \r
- public List<Target> getTargets() {\r
- List<Target> targets = new ArrayList<Target>();\r
- if (getElements("target") != null) {\r
- for (Pazpar2ResponseData element : getElements("target")) {\r
- targets.add((Target)element);\r
- }\r
- }\r
- return targets;\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.regex.Pattern;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ErrorInterface;\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper;\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper.ErrorCode;\r
-import com.indexdata.utils.XmlUtils;\r
-\r
-/**\r
- * Holds an error encountered during the execution of a command.\r
- * \r
- * An error can be received by a command thread as an exception message \r
- * or as an error XML. In both cases the error (string or xml) will be embedded\r
- * in a new 'applicationerror' element which in turn will be embedded in a\r
- * command XML (i.e. a 'search' or a 'show' response XML) \r
- * \r
- * The command response XML is subsequently parsed by Pazpar2ResponseParser, \r
- * which will then create the CommandError object.\r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-public class CommandError extends Pazpar2ResponseData implements ErrorInterface {\r
-\r
- private static final long serialVersionUID = 8878776025779714122L;\r
- private static Pattern xmlDeclaration = Pattern.compile("<\\?xml.*\\?>");\r
- private ErrorCode applicationErrorCode;\r
- private ErrorHelper errorHelper = null;\r
- \r
- \r
- public CommandError () { \r
- }\r
- \r
- public String getLabel() {\r
- return getOneElementValue("commandname");\r
- }\r
- \r
- public String getMessage() {\r
- if (hasPazpar2Error()) { \r
- return getPazpar2Error().getMsg();\r
- } else { \r
- return getOneElementValue("errormessage");\r
- }\r
- }\r
- \r
- public String getException () {\r
- return getOneElementValue("exception");\r
- }\r
- \r
- public List<String> getSuggestions() { \r
- if (errorHelper!=null) {\r
- return errorHelper.getSuggestions(this);\r
- } else {\r
- List<String> nohelper = new ArrayList<String>();\r
- nohelper.add("Tips: could not generate tips due to a programming error, error helper was not set");\r
- return nohelper;\r
- }\r
- }\r
- \r
- /**\r
- * Creates an XML string error message, embedded in an XML string document named by the command\r
- * This is the XML that Pazpar2ResponseParser will turn into a CommandError object. \r
- * @param commandName\r
- * @param exceptionName\r
- * @param errorMessage\r
- * @return\r
- */\r
- public static String createErrorXml (String commandName, String exceptionName, String errorMessage) {\r
- StringBuilder errorXml = new StringBuilder("");\r
- errorXml.append("<" + commandName + ">"+nl);\r
- errorXml.append(" <applicationerror>"+nl);\r
- errorXml.append(" <commandname>" + commandName + "</commandname>"+nl);\r
- errorXml.append(" <exception>" + XmlUtils.escape(exceptionName) + "</exception>"+nl); \r
- errorXml.append(" <errormessage>" + XmlUtils.escape(errorMessage) + "</errormessage>"+nl); \r
- errorXml.append(" </applicationerror>"+nl);\r
- errorXml.append("</" + commandName + ">"+nl);\r
- return errorXml.toString(); \r
- }\r
- \r
- /**\r
- * Embeds a Pazpar2 (or Pazpar2 client) error response document as a child element of\r
- * a command response document (like 'search' or 'show').\r
- * This is the XML that Pazpar2ResponseParser will turn into a CommandError object.\r
- * \r
- * \r
- * @param commandName The name of the command during which's execution the error was encountered\r
- * @param exceptionName The (possibly loosely defined) name of the exception that was thrown\r
- * @param pazpar2ErrorXml The error document as created by Pazpar2, or the Service Proxy or \r
- * by the Pazpar2 client itself. \r
- * @return\r
- */\r
- public static String insertPazpar2ErrorXml (String commandName, String exceptionName, String pazpar2ErrorXml) {\r
- StringBuilder errorXml = new StringBuilder("");\r
- errorXml.append("<" + commandName + ">"+nl);\r
- errorXml.append(" <applicationerror>"+nl);\r
- errorXml.append(" <commandname>" + commandName + "</commandname>"+nl);\r
- errorXml.append(" <exception>" + XmlUtils.escape(exceptionName) + "</exception>"+nl); \r
- errorXml.append(xmlDeclaration.matcher(pazpar2ErrorXml).replaceAll("")+nl); \r
- errorXml.append(" </applicationerror>"+nl);\r
- errorXml.append("</" + commandName + ">"+nl);\r
- return errorXml.toString(); \r
- \r
- }\r
- \r
- /**\r
- * Sets the object that should be used to analyze the error\r
- * \r
- */\r
- public void setErrorHelper (ErrorHelper errorHelper) {\r
- this.errorHelper = errorHelper; \r
- }\r
-\r
- @Override\r
- public void setApplicationErrorCode(ErrorCode code) {\r
- this.applicationErrorCode = code; \r
- }\r
-\r
- @Override\r
- public ErrorCode getApplicationErrorCode() {\r
- return applicationErrorCode; \r
- }\r
- \r
- public boolean hasPazpar2Error () {\r
- return ( getOneElement("error") != null); \r
- }\r
- \r
- public Pazpar2Error getPazpar2Error() {\r
- return (Pazpar2Error) getOneElement("error");\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Location;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class Hit extends Pazpar2ResponseData {\r
-\r
- \r
- private static final long serialVersionUID = 9039281987691623220L;\r
-\r
- public List<Location> getLocations() {\r
- List<Location> locations = new ArrayList<Location>();\r
- for (Pazpar2ResponseData element : getElements("location")) {\r
- locations.add((Location)element);\r
- }\r
- return locations;\r
- }\r
- \r
- public String getTitle () {\r
- return getOneElementValue("md-title");\r
- }\r
- \r
- public String getTitleRemainder() {\r
- return getOneElementValue("md-title-remainder");\r
- }\r
- \r
- public String getAuthor (String prefix) {\r
- return getOneElement("md-author") != null ? prefix + getOneElement("md-author").getValue() : "";\r
- }\r
- \r
- public String getAuthor () {\r
- return getOneElementValue("md-author");\r
- }\r
- \r
- public String getTitleResponsibility() {\r
- return getOneElementValue("md-title-responsibility");\r
- }\r
- \r
- public String getRecId() {\r
- return getOneElementValue("recid");\r
- }\r
-\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-\r
-public class Location extends Pazpar2ResponseData {\r
- \r
- private static final long serialVersionUID = -1386527442857478225L;\r
-\r
- public String getId() {\r
- return getAttribute("id");\r
- }\r
- \r
- public String getName () {\r
- return getAttribute("name");\r
- }\r
- \r
- public String getSubject() {\r
- return getOneElementValue("md-subject");\r
- }\r
- \r
- public String getSubjects() {\r
- StringBuilder builder = new StringBuilder("");\r
- for (Pazpar2ResponseData data : getElements("md-subject")) {\r
- if (builder.length()==0) {\r
- builder.append(data.getValue());\r
- } else {\r
- builder.append(", ");\r
- builder.append(data.getValue());\r
- }\r
- }\r
- return builder.toString();\r
- }\r
-\r
- public String getAuthor() {\r
- return getOneElementValue("md-author");\r
- }\r
- \r
- public String getAuthors() {\r
- StringBuilder builder = new StringBuilder("");\r
- if (getElements("md-author") != null) {\r
- for (Pazpar2ResponseData data : getElements("md-author")) {\r
- if (builder.length()==0) {\r
- builder.append(data.getValue());\r
- } else {\r
- builder.append(", ");\r
- builder.append(data.getValue());\r
- }\r
- }\r
- }\r
- return builder.toString();\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-public class Pazpar2Error extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = -7060267782024414318L;\r
-\r
- public String getCode() {\r
- return getAttribute("code");\r
- }\r
- \r
- public String getMsg() {\r
- return getAttribute("msg");\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class Pazpar2ResponseData implements Serializable {\r
-\r
- Logger logger = Logger.getLogger(Pazpar2ResponseData.class);\r
- private static final long serialVersionUID = -3909755656714679959L;\r
- String type = null;\r
- HashMap<String,String> attributes = new HashMap<String,String>();\r
- HashMap<String,List<Pazpar2ResponseData>> elements = new HashMap<String,List<Pazpar2ResponseData>>();\r
- String textContent = "";\r
- CommandError error = null;\r
- String xml = null;\r
- \r
- public void setType (String type) {\r
- this.type = type;\r
- }\r
- \r
- public String getType () {\r
- return type;\r
- }\r
- \r
- public void setAttribute (String name, String value) {\r
- attributes.put(name, value);\r
- }\r
- \r
- public String getAttribute (String name) {\r
- return attributes.get(name);\r
- }\r
- \r
- public void addElement (String name, Pazpar2ResponseData value) { \r
- if (elements.containsKey(name)) {\r
- elements.get(name).add(value);\r
- } else {\r
- List<Pazpar2ResponseData> list = new ArrayList<Pazpar2ResponseData>();\r
- list.add(value);\r
- elements.put(name,list);\r
- }\r
- }\r
- \r
- public List<Pazpar2ResponseData> getElements (String name) {\r
- return elements.get(name);\r
- }\r
- \r
- public Pazpar2ResponseData getOneElement (String name) {\r
- if (elements.get(name) != null) {\r
- return elements.get(name).get(0);\r
- } else {\r
- return null;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the text content of the first element found with the given\r
- * name\r
- * @param name of the element \r
- * @return text value, empty string if none found\r
- */\r
- public String getOneElementValue (String name) {\r
- if (getOneElement(name)!=null && getOneElement(name).getValue().length()>0) {\r
- return getOneElement(name).getValue();\r
- } else {\r
- return "";\r
- }\r
- }\r
- \r
- public void appendContent (String content) {\r
- textContent = textContent + content;\r
- }\r
- \r
- public String getValue () {\r
- return textContent;\r
- }\r
- \r
- public String getProperty(String name) {\r
- List<Pazpar2ResponseData> els = elements.get(name);\r
- if (els != null) {\r
- return els.get(0).getValue();\r
- } else { \r
- return null;\r
- }\r
- }\r
- \r
- public int getIntValue(String name) {\r
- String val = getOneElementValue(name);\r
- if (val.length()==0) {\r
- return 0;\r
- } else {\r
- return Integer.parseInt(val);\r
- }\r
- }\r
- \r
- public boolean hasApplicationError () {\r
- return (getOneElement("applicationerror") != null); \r
- }\r
- \r
- public CommandError getApplicationError() {\r
- return (CommandError) getOneElement("applicationerror");\r
- }\r
- \r
- public boolean hasPazpar2Error() {\r
- return hasApplicationError() && getApplicationError().hasPazpar2Error();\r
- }\r
- \r
- public void setXml(String xml) {\r
- this.xml = xml; \r
- }\r
- \r
- public String getXml() {\r
- if (type != null && type.equals("record")) {\r
- logger.debug("Getting XML for "+type + ": "+xml);\r
- } \r
- return xml == null ? "" : xml;\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.IOException;\r
-import java.io.UnsupportedEncodingException;\r
-import java.util.Arrays;\r
-import java.util.List;\r
-import java.util.Stack;\r
-\r
-import javax.xml.parsers.ParserConfigurationException;\r
-import javax.xml.parsers.SAXParser;\r
-import javax.xml.parsers.SAXParserFactory;\r
-\r
-import org.xml.sax.Attributes;\r
-import org.xml.sax.InputSource;\r
-import org.xml.sax.SAXException;\r
-import org.xml.sax.XMLReader;\r
-import org.xml.sax.helpers.DefaultHandler;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Hit;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Location;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.ShowResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.StatResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Target;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListsResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermXTargetResponse;\r
-\r
-public class Pazpar2ResponseParser extends DefaultHandler {\r
-\r
- private XMLReader xmlReader = null;\r
- private Pazpar2ResponseData currentElement = null;\r
- private Stack<Pazpar2ResponseData> dataElements = new Stack<Pazpar2ResponseData>();\r
- private Pazpar2ResponseData result = null;\r
- private String xml = null;\r
-\r
- private static final List<String> docTypes = \r
- Arrays.asList("bytarget","termlist","show","stat","record","search");\r
- \r
- public Pazpar2ResponseParser() { \r
- try {\r
- initSax();\r
- } catch (ParserConfigurationException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- } catch (SAXException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
- \r
- public static Pazpar2ResponseParser getParser() {\r
- return new Pazpar2ResponseParser();\r
- }\r
- \r
- private void initSax() throws ParserConfigurationException, SAXException {\r
- SAXParserFactory spf = SAXParserFactory.newInstance();\r
- spf.setNamespaceAware(true);\r
- SAXParser saxParser = spf.newSAXParser();\r
- xmlReader = saxParser.getXMLReader();\r
- xmlReader.setContentHandler(this); \r
- }\r
- \r
- /**\r
- * Parses a Pazpar2 XML response -- or an error response as XML -- and produces a \r
- * Pazpar2ResponseData object, i.e. a 'show' object\r
- * \r
- * @param response XML response string from Pazpar2\r
- * @return Response data object\r
- */\r
- public Pazpar2ResponseData getDataObject (String response) {\r
- this.xml = response;\r
- try { \r
- xmlReader.parse(new InputSource(new ByteArrayInputStream(response.getBytes("UTF-8"))));\r
- } catch (UnsupportedEncodingException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace(); \r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- } catch (SAXException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace(); \r
- }\r
- return result;\r
- }\r
-\r
- /** \r
- * Receive notification at the start of element \r
- * \r
- */\r
- @Override\r
- public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {\r
- if (localName.equals("show")) {\r
- currentElement = new ShowResponse(); \r
- } else if (localName.equals("hit")) {\r
- currentElement = new Hit();\r
- } else if (localName.equals("location")) {\r
- currentElement = new Location();\r
- } else if (localName.equals("bytarget")) {\r
- currentElement = new ByTarget(); \r
- } else if (localName.equals("target")) {\r
- currentElement = new Target();\r
- } else if (localName.equals("stat")) {\r
- currentElement = new StatResponse(); \r
- } else if (localName.equals("termlist")) {\r
- currentElement = new TermListsResponse(); \r
- } else if (localName.equals("list")) {\r
- currentElement = new TermListResponse();\r
- ((TermListResponse)currentElement).setName(atts.getValue("name"));\r
- ((TermListsResponse)dataElements.peek()).addTermList((TermListResponse)currentElement);\r
- } else if (localName.equals("term")) {\r
- if (dataElements.peek().getAttribute("name").equals("xtargets")) {\r
- currentElement = new TermXTargetResponse(); \r
- } else {\r
- currentElement = new TermResponse();\r
- }\r
- ((TermListResponse)dataElements.peek()).addTerm((TermResponse)currentElement);\r
- } else if (localName.equals("record")) {\r
- currentElement = new RecordResponse(); \r
- } else if (localName.equals("search")) {\r
- currentElement = new SearchResponse();\r
- } else if (localName.equals("applicationerror")) {\r
- currentElement = new CommandError();\r
- } else if (localName.equals("error") && dataElements.peek().getType().equals("applicationerror")) {\r
- currentElement = new Pazpar2Error(); \r
- } else {\r
- currentElement = new Pazpar2ResponseData();\r
- }\r
- currentElement.setType(localName);\r
- for (int i=0; i< atts.getLength(); i++) {\r
- currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i));\r
- }\r
- if (!docTypes.contains(localName)) {\r
- dataElements.peek().addElement(localName, currentElement);\r
- }\r
- if (this.xml != null) { // Store XML for doc level elements\r
- currentElement.setXml(xml);\r
- xml = null;\r
- }\r
- dataElements.push(currentElement); \r
- }\r
- \r
- @Override\r
- public void characters(char[] ch, int start, int length) throws SAXException {\r
- String data = new String(ch, start, length); \r
- dataElements.peek().appendContent(data); \r
- }\r
- \r
- @Override\r
- public void endElement(String namespaceURI, String localName, String qName) throws SAXException {\r
- if (dataElements.size()==1) {\r
- result = dataElements.pop();\r
- } else {\r
- dataElements.pop();\r
- }\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.io.Serializable;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.concurrent.ConcurrentHashMap;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.inject.Named;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.errors.ErrorHelper;\r
-import com.indexdata.pz2utils4jsf.errors.ErrorInterface;\r
-\r
-@Named("pzresp") @SessionScoped\r
-public class Pazpar2Responses implements Serializable {\r
- \r
- private static final long serialVersionUID = -7543231258346154642L;\r
- protected Map<String,Pazpar2ResponseData> dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
- private static Logger logger = Logger.getLogger(Pazpar2Responses.class);\r
- private ErrorHelper errorHelper = null;\r
-\r
- public Pazpar2Responses() { \r
- }\r
- \r
- public void put(String name, Pazpar2ResponseData responseData) {\r
- dataObjects.put(name, responseData);\r
- }\r
- \r
- public void setErrorHelper(ErrorHelper helper) { \r
- this.errorHelper = helper;\r
- }\r
- \r
- public boolean hasApplicationError () {\r
- if (getSearch().hasApplicationError()) {\r
- logger.info("Error detected in search");\r
- return true;\r
- }\r
- for (String name : dataObjects.keySet()) {\r
- if (dataObjects.get(name).hasApplicationError()) {\r
- logger.info("Error detected in " + name);\r
- return true;\r
- }\r
- } \r
- return false;\r
- }\r
- \r
- /**\r
- * Returns a search command error, if any, otherwise the first\r
- * error found for an arbitrary command, if any, otherwise\r
- * an empty dummy error. \r
- */ \r
- public ErrorInterface getCommandError() {\r
- CommandError error = new CommandError();\r
- if (dataObjects.get("search").hasApplicationError()) {\r
- error = dataObjects.get("search").getApplicationError();\r
- error.setErrorHelper(errorHelper);\r
- } else {\r
- for (String name : dataObjects.keySet()) { \r
- if (dataObjects.get(name).hasApplicationError()) { \r
- error = dataObjects.get(name).getApplicationError();\r
- error.setErrorHelper(errorHelper);\r
- break;\r
- } \r
- }\r
- }\r
- return error; \r
- }\r
- \r
- public void reset() {\r
- logger.debug("Resetting show,stat,termlist,bytarget,search response objects.");\r
- dataObjects = new ConcurrentHashMap<String,Pazpar2ResponseData>();\r
- dataObjects.put("show", new ShowResponse());\r
- dataObjects.put("stat", new StatResponse());\r
- dataObjects.put("termlist", new TermListsResponse());\r
- dataObjects.put("bytarget", new ByTarget());\r
- dataObjects.put("record", new RecordResponse());\r
- dataObjects.put("search", new SearchResponse());\r
- }\r
-\r
- public ShowResponse getShow () {\r
- return ((ShowResponse) dataObjects.get("show"));\r
- }\r
- \r
- public StatResponse getStat () {\r
- return ((StatResponse) dataObjects.get("stat"));\r
- }\r
- \r
- public RecordResponse getRecord() {\r
- return ((RecordResponse) dataObjects.get("record"));\r
- }\r
- \r
- public SearchResponse getSearch() {\r
- return ((SearchResponse) dataObjects.get("search"));\r
- }\r
- \r
- public TermListsResponse getTermLists () {\r
- return ((TermListsResponse) dataObjects.get("termlist"));\r
- }\r
- \r
- public List<TermResponse> getFacetTerms (String facet, int count) {\r
- return (getTermLists().getTermList(facet).getTerms(count));\r
- }\r
- \r
- public List<TermResponse> getFacetTerms (String facet) {\r
- return (getTermLists().getTermList(facet).getTerms());\r
- }\r
- \r
- public ByTarget getByTarget() {\r
- return ((ByTarget) dataObjects.get("bytarget"));\r
- }\r
-\r
- public boolean hasRecords () {\r
- return getStat().getRecords() > 0 \r
- && getShow().getHits() != null \r
- && getShow().getHits().size()>0;\r
- }\r
- \r
- public String getActiveClients() { \r
- if (getShow()!=null) {\r
- logger.debug("Active clients: "+getShow().getActiveClients());\r
- return getShow().getActiveClients();\r
- } else {\r
- return "";\r
- }\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Location;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class RecordResponse extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = 6682722004285796002L;\r
-\r
- public String getRecId () {\r
- return getOneElementValue("recid");\r
- }\r
- \r
- public List<Location> getLocations() {\r
- List<Location> locations = new ArrayList<Location>();\r
- for (Pazpar2ResponseData element : getElements("location")) {\r
- locations.add((Location)element);\r
- }\r
- return locations;\r
- }\r
-\r
- public String getTitle() {\r
- return getOneElementValue("md-title");\r
- }\r
- \r
- public String getDate() {\r
- return getOneElementValue("md-date");\r
- }\r
- \r
- public String getAuthor() {\r
- return getOneElementValue("md-author");\r
- }\r
- \r
- public String getSubject() {\r
- return getOneElementValue("md-subject");\r
- }\r
- \r
- public String getSubjects() {\r
- StringBuilder builder = new StringBuilder("");\r
- for (Pazpar2ResponseData data : getElements("md-subject")) {\r
- if (builder.length()==0) {\r
- builder.append(data.getValue());\r
- } else {\r
- builder.append(", ");\r
- builder.append(data.getValue());\r
- }\r
- }\r
- return builder.toString();\r
- }\r
- \r
- public Location getFirstLocation () {\r
- return getLocations().size()>0 ? getLocations().get(0) : null;\r
- }\r
- \r
- public String getActiveClients () {\r
- return getOneElementValue("activeclients");\r
- }\r
-\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-public class SearchResponse extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = -3320013021497018972L;\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Hit;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class ShowResponse extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = 7103554232106330370L;\r
- \r
-\r
- public String getStatus() {\r
- return getOneElementValue("status");\r
- }\r
- \r
- public String getActiveClients () {\r
- return getOneElementValue("activeclients");\r
- }\r
- \r
- public int getMerged () {\r
- return getIntValue("merged");\r
- }\r
- \r
- public String getTotal () {\r
- return getOneElementValue("total"); \r
- }\r
- \r
- public int getStart () {\r
- return getIntValue("start");\r
- }\r
-\r
- public int getNum () {\r
- return getIntValue("num");\r
- }\r
- \r
- public List<Hit> getHits() {\r
- List<Hit> hits = new ArrayList<Hit>();\r
- if (getElements("hit") != null) {\r
- for (Pazpar2ResponseData element : getElements("hit")) {\r
- hits.add((Hit)element);\r
- }\r
- } \r
- return hits;\r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class StatResponse extends Pazpar2ResponseData {\r
- \r
- private static final long serialVersionUID = -6578979787689458761L;\r
-\r
- public int getHits() { \r
- return getProperty("hits")==null ? 0 : Integer.parseInt(getProperty("hits"));\r
- }\r
- \r
- public int getClients () {\r
- return getIntValue("clients");\r
- }\r
- \r
- public int getActiveClients () {\r
- return getIntValue("activeclients");\r
- }\r
-\r
- public int getRecords () {\r
- return getIntValue("records");\r
- }\r
- \r
- public String getUnconnected() {\r
- return getOneElementValue("unconnected");\r
- }\r
- \r
- public String getConnecting() {\r
- return getOneElementValue("connecting");\r
- }\r
- \r
- public String getWorking() {\r
- return getOneElementValue("working");\r
- }\r
- \r
- public String getIdle() {\r
- return getOneElementValue("idle");\r
- }\r
- \r
- public String getFailed() {\r
- return getOneElementValue("failed");\r
- }\r
- \r
- public String getError() {\r
- return getOneElementValue("error");\r
- }\r
- \r
- public String getProgress() {\r
- return getOneElementValue("progress");\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class Target extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = 3343881183545520108L;\r
-\r
- public String getId () {\r
- return getOneElementValue("id");\r
- }\r
- \r
- public String getName() {\r
- return getOneElementValue("name");\r
- }\r
- \r
- public String getHits() {\r
- return getOneElementValue("hits");\r
- }\r
- \r
- public String getDiagnostic() {\r
- return getOneElementValue("diagnostic");\r
- }\r
- \r
- public String getRecords() {\r
- return getOneElementValue("records");\r
- }\r
- \r
- public String getState () {\r
- return getOneElementValue("state");\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;\r
-\r
-public class TermListResponse extends Pazpar2ResponseData {\r
-\r
- private static Logger logger = Logger.getLogger(TermListResponse.class);\r
- private static final long serialVersionUID = 3838585739723097393L;\r
- String name = "";\r
- List<TermResponse> terms = new ArrayList<TermResponse>();\r
- \r
- public String getName() {\r
- return name;\r
- }\r
- \r
- public void setName(String name) {\r
- this.name = name;\r
- }\r
- \r
- public List<TermResponse> getTerms() { \r
- return terms;\r
- }\r
- \r
- public List<TermResponse> getTerms(int count) {\r
- List<TermResponse> firstTerms = new ArrayList<TermResponse>();\r
- for (int i=0; i<count && i<terms.size(); i++) {\r
- firstTerms.add(terms.get(i));\r
- }\r
- logger.trace("Returning " + count + " " + name + " terms: " + firstTerms);\r
- return firstTerms;\r
- }\r
- \r
- public void setTerms(List<TermResponse> terms) {\r
- this.terms = terms;\r
- }\r
- \r
- public void addTerm(TermResponse term) {\r
- terms.add(term);\r
- } \r
- \r
- public String toString () {\r
- return terms.toString();\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListResponse;\r
-\r
-public class TermListsResponse extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = -1370643625715834978L;\r
- private int activeClients = -1;\r
- private Map<String,TermListResponse> termLists = new HashMap<String,TermListResponse>(); \r
- \r
- public int getActiveClients() {\r
- return activeClients;\r
- }\r
- public void setActiveClients(int activeClients) {\r
- this.activeClients = activeClients;\r
- }\r
-\r
- public void addTermList(TermListResponse termList) { \r
- this.termLists.put(termList.getName(),termList);\r
- }\r
- public TermListResponse getTermList(String name) { \r
- return termLists.get(name);\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-\r
-public class TermResponse extends Pazpar2ResponseData {\r
-\r
- private static final long serialVersionUID = -8323959763575180678L;\r
- \r
- protected int frequency = -1;\r
- \r
- public String getName() {\r
- return getProperty("name");\r
- }\r
- public int getFrequency() {\r
- return Integer.parseInt(getProperty("frequency"));\r
- }\r
- \r
- public String toString() {\r
- return getProperty("name");\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;\r
-\r
-public class TermXTargetResponse extends TermResponse {\r
-\r
- private static final long serialVersionUID = 5201902652960804977L;\r
- \r
- public String getId() {\r
- return getOneElement("id").getValue();\r
- }\r
- public int getApproximation () {\r
- return Integer.parseInt(getOneElement("approximation").getValue());\r
- }\r
- public int getRecords () {\r
- return Integer.parseInt(getOneElement("records").getValue());\r
- }\r
- public int getFiltered () {\r
- return Integer.parseInt(getOneElement("filtered").getValue());\r
- }\r
- public String getState () {\r
- return getOneElement("state").getValue();\r
- }\r
- public String getDiagnostic () {\r
- return getOneElement("diagnostic").getValue();\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.sp;\r
-\r
-import static com.indexdata.pz2utils4jsf.utils.Utils.nl;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.File;\r
-import java.io.FileReader;\r
-import java.io.IOException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.http.HttpEntity;\r
-import org.apache.http.HttpResponse;\r
-import org.apache.http.StatusLine;\r
-import org.apache.http.client.ClientProtocolException;\r
-import org.apache.http.client.HttpClient;\r
-import org.apache.http.client.ResponseHandler;\r
-import org.apache.http.client.methods.HttpGet;\r
-import org.apache.http.client.methods.HttpPost;\r
-import org.apache.http.conn.ClientConnectionManager;\r
-import org.apache.http.conn.scheme.PlainSocketFactory;\r
-import org.apache.http.conn.scheme.Scheme;\r
-import org.apache.http.conn.scheme.SchemeRegistry;\r
-import org.apache.http.entity.ByteArrayEntity;\r
-import org.apache.http.entity.FileEntity;\r
-import org.apache.http.impl.client.DefaultHttpClient;\r
-import org.apache.http.impl.conn.PoolingClientConnectionManager;\r
-import org.apache.http.util.EntityUtils;\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.masterkey.config.MissingMandatoryParameterException;\r
-import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
-import com.indexdata.pz2utils4jsf.config.Configuration;\r
-import com.indexdata.pz2utils4jsf.config.ConfigurationReader;\r
-import com.indexdata.pz2utils4jsf.errors.ConfigurationException;\r
-import com.indexdata.pz2utils4jsf.pazpar2.CommandResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.SearchClient;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.CommandParameter;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-import com.indexdata.pz2utils4jsf.pazpar2.sp.auth.AuthenticationEntity;\r
-import com.indexdata.pz2utils4jsf.pazpar2.sp.auth.ServiceProxyUser;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-\r
-public class ServiceProxyClient implements SearchClient {\r
- \r
- private static final long serialVersionUID = -4031644009579840277L;\r
- private static Logger logger = Logger.getLogger(ServiceProxyClient.class);\r
- public static final String MODULENAME = "proxyclient";\r
- public static final String SERVICE_PROXY_URL = "SERVICE_PROXY_URL";\r
- public static final String SP_INIT_DOC_PATHS = "SP_INIT_DOC_PATHS";\r
- private String serviceUrl = "undefined";\r
- private String[] initDocPaths = null;\r
- private Configuration config = null;\r
- \r
- ProxyPz2ResponseHandler handler = new ProxyPz2ResponseHandler();\r
- private HttpClient client;\r
- private ServiceProxyUser user;\r
-\r
- public ServiceProxyClient () {\r
- SchemeRegistry schemeRegistry = new SchemeRegistry();\r
- schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));\r
- ClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);\r
- client = new DefaultHttpClient(cm); \r
- }\r
- \r
- @Override\r
- public void configure (ConfigurationReader configReader) {\r
- logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader));\r
- try {\r
- config = configReader.getConfiguration(this); \r
- serviceUrl = config.getMandatory(SERVICE_PROXY_URL); \r
- this.initDocPaths = getMultiProperty(config.get(SP_INIT_DOC_PATHS)); \r
- } catch (ConfigurationException c) {\r
- c.printStackTrace();\r
- } catch (MissingMandatoryParameterException mmp) {\r
- mmp.printStackTrace();\r
- } \r
- }\r
- \r
- private String[] getMultiProperty(String prop) { \r
- if (prop != null) {\r
- return prop.split(",");\r
- } else {\r
- return null;\r
- }\r
- }\r
- \r
- public boolean authenticate (AuthenticationEntity user) {\r
- try { \r
- logger.info("Authenticating [" + user.getProperty("name") + "]");\r
- this.user = (ServiceProxyUser) user;\r
- Pazpar2Command auth = new Pazpar2Command("auth",null);\r
- auth.setParametersInState(new CommandParameter("action","=","login"), \r
- new CommandParameter("username","=",user.getProperty("name")), \r
- new CommandParameter("password","=",user.getProperty("password")));\r
- byte[] response = send(auth);\r
- String responseStr = new String(response,"UTF-8");\r
- logger.info(responseStr); \r
- if (responseStr.contains("FAIL")) {\r
- return false;\r
- } else {\r
- return true;\r
- } \r
- } catch (ClientProtocolException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- return false;\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- return false;\r
- } \r
- }\r
- \r
- public boolean checkAuthentication () {\r
- try {\r
- Pazpar2Command check = new Pazpar2Command("auth",null);\r
- check.setParameter(new CommandParameter("action","=","check"));\r
- byte[] response = send(check);\r
- logger.info(new String(response,"UTF-8"));\r
- } catch (ClientProtocolException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- return false;\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- return false;\r
- } \r
- return true;\r
- \r
- }\r
- \r
- public boolean isAuthenticatingClient () {\r
- return true;\r
- }\r
- \r
- public boolean isAuthenticated () {\r
- if (user.getProperty("name") != null && user.getProperty("password") != null) {\r
- return checkAuthentication();\r
- } else {\r
- return false;\r
- }\r
- }\r
- \r
- /**\r
- * Makes the request\r
- * @param request\r
- * @return HTTP response as a String\r
- * @throws ClientProtocolException\r
- * @throws IOException\r
- */\r
- private byte[] send(Pazpar2Command command) throws ClientProtocolException, IOException {\r
- String url = serviceUrl + "?" + command.getEncodedQueryString(); \r
- logger.info("Sending request "+url); \r
- HttpGet httpget = new HttpGet(url); \r
- byte[] response = client.execute(httpget, handler); \r
- return response;\r
- }\r
- \r
- public class ProxyPz2ResponseHandler implements ResponseHandler<byte[]> {\r
- private StatusLine statusLine = null;\r
- public byte[] handleResponse(HttpResponse response) throws ClientProtocolException, IOException {\r
- byte[] resp = null;\r
- HttpEntity entity = response.getEntity(); \r
- statusLine = response.getStatusLine();\r
- if (entity != null) { \r
- resp = EntityUtils.toByteArray(entity); \r
- } \r
- EntityUtils.consume(entity);\r
- return resp;\r
- }\r
- public int getStatusCode() {\r
- return statusLine.getStatusCode();\r
- } \r
- public String getReasonPhrase() {\r
- return statusLine.getReasonPhrase();\r
- }\r
- }\r
-\r
- public int getStatusCode () {\r
- return handler.getStatusCode();\r
- }\r
- \r
- public String getReasonPhrase() {\r
- return handler.getReasonPhrase();\r
- }\r
-\r
- @Override\r
- public void setSearchCommand(Pazpar2Command command) {\r
- // Do nothing, Service Proxy is handling this \r
- }\r
-\r
- @Override\r
- public CommandResponse executeCommand(Pazpar2Command command,\r
- ByteArrayOutputStream baos) throws Pazpar2ErrorException, IOException {\r
- byte[] response = send(command);\r
- baos.write(response);\r
- return new ServiceProxyClientCommandResponse(getStatusCode(), new String(response,"UTF-8")); \r
- }\r
-\r
- public ServiceProxyClient cloneMe() {\r
- logger.debug("Cloning Pz2Client");\r
- ServiceProxyClient clone = new ServiceProxyClient();\r
- clone.client = this.client;\r
- clone.serviceUrl = this.serviceUrl;\r
- clone.initDocPaths = this.initDocPaths;\r
- return clone;\r
- }\r
-\r
- @Override\r
- public Map<String, String> getDefaults() { \r
- return new HashMap<String,String>();\r
- }\r
-\r
- @Override\r
- public String getModuleName() {\r
- return MODULENAME;\r
- }\r
- \r
- @Override\r
- public List<String> documentConfiguration () {\r
- List<String> doc = new ArrayList<String>();\r
- doc.add(nl+ MODULENAME + " was configured to access the Pazpar2 service proxy at: " + serviceUrl);\r
- return null;\r
- }\r
- \r
- public byte[] postInitDoc (String filePath) throws IOException {\r
- logger.info("Looking to post the file in : [" + filePath +"]");\r
- HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes");\r
- File initDoc = new File(filePath);\r
- logger.info("Posting to SP: ");\r
- if (logger.isDebugEnabled()) {\r
- BufferedReader reader = new BufferedReader(new FileReader(initDoc));\r
- String line;\r
- while ( (line = reader.readLine()) != null) {\r
- System.out.println(line);\r
- }\r
- reader.close();\r
- }\r
- post.setEntity(new FileEntity(initDoc));\r
- byte[] response = client.execute(post, handler);\r
- logger.debug("Response on POST was: " + new String(response,"UTF-8")); \r
- return response;\r
- }\r
- \r
- public String[] getInitDocPaths () {\r
- logger.debug("Get init doc paths ");\r
- logger.debug("length: " + initDocPaths.length);\r
- return initDocPaths;\r
- }\r
- \r
- public byte[] postInitDoc(byte[] initDoc) throws IOException {\r
- HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes");\r
- post.setEntity(new ByteArrayEntity(initDoc));\r
- byte[] response = client.execute(post, handler);\r
- logger.debug("Response on POST was: " + new String(response,"UTF-8")); \r
- return response;\r
- }\r
- \r
- public void setServiceProxyUrl (String url) {\r
- serviceUrl = url;\r
- }\r
- \r
- public String getServiceProxyUrl () {\r
- return serviceUrl;\r
- }\r
- \r
- public Configuration getConfiguration () {\r
- return config;\r
- }\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.sp;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.CommandResponse;\r
-\r
-public class ServiceProxyClientCommandResponse implements CommandResponse {\r
-\r
- private int statusCode = 0;\r
- private String content = null;\r
- \r
- public ServiceProxyClientCommandResponse(int statusCode, String content) {\r
- this.statusCode = statusCode;\r
- this.content = content;\r
- }\r
-\r
- @Override\r
- public int getStatusCode() {\r
- return statusCode;\r
- }\r
-\r
- @Override\r
- public String getContentType() {\r
- return "text/xml;charset=UTF-8"; \r
- }\r
-\r
- @Override\r
- public String getResponseString() {\r
- return content;\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.sp;\r
-\r
-import java.io.IOException;\r
-import java.io.UnsupportedEncodingException;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.Pz2Interface;\r
-\r
-public interface ServiceProxyInterface extends Pz2Interface { \r
- public String login(String navigateTo); \r
- public void setInitFileName (String fileName); \r
- public String getInitFileName();\r
- public String postInit() throws UnsupportedEncodingException, IOException;\r
- public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException;\r
- public String getInitResponse();\r
- public void setServiceProxyUrl(String url);\r
- public String getServiceProxyUrl();\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.sp.auth;\r
-\r
-import java.io.Serializable;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-public interface AuthenticationEntity extends Serializable{\r
- \r
- \r
- public String getProperty(String key); \r
- \r
- public Map<String,String> getPropertyMap();\r
-\r
- public List<String> getPossibleProperties();\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.sp.auth;\r
-\r
-import java.util.Arrays;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-import javax.inject.Named;\r
-\r
-@Named("user") @SessionScoped\r
-public class ServiceProxyUser implements AuthenticationEntity {\r
-\r
- private static final long serialVersionUID = 2351542518778803071L;\r
- private List<String> possibleProperties = Arrays.asList("name","password","realm");\r
- private Map<String,String> actualProperties = new HashMap<String,String>();\r
-\r
- public ServiceProxyUser() {}\r
- \r
- public void setAuthenticationMethod() {\r
- \r
- }\r
-\r
- public String getName() { \r
- return actualProperties.get("name"); \r
- }\r
- \r
- public void setName(String newValue) { \r
- actualProperties.put("name", newValue); \r
- }\r
- \r
- public String getPassword() { \r
- return actualProperties.get("password"); \r
- }\r
- \r
- public void setPassword(String newValue) { \r
- actualProperties.put("password", newValue);\r
- }\r
- \r
- public void setRealm(String realm) {\r
- actualProperties.put("realm", realm);\r
- }\r
- \r
- public String getRealm() {\r
- return actualProperties.get("realm");\r
- }\r
- \r
-\r
- @Override\r
- public String getProperty(String key) {\r
- return actualProperties.get(key);\r
- }\r
-\r
- @Override\r
- public Map<String, String> getPropertyMap() {\r
- return actualProperties;\r
- }\r
-\r
- @Override\r
- public List<String> getPossibleProperties() {\r
- return possibleProperties;\r
- } \r
- \r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.state;\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.BytargetCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.InitCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Commands;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.PingCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.RecordCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.SearchCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.SettingsCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.ShowCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.StatCommand;\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.TermlistCommand;\r
-\r
-/**\r
- * Holds a 'pazpar2 state', understood as a full set of pazpar2 commands and \r
- * all their parameter settings at a given point in time.\r
- * \r
- * @author Niels Erik\r
- *\r
- */\r
-public class Pazpar2State {\r
-\r
- String key = null;\r
- Map<String,Pazpar2Command> commands = new HashMap<String,Pazpar2Command>();;\r
-\r
- public Pazpar2State (StateManager mgr) {\r
- commands.put(Pazpar2Commands.INIT, new InitCommand(mgr));\r
- commands.put(Pazpar2Commands.PING, new PingCommand(mgr));\r
- commands.put(Pazpar2Commands.SETTINGS, new SettingsCommand(mgr));\r
- commands.put(Pazpar2Commands.SEARCH, new SearchCommand(mgr));\r
- commands.put(Pazpar2Commands.STAT, new StatCommand(mgr));\r
- commands.put(Pazpar2Commands.SHOW, new ShowCommand(mgr));\r
- commands.put(Pazpar2Commands.RECORD, new RecordCommand(mgr));\r
- commands.put(Pazpar2Commands.TERMLIST, new TermlistCommand(mgr));\r
- commands.put(Pazpar2Commands.BYTARGET, new BytargetCommand(mgr)); \r
- key = "#1";\r
- }\r
- \r
- /**\r
- * Creates new state by cloning all commands of the provided state and \r
- * then overriding one of them with the provided state changing command.\r
- * \r
- * @param previousState\r
- * @param newCommand\r
- */\r
- public Pazpar2State (Pazpar2State previousState, Pazpar2Command newCommand) {\r
- for (String commandName : previousState.commands.keySet()) {\r
- this.commands.put(commandName, previousState.commands.get(commandName).copy());\r
- }\r
- this.commands.put(newCommand.getName(),newCommand);\r
- this.key = getKey(); \r
- }\r
- \r
- /**\r
- * Generates a state key that can be used by the browser to pick\r
- * up this state again at a later point in time.\r
- * \r
- * @return\r
- */\r
- public String getKey() {\r
- if (key == null) {\r
- StringBuilder querystatebuilder = new StringBuilder("");\r
- for (Pazpar2Command command : commands.values()) {\r
- if (command.hasParameters()) {\r
- querystatebuilder.append("||"+command.getName()+"::");\r
- querystatebuilder.append(command.getValueWithExpressions());\r
- } \r
- } \r
- key = "#"+querystatebuilder.toString().hashCode();\r
- return key;\r
- } else { \r
- return key;\r
- }\r
- }\r
- \r
- /**\r
- * Checks if a command represents a change of this state\r
- * \r
- * @param command\r
- * @return true if the command causes a change of state\r
- */\r
- public boolean stateMutating (Pazpar2Command command) {\r
- if (command == null) {\r
- return true;\r
- } else if (commands.get(command.getName()) == null) {\r
- return true;\r
- } else if ((command.equals(commands.get(command.getName())))) {\r
- return false; \r
- } else {\r
- return true;\r
- }\r
- } \r
- \r
- /**\r
- * Returns a command from this state\r
- * \r
- * @param name\r
- * @return\r
- */ \r
- public Pazpar2Command getCommand(String name) {\r
- return commands.get(name);\r
- }\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.state;\r
-\r
-public interface StateListener {\r
-\r
- public void stateUpdated(String commandName);\r
- \r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.state;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.enterprise.context.SessionScoped;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
-import com.indexdata.pz2utils4jsf.utils.Utils;\r
-\r
-@SessionScoped\r
-public class StateManager implements Serializable {\r
- \r
- private static final long serialVersionUID = 8152558351351730035L;\r
-\r
- Map<String, Pazpar2State> states = new HashMap<String, Pazpar2State>();\r
- String currentKey = "";\r
- private static List<String> allCommands = new ArrayList<String>(Arrays.asList("init","ping","settings","search","stat","show","record","termlist","bytarget"));\r
- Map<String,Boolean> pendingStateChanges = new HashMap<String,Boolean>();\r
- private static Logger logger = Logger.getLogger(StateManager.class);\r
- private List<StateListener> listeners = new ArrayList<StateListener>();\r
- \r
- public StateManager () {\r
- logger.info("Initializing a Pazpar2 state manager [" + Utils.objectId(this) + "]");\r
- Pazpar2State initialState = new Pazpar2State(this);\r
- states.put(initialState.getKey(), initialState);\r
- currentKey = initialState.getKey();\r
- for (String command : allCommands) {\r
- pendingStateChanges.put(command, new Boolean(false));\r
- }\r
- }\r
- \r
- public void addStateListener(StateListener listener) {\r
- listeners.add(listener);\r
- }\r
- \r
- public void removeStateListener (StateListener listener) {\r
- listeners.remove(listener);\r
- }\r
- \r
- private void updateListeners (String command) {\r
- for (StateListener lsnr : listeners) {\r
- lsnr.stateUpdated(command);\r
- }\r
- }\r
- \r
- /**\r
- * Registers a Pazpar2 command for execution.\r
- * \r
- * The state manager will update current state and flag that\r
- * a request change was made but that it was not yet carried \r
- * out against Pazpar2.\r
- * \r
- * Any command that is created or modified must be checked in\r
- * like this to come into effect.\r
- * \r
- * @param command\r
- */\r
- public void checkIn(Pazpar2Command command) {\r
- if (getCurrentState().stateMutating(command)) {\r
- logger.debug("State changed by: " + command.getName());\r
- Pazpar2State state = new Pazpar2State(getCurrentState(),command);\r
- states.put(state.getKey(), state);\r
- currentKey = state.getKey();\r
- hasPendingStateChange(command.getName(),new Boolean(true)); \r
- logger.debug("Updating " + listeners.size() + " listener(s) with state change from " + command);\r
- updateListeners(command.getName()); \r
- } else {\r
- logger.debug("Command " + command.getName() + " not found to change the state [" + command.getEncodedQueryString() + "]");\r
- }\r
- }\r
- \r
- public Pazpar2Command getCommand (String commandName) {\r
- return getCurrentState().getCommand(commandName);\r
- }\r
- \r
- public Pazpar2State getCurrentState () {\r
- return states.get(currentKey);\r
- }\r
- \r
- /**\r
- * Changes the current state key. Invoked from the UI to have the state \r
- * manager switch to another state than the current one. \r
- * \r
- * @param key\r
- */\r
- public void setCurrentStateKey(String key) { \r
- if (currentKey.equals(key)) {\r
- logger.debug("setCurrentStateKey: no key change detected");\r
- } else {\r
- logger.debug("State key change. Was: [" + currentKey + "]. Will be ["+key+"]");\r
- if (states.get(key)==null) {\r
- logger.error("The back-end received an unknow state key."); \r
- } else {\r
- if (states.get(key).getCommand("search").equals(states.get(currentKey).getCommand("search"))) {\r
- logger.debug("No search change detected");\r
- } else {\r
- hasPendingStateChange("search",true);\r
- }\r
- if (states.get(key).getCommand("record").equals(states.get(currentKey).getCommand("record"))) {\r
- logger.debug("No record change detected");\r
- } else {\r
- hasPendingStateChange("record",true);\r
- }\r
- currentKey = key;\r
- } \r
- }\r
- }\r
-\r
- /**\r
- * Sets a pending-state-change flag for the given command and notifies\r
- * registered listeners. \r
- * \r
- * It is up to the listener to reset the flag as needed.\r
- * \r
- * @param command\r
- * @param bool\r
- */\r
- public void hasPendingStateChange(String command, boolean bool) {\r
- pendingStateChanges.put(command, new Boolean(bool));\r
- }\r
- \r
- /**\r
- * \r
- * @param command\r
- * @return true if there is a non-executed command change in this state\r
- */\r
- public boolean hasPendingStateChange (String command) {\r
- return pendingStateChanges.get(command).booleanValue();\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.pz2utils;\r
-\r
-import java.io.Serializable;\r
-\r
-import javax.enterprise.context.ApplicationScoped;\r
-import javax.inject.Named;\r
-\r
-@Named("pz2watch")\r
-@ApplicationScoped\r
-public class ListenerFieldIds implements Serializable {\r
- \r
- private static final long serialVersionUID = -57079241763914538L;\r
- \r
- public String getHistory () {\r
- return ":pz2watch:stateForm:windowlocationhash";\r
- }\r
- \r
- public String getActiveclients () {\r
- return ":pz2watch:activeclientsForm:activeclientsField";\r
- }\r
- \r
- public String getActiveclientsRecord () {\r
- return ":pz2watch:activeclientsForm:activeclientsFieldRecord";\r
- }\r
- \r
- public String getErrorMessages () {\r
- return ":pz2watch:activeclientsForm:errorMessages";\r
- }\r
-\r
-}\r
+++ /dev/null
-package com.indexdata.pz2utils4jsf.utils;\r
-\r
-public class Utils {\r
- \r
- public static String nl = System.getProperty("line.separator"); \r
-\r
- public static String objectId(Object o) {\r
- int lastdot = o.toString().lastIndexOf('.');\r
- if (lastdot>-1 && lastdot+1<o.toString().length()) {\r
- return o.toString().substring(lastdot+1);\r
- } else {\r
- return o.toString();\r
- }\r
- }\r
- \r
- public static String baseObjectName(Object o) {\r
- String objName = o.getClass().getName();\r
- if (objName.contains("$")) {\r
- return objectId(objName.substring(0,objName.indexOf("$"))); \r
- } else {\r
- return objectId(objName);\r
- }\r
- }\r
-}\r