1df2363586cc0646801d78ed6bbffcc384ab16ee
[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.AuthResponse;\r
20 import com.indexdata.mkjsf.pazpar2.data.sp.CategoriesResponse;\r
21 import com.indexdata.mkjsf.utils.Utils;\r
22 \r
23 @Named("pzresp") @SessionScoped\r
24 public class Responses implements Serializable {\r
25     \r
26   private static final long serialVersionUID = -7543231258346154642L;\r
27   protected Map<String,ResponseDataObject> dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();\r
28   private static Logger logger = Logger.getLogger(Responses.class);\r
29   private ErrorHelper errorHelper = 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 resetSearchResponses() {\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   }\r
87   \r
88   public void resetAllSessionData () {\r
89     logger.debug("Resetting all response objects");\r
90     dataObjects = new ConcurrentHashMap<String,ResponseDataObject>();    \r
91     resetSearchResponses();\r
92     dataObjects.put("init", new InitResponse());\r
93     dataObjects.put("auth", new AuthResponse());\r
94     dataObjects.put("categories", new CategoriesResponse());\r
95   }\r
96   \r
97   public InitResponse getInit () {    \r
98     return ((InitResponse) dataObjects.get("init"));\r
99   }\r
100   \r
101   public ShowResponse getShow () {\r
102     return ((ShowResponse) dataObjects.get("show"));\r
103   }\r
104   \r
105   public StatResponse getStat () {\r
106     return ((StatResponse) dataObjects.get("stat"));\r
107   }\r
108   \r
109   public RecordResponse getRecord() {\r
110     return ((RecordResponse) dataObjects.get("record"));\r
111   }\r
112   \r
113   public SearchResponse getSearch() {\r
114     return ((SearchResponse) dataObjects.get("search"));\r
115   }\r
116   \r
117   public TermListsResponse getTermLists () {\r
118     return ((TermListsResponse) dataObjects.get("termlist"));\r
119   }\r
120     \r
121   public List<TermResponse> getFacetTerms (String facet, int count) {\r
122     return (getTermLists().getTermList(facet).getTerms(count));\r
123   }\r
124     \r
125   public List<TermResponse> getFacetTerms (String facet) {\r
126     return (getTermLists().getTermList(facet).getTerms());\r
127   }\r
128   \r
129   public ByTarget getByTarget() {\r
130     return ((ByTarget) dataObjects.get("bytarget"));\r
131   }\r
132 \r
133   // Service Proxy extras   \r
134   public AuthResponse getAuth () {\r
135     return ((AuthResponse) dataObjects.get("auth"));\r
136   }\r
137 \r
138   public CategoriesResponse getCategories() {\r
139     return ((CategoriesResponse) dataObjects.get("categories"));\r
140   }\r
141   // Service Proxy extras\r
142   \r
143 \r
144   public ResponseDataObject getResponseObject (String name) {\r
145     return dataObjects.get(name);\r
146   }\r
147   \r
148   public boolean hasRecords () {\r
149     return getStat().getRecords() > 0            \r
150            && getShow().getHits() != null \r
151            && getShow().getHits().size()>0;\r
152   }\r
153   \r
154   public String getActiveClients() {    \r
155     if (getShow()!=null && getShow().getActiveClients().length()>0) {\r
156       logger.debug("Active clients: "+getShow().getActiveClients());\r
157       return String.valueOf(\r
158                     Math.max(Integer.parseInt(getShow().getActiveClients()),\r
159                              getStat().getActiveClients()));\r
160     } else {\r
161       return "";\r
162     }\r
163   }\r
164 \r
165   public void download(String commandName) throws UnsupportedEncodingException, IOException {\r
166     logger.info(Utils.objectId(this) + " got a download request for "\r
167         + commandName);\r
168     ResponseDataObject object = dataObjects.get(commandName);    \r
169     FacesContext facesContext = FacesContext.getCurrentInstance();\r
170     ExternalContext externalContext = facesContext.getExternalContext();\r
171     if (object.getIsBinary()) {\r
172       externalContext.setResponseHeader("Content-Type","application/octet-stream");\r
173       externalContext.setResponseHeader("Content-Length",String.valueOf(object.getBinary().length));\r
174       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".data\"");\r
175       externalContext.getResponseOutputStream().write(object.getBinary());      \r
176     } else {\r
177       externalContext.setResponseHeader("Content-Type","application/xml; charset=\"utf-8\"");\r
178       externalContext.setResponseHeader("Content-Length",String.valueOf(dataObjects.get(commandName).getXml().getBytes("UTF-8").length));\r
179       externalContext.setResponseHeader("Content-Disposition","attachment;filename=\"" + commandName + ".xml\"");\r
180       externalContext.getResponseOutputStream().write(dataObjects.get(commandName).getXml().getBytes("UTF-8"));\r
181     }\r
182     facesContext.responseComplete();\r
183   }\r
184   \r
185 }