7790c6f1f48b8baee9f8a76fce1f883a3edd5efb
[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.SpResponseDataObject;\r
20 import com.indexdata.mkjsf.pazpar2.data.sp.SpResponses;\r
21 import com.indexdata.mkjsf.utils.Utils;\r
22 \r
23 /**\r
24  * Provides references to all current data objects and has general methods for clearing certain response data.\r
25  *  \r
26  * @author Niels Erik\r
27  *\r
28  */\r
29 @SessionScoped @Named\r
30 public class Responses implements Serializable {\r
31     \r
32   private static final long serialVersionUID = -7543231258346154642L;\r
33   protected Map<String,ResponseDataObject> dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();\r
34   private static Logger logger = Logger.getLogger(Responses.class);\r
35   private ErrorHelper errorHelper = null;\r
36   private SpResponses sp = null;\r
37 \r
38   public Responses() {    \r
39   }\r
40   \r
41   public void put(String name, ResponseDataObject responseData) {\r
42     dataObjects.put(name, responseData);\r
43   }\r
44   \r
45   public void setErrorHelper(ErrorHelper helper) {    \r
46     this.errorHelper = helper;\r
47   }\r
48   \r
49   public boolean hasApplicationError () {\r
50     if (getSearch().hasApplicationError()) {\r
51       logger.info("Error detected in search");\r
52       return true;\r
53     }\r
54     for (String name : dataObjects.keySet()) {      \r
55       if (dataObjects.get(name).hasApplicationError()) {\r
56         if (dataObjects.get(name) instanceof SpResponseDataObject &&\r
57            ((SpResponseDataObject)dataObjects.get(name)).unsupportedCommand()) {\r
58             logger.debug("Command  [" + name + "] not supported by this service");                    \r
59         } else {\r
60           logger.info("Error detected in " + name);\r
61           return true;\r
62         }\r
63       }\r
64     }    \r
65     return false;\r
66   }\r
67   \r
68   /**\r
69    * Returns a search command error, if any, otherwise the first\r
70    * error found for an arbitrary command, if any, otherwise\r
71    * an empty dummy error. \r
72    */    \r
73   public ErrorInterface getCommandError() {\r
74     CommandError error = new CommandError();\r
75     if (dataObjects.get("search").hasApplicationError()) {\r
76       error = dataObjects.get("search").getApplicationError();\r
77       error.setErrorHelper(errorHelper);\r
78     } else {\r
79       for (String name : dataObjects.keySet()) {     \r
80         if (dataObjects.get(name).hasApplicationError()) {     \r
81           error = dataObjects.get(name).getApplicationError();\r
82           error.setErrorHelper(errorHelper);\r
83           break;\r
84         } \r
85       }\r
86     }\r
87     return error;         \r
88   }\r
89   \r
90   /**\r
91    * Empties all data objects populated after a search (including the search response itself)\r
92    * \r
93    */\r
94   public void resetSearchAndBeyond() {\r
95     logger.debug("Resetting show,stat,termlist,bytarget,record,search response objects.");\r
96     dataObjects.put("show", new ShowResponse());\r
97     dataObjects.put("stat", new StatResponse());\r
98     dataObjects.put("termlist", new TermListsResponse());\r
99     dataObjects.put("bytarget", new ByTargetResponse());\r
100     dataObjects.put("record", new RecordResponse());\r
101     dataObjects.put("search", new SearchResponse());\r
102     getSp().resetSearchAndBeyond(false);\r
103   }\r
104   \r
105   /**\r
106    * Empties all data objects populated after a service was initialized, including the init response itself\r
107    * but excluding a possible auth response\r
108    */\r
109   public void resetInitAndBeyond () {\r
110     dataObjects.put("init", new InitResponse());        \r
111     resetSearchAndBeyond();\r
112     getSp().resetInitAndBeyond(false);\r
113   }\r
114     \r
115   public InitResponse getInit () {    \r
116     return ((InitResponse) dataObjects.get("init"));\r
117   }\r
118   \r
119   public ShowResponse getShow () {\r
120     return ((ShowResponse) dataObjects.get("show"));\r
121   }\r
122   \r
123   public StatResponse getStat () {\r
124     return ((StatResponse) dataObjects.get("stat"));\r
125   }\r
126   \r
127   public RecordResponse getRecord() {\r
128     return ((RecordResponse) dataObjects.get("record"));\r
129   }\r
130   \r
131   public SearchResponse getSearch() {\r
132     return ((SearchResponse) dataObjects.get("search"));\r
133   }\r
134   \r
135   public TermListsResponse getTermLists () {\r
136     return ((TermListsResponse) dataObjects.get("termlist"));\r
137   }\r
138     \r
139   public List<TermResponse> getFacetTerms (String facet, int count) {\r
140     return (getTermLists().getTermList(facet).getTerms(count));\r
141   }\r
142     \r
143   public List<TermResponse> getFacetTerms (String facet) {\r
144     return (getTermLists().getTermList(facet).getTerms());\r
145   }\r
146   \r
147   public ByTargetResponse getByTarget() {\r
148     return ((ByTargetResponse) dataObjects.get("bytarget"));\r
149   }\r
150   \r
151   public InfoResponse getInfo() {\r
152     return ((InfoResponse) dataObjects.get("info"));\r
153   }\r
154 \r
155   public ResponseDataObject getResponseObject (String name) {\r
156     return dataObjects.get(name);\r
157   }\r
158   \r
159   public boolean hasRecords () {\r
160     return getStat().getRecords() > 0            \r
161            && getShow().getHits() != null \r
162            && getShow().getHits().size()>0;\r
163   }\r
164   \r
165   public String getActiveClients() {    \r
166     if (getShow()!=null && getShow().getActiveClients().length()>0) {\r
167       logger.debug("Active clients: "+getShow().getActiveClients());\r
168       return String.valueOf(\r
169                     Math.max(Integer.parseInt(getShow().getActiveClients()),\r
170                              getStat().getActiveClients()));\r
171     } else {\r
172       return "";\r
173     }\r
174   }\r
175 \r
176   public void download(String commandName) throws UnsupportedEncodingException, IOException {\r
177     logger.info(Utils.objectId(this) + " got a download request for "\r
178         + commandName);\r
179     ResponseDataObject object = dataObjects.get(commandName);    \r
180     FacesContext facesContext = FacesContext.getCurrentInstance();\r
181     ExternalContext externalContext = facesContext.getExternalContext();\r
182     if (object.getIsBinary()) {\r
183       externalContext.setResponseHeader("Content-Type","application/octet-stream");\r
184       externalContext.setResponseHeader("Content-Length",String.valueOf(object.getBinary().length));\r
185       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".data\"");\r
186       externalContext.getResponseOutputStream().write(object.getBinary());      \r
187     } else {\r
188       externalContext.setResponseHeader("Content-Type","application/xml; charset=\"utf-8\"");\r
189       externalContext.setResponseHeader("Content-Length",String.valueOf(dataObjects.get(commandName).getXml().getBytes("UTF-8").length));\r
190       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".xml\"");\r
191       externalContext.getResponseOutputStream().write(dataObjects.get(commandName).getXml().getBytes("UTF-8"));\r
192     }\r
193     facesContext.responseComplete();\r
194   }\r
195   \r
196   public SpResponses getSp() {\r
197     return (sp == null ? new SpResponses(this) : sp);\r
198   }\r
199   \r
200 }