Merge branch 'master' of ssh://git.indexdata.com/home/git/private/mkjsf.git into...
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / data / Responses.java
diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Responses.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Responses.java
new file mode 100644 (file)
index 0000000..90e7f8d
--- /dev/null
@@ -0,0 +1,196 @@
+package com.indexdata.mkjsf.pazpar2.data;\r
+\r
+import java.io.IOException;\r
+import java.io.Serializable;\r
+import java.io.UnsupportedEncodingException;\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.faces.context.ExternalContext;\r
+import javax.faces.context.FacesContext;\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
+import com.indexdata.mkjsf.pazpar2.data.sp.SpResponseDataObject;\r
+import com.indexdata.mkjsf.pazpar2.data.sp.SpResponses;\r
+import com.indexdata.mkjsf.utils.Utils;\r
+\r
+/**\r
+ * Provides references to all current data objects and has general methods for clearing certain response data.\r
+ *  \r
+ * @author Niels Erik\r
+ *\r
+ */\r
+@SessionScoped @Named\r
+public class Responses implements Serializable {\r
+    \r
+  private static final long serialVersionUID = -7543231258346154642L;\r
+  protected Map<String,ResponseDataObject> dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();\r
+  private static Logger logger = Logger.getLogger(Responses.class);\r
+  private ErrorHelper errorHelper = null;\r
+  private SpResponses sp = null;\r
+\r
+  public Responses() {    \r
+  }\r
+  \r
+  public void put(String name, ResponseDataObject 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
+        if (dataObjects.get(name) instanceof SpResponseDataObject &&\r
+           ((SpResponseDataObject)dataObjects.get(name)).unsupportedCommand()) {\r
+            logger.debug("Command  [" + name + "] not supported by this service");                    \r
+        } else {\r
+          logger.info("Error detected in " + name);\r
+          return true;\r
+        }\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
+  /**\r
+   * Empties all data objects populated after a search (including the search response itself)\r
+   * \r
+   */\r
+  public void resetSearchAndBeyond() {\r
+    logger.debug("Resetting show,stat,termlist,bytarget,record,search response objects.");\r
+    dataObjects.put("show", new ShowResponse());\r
+    dataObjects.put("stat", new StatResponse());\r
+    dataObjects.put("termlist", new TermListsResponse());\r
+    dataObjects.put("bytarget", new ByTargetResponse());\r
+    dataObjects.put("record", new RecordResponse());\r
+    dataObjects.put("search", new SearchResponse());\r
+    getSp().resetSearchAndBeyond(false);\r
+  }\r
+  \r
+  /**\r
+   * Empties all data objects populated after a service was initialized, including the init response itself\r
+   * but excluding a possible auth response\r
+   */\r
+  public void resetInitAndBeyond () {\r
+    dataObjects.put("init", new InitResponse());        \r
+    resetSearchAndBeyond();\r
+    getSp().resetInitAndBeyond(false);\r
+  }\r
+    \r
+  public InitResponse getInit () {    \r
+    return ((InitResponse) dataObjects.get("init"));\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 ByTargetResponse getByTarget() {\r
+    return ((ByTargetResponse) dataObjects.get("bytarget"));\r
+  }\r
+\r
+  public ResponseDataObject getResponseObject (String name) {\r
+    return dataObjects.get(name);\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 && getShow().getActiveClients().length()>0) {\r
+      logger.debug("Active clients: "+getShow().getActiveClients());\r
+      return String.valueOf(\r
+                    Math.max(Integer.parseInt(getShow().getActiveClients()),\r
+                             getStat().getActiveClients()));\r
+    } else {\r
+      return "";\r
+    }\r
+  }\r
+\r
+  public void download(String commandName) throws UnsupportedEncodingException, IOException {\r
+    logger.info(Utils.objectId(this) + " got a download request for "\r
+        + commandName);\r
+    ResponseDataObject object = dataObjects.get(commandName);    \r
+    FacesContext facesContext = FacesContext.getCurrentInstance();\r
+    ExternalContext externalContext = facesContext.getExternalContext();\r
+    if (object.getIsBinary()) {\r
+      externalContext.setResponseHeader("Content-Type","application/octet-stream");\r
+      externalContext.setResponseHeader("Content-Length",String.valueOf(object.getBinary().length));\r
+      externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".data\"");\r
+      externalContext.getResponseOutputStream().write(object.getBinary());      \r
+    } else {\r
+      externalContext.setResponseHeader("Content-Type","application/xml; charset=\"utf-8\"");\r
+      externalContext.setResponseHeader("Content-Length",String.valueOf(dataObjects.get(commandName).getXml().getBytes("UTF-8").length));\r
+      externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".xml\"");\r
+      externalContext.getResponseOutputStream().write(dataObjects.get(commandName).getXml().getBytes("UTF-8"));\r
+    }\r
+    facesContext.responseComplete();\r
+  }\r
+  \r
+  public SpResponses getSp() {\r
+    return (sp == null ? new SpResponses(this) : sp);\r
+  }\r
+  \r
+}
\ No newline at end of file