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