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