Organizes SP specific responses in separate class
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / data / Responses.java
1 package com.indexdata.mkjsf.pazpar2.data;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.Serializable;\r
5 import java.io.UnsupportedEncodingException;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 import java.util.concurrent.ConcurrentHashMap;\r
9 \r
10 import javax.enterprise.context.SessionScoped;\r
11 import javax.faces.context.ExternalContext;\r
12 import javax.faces.context.FacesContext;\r
13 import javax.inject.Named;\r
14 \r
15 import org.apache.log4j.Logger;\r
16 \r
17 import com.indexdata.mkjsf.errors.ErrorHelper;\r
18 import com.indexdata.mkjsf.errors.ErrorInterface;\r
19 import com.indexdata.mkjsf.pazpar2.data.sp.SpResponses;\r
20 import com.indexdata.mkjsf.utils.Utils;\r
21 \r
22 @Named("pzresp") @SessionScoped\r
23 public class Responses implements Serializable {\r
24     \r
25   private static final long serialVersionUID = -7543231258346154642L;\r
26   protected Map<String,ResponseDataObject> dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();\r
27   private static Logger logger = Logger.getLogger(Responses.class);\r
28   private ErrorHelper errorHelper = null;\r
29   private SpResponses sp = null;\r
30 \r
31   public Responses() {    \r
32   }\r
33   \r
34   public void put(String name, ResponseDataObject responseData) {\r
35     dataObjects.put(name, responseData);\r
36   }\r
37   \r
38   public void setErrorHelper(ErrorHelper helper) {    \r
39     this.errorHelper = helper;\r
40   }\r
41   \r
42   public boolean hasApplicationError () {\r
43     if (getSearch().hasApplicationError()) {\r
44       logger.info("Error detected in search");\r
45       return true;\r
46     }\r
47     for (String name : dataObjects.keySet()) {\r
48       if (dataObjects.get(name).hasApplicationError()) {\r
49         logger.info("Error detected in " + name);\r
50         return true;\r
51       }\r
52     }    \r
53     return false;\r
54   }\r
55   \r
56   /**\r
57    * Returns a search command error, if any, otherwise the first\r
58    * error found for an arbitrary command, if any, otherwise\r
59    * an empty dummy error. \r
60    */    \r
61   public ErrorInterface getCommandError() {\r
62     CommandError error = new CommandError();\r
63     if (dataObjects.get("search").hasApplicationError()) {\r
64       error = dataObjects.get("search").getApplicationError();\r
65       error.setErrorHelper(errorHelper);\r
66     } else {\r
67       for (String name : dataObjects.keySet()) {     \r
68         if (dataObjects.get(name).hasApplicationError()) {     \r
69           error = dataObjects.get(name).getApplicationError();\r
70           error.setErrorHelper(errorHelper);\r
71           break;\r
72         } \r
73       }\r
74     }\r
75     return error;         \r
76   }\r
77   \r
78   public void resetSearchAndBeyond() {\r
79     logger.debug("Resetting show,stat,termlist,bytarget,record,search response objects.");\r
80     dataObjects.put("show", new ShowResponse());\r
81     dataObjects.put("stat", new StatResponse());\r
82     dataObjects.put("termlist", new TermListsResponse());\r
83     dataObjects.put("bytarget", new ByTarget());\r
84     dataObjects.put("record", new RecordResponse());\r
85     dataObjects.put("search", new SearchResponse());\r
86     getSp().resetSearchAndBeyond(false);\r
87   }\r
88   \r
89   public void resetInitAndBeyond () {\r
90     dataObjects.put("init", new InitResponse());        \r
91     resetSearchAndBeyond();\r
92     getSp().resetInitAndBeyond(false);\r
93   }\r
94     \r
95   public InitResponse getInit () {    \r
96     return ((InitResponse) dataObjects.get("init"));\r
97   }\r
98   \r
99   public ShowResponse getShow () {\r
100     return ((ShowResponse) dataObjects.get("show"));\r
101   }\r
102   \r
103   public StatResponse getStat () {\r
104     return ((StatResponse) dataObjects.get("stat"));\r
105   }\r
106   \r
107   public RecordResponse getRecord() {\r
108     return ((RecordResponse) dataObjects.get("record"));\r
109   }\r
110   \r
111   public SearchResponse getSearch() {\r
112     return ((SearchResponse) dataObjects.get("search"));\r
113   }\r
114   \r
115   public TermListsResponse getTermLists () {\r
116     return ((TermListsResponse) dataObjects.get("termlist"));\r
117   }\r
118     \r
119   public List<TermResponse> getFacetTerms (String facet, int count) {\r
120     return (getTermLists().getTermList(facet).getTerms(count));\r
121   }\r
122     \r
123   public List<TermResponse> getFacetTerms (String facet) {\r
124     return (getTermLists().getTermList(facet).getTerms());\r
125   }\r
126   \r
127   public ByTarget getByTarget() {\r
128     return ((ByTarget) dataObjects.get("bytarget"));\r
129   }\r
130 \r
131   public ResponseDataObject getResponseObject (String name) {\r
132     return dataObjects.get(name);\r
133   }\r
134   \r
135   public boolean hasRecords () {\r
136     return getStat().getRecords() > 0            \r
137            && getShow().getHits() != null \r
138            && getShow().getHits().size()>0;\r
139   }\r
140   \r
141   public String getActiveClients() {    \r
142     if (getShow()!=null && getShow().getActiveClients().length()>0) {\r
143       logger.debug("Active clients: "+getShow().getActiveClients());\r
144       return String.valueOf(\r
145                     Math.max(Integer.parseInt(getShow().getActiveClients()),\r
146                              getStat().getActiveClients()));\r
147     } else {\r
148       return "";\r
149     }\r
150   }\r
151 \r
152   public void download(String commandName) throws UnsupportedEncodingException, IOException {\r
153     logger.info(Utils.objectId(this) + " got a download request for "\r
154         + commandName);\r
155     ResponseDataObject object = dataObjects.get(commandName);    \r
156     FacesContext facesContext = FacesContext.getCurrentInstance();\r
157     ExternalContext externalContext = facesContext.getExternalContext();\r
158     if (object.getIsBinary()) {\r
159       externalContext.setResponseHeader("Content-Type","application/octet-stream");\r
160       externalContext.setResponseHeader("Content-Length",String.valueOf(object.getBinary().length));\r
161       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".data\"");\r
162       externalContext.getResponseOutputStream().write(object.getBinary());      \r
163     } else {\r
164       externalContext.setResponseHeader("Content-Type","application/xml; charset=\"utf-8\"");\r
165       externalContext.setResponseHeader("Content-Length",String.valueOf(dataObjects.get(commandName).getXml().getBytes("UTF-8").length));\r
166       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".xml\"");\r
167       externalContext.getResponseOutputStream().write(dataObjects.get(commandName).getXml().getBytes("UTF-8"));\r
168     }\r
169     facesContext.responseComplete();\r
170   }\r
171   \r
172   public SpResponses getSp() {\r
173     return (sp == null ? new SpResponses(this) : sp);\r
174   }\r
175   \r
176 }