Organizes SP specific responses in separate class
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / data / Responses.java
index 71769c7..e076644 100644 (file)
@@ -12,7 +12,6 @@ import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;\r
 import javax.inject.Named;\r
 \r
-import org.apache.commons.io.FilenameUtils;\r
 import org.apache.log4j.Logger;\r
 \r
 import com.indexdata.mkjsf.errors.ErrorHelper;\r
@@ -27,6 +26,7 @@ public class Responses implements Serializable {
   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
@@ -75,28 +75,27 @@ public class Responses implements Serializable {
     return error;         \r
   }\r
   \r
-  public void resetSearchResponses() {\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 ByTarget());\r
     dataObjects.put("record", new RecordResponse());\r
-    dataObjects.put("search", new SearchResponse());    \r
+    dataObjects.put("search", new SearchResponse());\r
+    getSp().resetSearchAndBeyond(false);\r
   }\r
   \r
-  public void resetAllSessionData () {\r
-    logger.debug("Resetting all response objects");\r
-    dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();    \r
-    resetSearchResponses();\r
-    dataObjects.put("init", new InitResponse());\r
+  public void resetInitAndBeyond () {\r
+    dataObjects.put("init", new InitResponse());        \r
+    resetSearchAndBeyond();\r
+    getSp().resetInitAndBeyond(false);\r
   }\r
-  \r
-  public InitResponse getInit () {\r
-    logger.info("Request to show init response from " + Utils.objectId(this));\r
+    \r
+  public InitResponse getInit () {    \r
     return ((InitResponse) dataObjects.get("init"));\r
   }\r
-\r
+  \r
   public ShowResponse getShow () {\r
     return ((ShowResponse) dataObjects.get("show"));\r
   }\r
@@ -116,7 +115,7 @@ public class Responses implements Serializable {
   public TermListsResponse getTermLists () {\r
     return ((TermListsResponse) dataObjects.get("termlist"));\r
   }\r
-  \r
+    \r
   public List<TermResponse> getFacetTerms (String facet, int count) {\r
     return (getTermLists().getTermList(facet).getTerms(count));\r
   }\r
@@ -140,28 +139,38 @@ public class Responses implements Serializable {
   }\r
   \r
   public String getActiveClients() {    \r
-    if (getShow()!=null) {\r
+    if (getShow()!=null && getShow().getActiveClients().length()>0) {\r
       logger.debug("Active clients: "+getShow().getActiveClients());\r
-      return 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 SpResponses getSp() {\r
-    // TODO:\r
-    return null;\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
-    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
+    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