Renames pz2utils4jsf package to mkjsf
authorNiels Erik G. Nielsen <nielserik@indexdata.com>
Mon, 15 Apr 2013 23:31:43 +0000 (19:31 -0400)
committerNiels Erik G. Nielsen <nielserik@indexdata.com>
Mon, 15 Apr 2013 23:31:43 +0000 (19:31 -0400)
122 files changed:
src/main/java/com/indexdata/mkjsf/config/Configurable.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/config/Configuration.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/config/ConfigurationReader.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/config/Mk2ConfigReader.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/config/WebXmlConfigReader.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/controls/PageLink.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/controls/ResultsPager.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/errors/ConfigurationError.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/errors/ConfigurationException.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/errors/ErrorCentral.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/errors/ErrorHelper.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/errors/ErrorInterface.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/CommandResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/CommandThread.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Client.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2CommandResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Interface.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/SearchClient.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/Expression.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Commands.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/SingleTargetFilter.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/ByTarget.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/CommandError.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Hit.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Error.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseData.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/SearchResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/ShowResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/Target.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListsResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/TermResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/data/TermXTargetResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClientCommandResponse.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/state/Pazpar2State.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/state/StateListener.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/state/StateManager.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pz2utils/ListenerFieldIds.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/utils/Utils.java [new file with mode: 0644]
src/main/java/com/indexdata/pz2utils4jsf/config/Configurable.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/config/Configuration.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/config/ConfigurationReader.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/config/Mk2ConfigReader.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/config/WebXmlConfigReader.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/controls/PageLink.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/controls/ResultsPager.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationError.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationException.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorCentral.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorHelper.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorInterface.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandThread.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Bean.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Client.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2CommandResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Interface.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2ProxyBean.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/SearchClient.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/BytargetCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/CommandParameter.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Expression.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/InitCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Command.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Commands.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/PingCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/RecordCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SearchCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SettingsCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/ShowCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SingleTargetFilter.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/StatCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/TermlistCommand.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ByTarget.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/CommandError.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Hit.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Location.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Error.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseData.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseParser.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Responses.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/RecordResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/SearchResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ShowResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/StatResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Target.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListsResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermXTargetResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClient.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClientCommandResponse.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyInterface.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/AuthenticationEntity.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/ServiceProxyUser.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/Pazpar2State.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateListener.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateManager.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/pz2utils/ListenerFieldIds.java [deleted file]
src/main/java/com/indexdata/pz2utils4jsf/utils/Utils.java [deleted file]

