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