diff --git a/src/main/java/com/indexdata/mkjsf/config/Configurable.java b/src/main/java/com/indexdata/mkjsf/config/Configurable.java
new file mode 100644 (file)
index 0000000..34f841c
--- /dev/null
@@ -0,0 +1,48 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/config/Configuration.java b/src/main/java/com/indexdata/mkjsf/config/Configuration.java
new file mode 100644 (file)
index 0000000..f375318
--- /dev/null
@@ -0,0 +1,79 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/config/ConfigurationReader.java b/src/main/java/com/indexdata/mkjsf/config/ConfigurationReader.java
new file mode 100644 (file)
index 0000000..cb0df8b
--- /dev/null
@@ -0,0 +1,31 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/config/Mk2ConfigReader.java b/src/main/java/com/indexdata/mkjsf/config/Mk2ConfigReader.java
new file mode 100644 (file)
index 0000000..bc57467
--- /dev/null
@@ -0,0 +1,94 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/config/WebXmlConfigReader.java b/src/main/java/com/indexdata/mkjsf/config/WebXmlConfigReader.java
new file mode 100644 (file)
index 0000000..7be0261
--- /dev/null
@@ -0,0 +1,69 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/controls/PageLink.java b/src/main/java/com/indexdata/mkjsf/controls/PageLink.java
new file mode 100644 (file)
index 0000000..ea1a5f1
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/controls/ResultsPager.java b/src/main/java/com/indexdata/mkjsf/controls/ResultsPager.java
new file mode 100644 (file)
index 0000000..3825d1e
--- /dev/null
@@ -0,0 +1,141 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/errors/ConfigurationError.java b/src/main/java/com/indexdata/mkjsf/errors/ConfigurationError.java
new file mode 100644 (file)
index 0000000..575893b
--- /dev/null
@@ -0,0 +1,66 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/errors/ConfigurationException.java b/src/main/java/com/indexdata/mkjsf/errors/ConfigurationException.java
new file mode 100644 (file)
index 0000000..5aded06
--- /dev/null
@@ -0,0 +1,27 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/errors/ErrorCentral.java b/src/main/java/com/indexdata/mkjsf/errors/ErrorCentral.java
new file mode 100644 (file)
index 0000000..5a0875f
--- /dev/null
@@ -0,0 +1,67 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/errors/ErrorHelper.java b/src/main/java/com/indexdata/mkjsf/errors/ErrorHelper.java
new file mode 100644 (file)
index 0000000..e75d663
--- /dev/null
@@ -0,0 +1,164 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/errors/ErrorInterface.java b/src/main/java/com/indexdata/mkjsf/errors/ErrorInterface.java
new file mode 100644 (file)
index 0000000..feb578c
--- /dev/null
@@ -0,0 +1,22 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/CommandResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/CommandResponse.java
new file mode 100644 (file)
index 0000000..dc8d8c0
--- /dev/null
@@ -0,0 +1,7 @@
+package com.indexdata.mkjsf.pazpar2;\r
+\r
+public interface CommandResponse {\r
+  public int getStatusCode();\r
+  public String getContentType();\r
+  public String getResponseString();\r
+}\r
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/CommandThread.java b/src/main/java/com/indexdata/mkjsf/pazpar2/CommandThread.java
new file mode 100644 (file)
index 0000000..ce3df29
--- /dev/null
@@ -0,0 +1,79 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java
new file mode 100644 (file)
index 0000000..43578f8
--- /dev/null
@@ -0,0 +1,246 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Client.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Client.java
new file mode 100644 (file)
index 0000000..2d03830
--- /dev/null
@@ -0,0 +1,150 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2CommandResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2CommandResponse.java
new file mode 100644 (file)
index 0000000..0471b66
--- /dev/null
@@ -0,0 +1,39 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Interface.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Interface.java
new file mode 100644 (file)
index 0000000..1ffd33c
--- /dev/null
@@ -0,0 +1,101 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java
new file mode 100644 (file)
index 0000000..16b4319
--- /dev/null
@@ -0,0 +1,123 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/SearchClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/SearchClient.java
new file mode 100644 (file)
index 0000000..1a67522
--- /dev/null
@@ -0,0 +1,26 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java
new file mode 100644 (file)
index 0000000..57c66de
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java
new file mode 100644 (file)
index 0000000..69c224a
--- /dev/null
@@ -0,0 +1,124 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Expression.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Expression.java
new file mode 100644 (file)
index 0000000..d95ff64
--- /dev/null
@@ -0,0 +1,25 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java
new file mode 100644 (file)
index 0000000..f1f31ef
--- /dev/null
@@ -0,0 +1,31 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java
new file mode 100644 (file)
index 0000000..4fbe159
--- /dev/null
@@ -0,0 +1,148 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Commands.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Commands.java
new file mode 100644 (file)
index 0000000..9e04d6e
--- /dev/null
@@ -0,0 +1,82 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java
new file mode 100644 (file)
index 0000000..05c1934
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java
new file mode 100644 (file)
index 0000000..78d192e
--- /dev/null
@@ -0,0 +1,29 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java
new file mode 100644 (file)
index 0000000..749742e
--- /dev/null
@@ -0,0 +1,202 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java
new file mode 100644 (file)
index 0000000..55a417e
--- /dev/null
@@ -0,0 +1,14 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java
new file mode 100644 (file)
index 0000000..a4e9047
--- /dev/null
@@ -0,0 +1,98 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SingleTargetFilter.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SingleTargetFilter.java
new file mode 100644 (file)
index 0000000..4aea8a2
--- /dev/null
@@ -0,0 +1,47 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java
new file mode 100644 (file)
index 0000000..6b885bc
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java
new file mode 100644 (file)
index 0000000..789186c
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/ByTarget.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/ByTarget.java
new file mode 100644 (file)
index 0000000..e684f9e
--- /dev/null
@@ -0,0 +1,22 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/CommandError.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/CommandError.java
new file mode 100644 (file)
index 0000000..5e07207
--- /dev/null
@@ -0,0 +1,137 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Hit.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Hit.java
new file mode 100644 (file)
index 0000000..8f16eee
--- /dev/null
@@ -0,0 +1,47 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java
new file mode 100644 (file)
index 0000000..a3e6441
--- /dev/null
@@ -0,0 +1,54 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Error.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Error.java
new file mode 100644 (file)
index 0000000..76a54f3
--- /dev/null
@@ -0,0 +1,14 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseData.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseData.java
new file mode 100644 (file)
index 0000000..10451ea
--- /dev/null
@@ -0,0 +1,124 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java
new file mode 100644 (file)
index 0000000..7cf41df
--- /dev/null
@@ -0,0 +1,162 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java
new file mode 100644 (file)
index 0000000..b3748f8
--- /dev/null
@@ -0,0 +1,130 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java
new file mode 100644 (file)
index 0000000..0ba7988
--- /dev/null
@@ -0,0 +1,63 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/SearchResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/SearchResponse.java
new file mode 100644 (file)
index 0000000..27706af
--- /dev/null
@@ -0,0 +1,7 @@
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+public class SearchResponse extends Pazpar2ResponseData {\r
+\r
+  private static final long serialVersionUID = -3320013021497018972L;\r
+  \r
+}\r
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/ShowResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/ShowResponse.java
new file mode 100644 (file)
index 0000000..066a831
--- /dev/null
@@ -0,0 +1,49 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java
new file mode 100644 (file)
index 0000000..9f808b1
--- /dev/null
@@ -0,0 +1,53 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Target.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Target.java
new file mode 100644 (file)
index 0000000..59dd6f7
--- /dev/null
@@ -0,0 +1,33 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListResponse.java
new file mode 100644 (file)
index 0000000..4c00a92
--- /dev/null
@@ -0,0 +1,52 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListsResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermListsResponse.java
new file mode 100644 (file)
index 0000000..27e3e1e
--- /dev/null
@@ -0,0 +1,30 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermResponse.java
new file mode 100644 (file)
index 0000000..e4a40cb
--- /dev/null
@@ -0,0 +1,22 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermXTargetResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/TermXTargetResponse.java
new file mode 100644 (file)
index 0000000..c244516
--- /dev/null
@@ -0,0 +1,28 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java
new file mode 100644 (file)
index 0000000..3724362
--- /dev/null
@@ -0,0 +1,277 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClientCommandResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClientCommandResponse.java
new file mode 100644 (file)
index 0000000..982233e
--- /dev/null
@@ -0,0 +1,30 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java
new file mode 100644 (file)
index 0000000..46d4e77
--- /dev/null
@@ -0,0 +1,17 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java
new file mode 100644 (file)
index 0000000..9f8b0cb
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java
new file mode 100644 (file)
index 0000000..ea0be27
--- /dev/null
@@ -0,0 +1,65 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/state/Pazpar2State.java b/src/main/java/com/indexdata/mkjsf/pazpar2/state/Pazpar2State.java
new file mode 100644 (file)
index 0000000..e983d5c
--- /dev/null
@@ -0,0 +1,107 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/state/StateListener.java b/src/main/java/com/indexdata/mkjsf/pazpar2/state/StateListener.java
new file mode 100644 (file)
index 0000000..d157e47
--- /dev/null
@@ -0,0 +1,7 @@
+package com.indexdata.mkjsf.pazpar2.state;\r
+\r
+public interface StateListener {\r
+\r
+  public void stateUpdated(String commandName);\r
+  \r
+}\r
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/state/StateManager.java b/src/main/java/com/indexdata/mkjsf/pazpar2/state/StateManager.java
new file mode 100644 (file)
index 0000000..f150dd8
--- /dev/null
@@ -0,0 +1,138 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/pz2utils/ListenerFieldIds.java b/src/main/java/com/indexdata/mkjsf/pz2utils/ListenerFieldIds.java
new file mode 100644 (file)
index 0000000..df3652f
--- /dev/null
@@ -0,0 +1,30 @@
+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
diff --git a/src/main/java/com/indexdata/mkjsf/utils/Utils.java b/src/main/java/com/indexdata/mkjsf/utils/Utils.java
new file mode 100644 (file)
index 0000000..4b09747
--- /dev/null
@@ -0,0 +1,24 @@
+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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/config/Configurable.java b/src/main/java/com/indexdata/pz2utils4jsf/config/Configurable.java
deleted file mode 100644 (file)
index ca10556..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/config/Configuration.java b/src/main/java/com/indexdata/pz2utils4jsf/config/Configuration.java
deleted file mode 100644 (file)
index 67106c3..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/config/ConfigurationReader.java b/src/main/java/com/indexdata/pz2utils4jsf/config/ConfigurationReader.java
deleted file mode 100644 (file)
index ea94af5..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/config/Mk2ConfigReader.java b/src/main/java/com/indexdata/pz2utils4jsf/config/Mk2ConfigReader.java
deleted file mode 100644 (file)
index 554f931..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/config/WebXmlConfigReader.java b/src/main/java/com/indexdata/pz2utils4jsf/config/WebXmlConfigReader.java
deleted file mode 100644 (file)
index ac0e045..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/controls/PageLink.java b/src/main/java/com/indexdata/pz2utils4jsf/controls/PageLink.java
deleted file mode 100644 (file)
index e9c4ac0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/controls/ResultsPager.java b/src/main/java/com/indexdata/pz2utils4jsf/controls/ResultsPager.java
deleted file mode 100644 (file)
index e80e1b6..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationError.java b/src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationError.java
deleted file mode 100644 (file)
index ef2969d..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationException.java b/src/main/java/com/indexdata/pz2utils4jsf/errors/ConfigurationException.java
deleted file mode 100644 (file)
index b1336d2..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorCentral.java b/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorCentral.java
deleted file mode 100644 (file)
index a143517..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorHelper.java b/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorHelper.java
deleted file mode 100644 (file)
index 086cd84..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorInterface.java b/src/main/java/com/indexdata/pz2utils4jsf/errors/ErrorInterface.java
deleted file mode 100644 (file)
index c529651..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandResponse.java
deleted file mode 100644 (file)
index 7a92019..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.indexdata.pz2utils4jsf.pazpar2;\r
-\r
-public interface CommandResponse {\r
-  public int getStatusCode();\r
-  public String getContentType();\r
-  public String getResponseString();\r
-}\r
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandThread.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/CommandThread.java
deleted file mode 100644 (file)
index 323ef78..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Bean.java
deleted file mode 100644 (file)
index b12082b..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Client.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Client.java
deleted file mode 100644 (file)
index a00f2d5..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2CommandResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2CommandResponse.java
deleted file mode 100644 (file)
index 0c6ebad..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Interface.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2Interface.java
deleted file mode 100644 (file)
index f0cd6d4..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/Pz2ProxyBean.java
deleted file mode 100644 (file)
index 36e472b..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/SearchClient.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/SearchClient.java
deleted file mode 100644 (file)
index 54b1648..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/BytargetCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/BytargetCommand.java
deleted file mode 100644 (file)
index 720f0a6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/CommandParameter.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/CommandParameter.java
deleted file mode 100644 (file)
index 7630ecd..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Expression.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Expression.java
deleted file mode 100644 (file)
index d412ac9..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/InitCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/InitCommand.java
deleted file mode 100644 (file)
index 09e1bee..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Command.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Command.java
deleted file mode 100644 (file)
index 7ef96bd..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Commands.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/Pazpar2Commands.java
deleted file mode 100644 (file)
index a0397a9..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/PingCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/PingCommand.java
deleted file mode 100644 (file)
index e7eda38..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/RecordCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/RecordCommand.java
deleted file mode 100644 (file)
index 5e2c03b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SearchCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SearchCommand.java
deleted file mode 100644 (file)
index 9b2cece..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SettingsCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SettingsCommand.java
deleted file mode 100644 (file)
index 7aa1128..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/ShowCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/ShowCommand.java
deleted file mode 100644 (file)
index 12dad19..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SingleTargetFilter.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/SingleTargetFilter.java
deleted file mode 100644 (file)
index d495b70..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/StatCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/StatCommand.java
deleted file mode 100644 (file)
index 4f93e50..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/TermlistCommand.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/commands/TermlistCommand.java
deleted file mode 100644 (file)
index cd934b4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ByTarget.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ByTarget.java
deleted file mode 100644 (file)
index 39ccac0..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/CommandError.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/CommandError.java
deleted file mode 100644 (file)
index 64080e3..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Hit.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Hit.java
deleted file mode 100644 (file)
index 6c2504e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Location.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Location.java
deleted file mode 100644 (file)
index 526dda0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Error.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Error.java
deleted file mode 100644 (file)
index 9c2a725..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseData.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseData.java
deleted file mode 100644 (file)
index a6e9265..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseParser.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2ResponseParser.java
deleted file mode 100644 (file)
index 73f0cf5..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Responses.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Pazpar2Responses.java
deleted file mode 100644 (file)
index e18d22a..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/RecordResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/RecordResponse.java
deleted file mode 100644 (file)
index 1667c1f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/SearchResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/SearchResponse.java
deleted file mode 100644 (file)
index 528f871..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-public class SearchResponse extends Pazpar2ResponseData {\r
-\r
-  private static final long serialVersionUID = -3320013021497018972L;\r
-  \r
-}\r
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ShowResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/ShowResponse.java
deleted file mode 100644 (file)
index baed763..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/StatResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/StatResponse.java
deleted file mode 100644 (file)
index c0df51d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Target.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/Target.java
deleted file mode 100644 (file)
index 11526f3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListResponse.java
deleted file mode 100644 (file)
index a4a33fb..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListsResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermListsResponse.java
deleted file mode 100644 (file)
index c060579..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermResponse.java
deleted file mode 100644 (file)
index 5b2e90e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermXTargetResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/data/TermXTargetResponse.java
deleted file mode 100644 (file)
index a435b34..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClient.java
deleted file mode 100644 (file)
index 8c2c2e2..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClientCommandResponse.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyClientCommandResponse.java
deleted file mode 100644 (file)
index ef0c41d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyInterface.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/ServiceProxyInterface.java
deleted file mode 100644 (file)
index ef84cea..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/AuthenticationEntity.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/AuthenticationEntity.java
deleted file mode 100644 (file)
index cd9ee6c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/ServiceProxyUser.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/sp/auth/ServiceProxyUser.java
deleted file mode 100644 (file)
index dbde7bc..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/Pazpar2State.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/Pazpar2State.java
deleted file mode 100644 (file)
index 39ac006..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateListener.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateListener.java
deleted file mode 100644 (file)
index ac7fe8b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.indexdata.pz2utils4jsf.pazpar2.state;\r
-\r
-public interface StateListener {\r
-\r
-  public void stateUpdated(String commandName);\r
-  \r
-}\r
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateManager.java b/src/main/java/com/indexdata/pz2utils4jsf/pazpar2/state/StateManager.java
deleted file mode 100644 (file)
index f1ae6b6..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/pz2utils/ListenerFieldIds.java b/src/main/java/com/indexdata/pz2utils4jsf/pz2utils/ListenerFieldIds.java
deleted file mode 100644 (file)
index a454936..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-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
diff --git a/src/main/java/com/indexdata/pz2utils4jsf/utils/Utils.java b/src/main/java/com/indexdata/pz2utils4jsf/utils/Utils.java
deleted file mode 100644 (file)
index 5273134..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-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