source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/PageAction.java@ 27143

Last change on this file since 27143 was 27143, checked in by kjdon, 11 years ago

home page needs these things too. adding interface options will mean that it uses the theme set by the user in preferences, like all the other pages

  • Property svn:keywords set to Author Date Id Revision
File size: 11.8 KB
Line 
1package org.greenstone.gsdl3.action;
2
3import org.greenstone.util.GlobalProperties;
4import org.greenstone.gsdl3.core.ModuleInterface;
5import org.greenstone.gsdl3.util.*;
6//XML classes
7import org.w3c.dom.Node;
8import org.w3c.dom.NodeList;
9import org.w3c.dom.Document;
10import org.w3c.dom.Element;
11
12import java.util.HashMap;
13import java.io.File;
14import java.io.Serializable;
15
16import org.apache.log4j.*;
17
18public class PageAction extends Action
19{
20 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.action.PageAction.class.getName());
21
22 public static final String HOME_PAGE = "home";
23 public static final String ABOUT_PAGE = "about";
24 public static final String PREFS_PAGE = "pref";
25 public static final String GLI4GS3_PAGE = "gli4gs3";
26
27 public Node process(Node message_node)
28 {
29 Element message = this.converter.nodeToElement(message_node);
30 Element request = (Element) GSXML.getChildByTagName(message, GSXML.REQUEST_ELEM);
31 Element paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
32 String collection = "";
33 if(paramList != null)
34 {
35 HashMap<String, Serializable> params = GSXML.extractParams(paramList, false);
36 if (params != null && params.get(GSParams.COLLECTION) != null)
37 {
38 collection = (String) params.get(GSParams.COLLECTION);
39 }
40 }
41
42 // the page name is the subaction
43 String page_name = request.getAttribute(GSXML.SUBACTION_ATT);
44 if (page_name.equals(""))
45 { // if no page specified, assume home page
46 page_name = HOME_PAGE;
47 }
48 Element result = this.doc.createElement(GSXML.MESSAGE_ELEM);
49 Element response;
50 if (page_name.equals(HOME_PAGE))
51 {
52 response = homePage(request);
53 //} else if (page_name.equals(ABOUT_PAGE)) {
54 }
55 else if (page_name.equals(ABOUT_PAGE) || page_name.equals(PREFS_PAGE))
56 {
57 response = aboutPage(request);
58 //}else if (page_name.equals(PREFS_PAGE)) {
59 //response = prefsPage(request);
60 }
61 else if (page_name.equals(GLI4GS3_PAGE))
62 {
63 response = gli4gs3Page(request);
64 }
65 else
66 { // unknown page
67
68 logger.error("unknown page specified!");
69 response = unknownPage(request);
70 }
71
72 Element formatMessage = this.doc.createElement(GSXML.MESSAGE_ELEM);
73 Element formatRequest = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_FORMAT, collection, new UserContext(request));
74 formatMessage.appendChild(formatRequest);
75 Element formatResponseMessage = (Element) this.mr.process(formatMessage);
76 Element formatResponse = (Element) GSXML.getChildByTagName(formatResponseMessage, GSXML.RESPONSE_ELEM);
77
78 Element globalFormat = (Element) GSXML.getChildByTagName(formatResponse, GSXML.FORMAT_ELEM);
79 if (globalFormat != null)
80 {
81 response.appendChild(globalFormat);
82 }
83
84 result.appendChild(this.doc.importNode(response, true));
85 logger.debug("page action result: " + this.converter.getPrettyString(result));
86 return result;
87 }
88
89 protected Element homePage(Element request)
90 {
91 UserContext userContext = new UserContext(request);
92 // first, get the message router info
93 Element info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
94 Element coll_list_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
95 info_message.appendChild(coll_list_request);
96 Element info_response_message = (Element) this.mr.process(info_message);
97 if (info_response_message == null)
98 {
99 logger.error(" couldn't query the message router!");
100 return null;
101 }
102 Element info_response = (Element) GSXML.getChildByTagName(info_response_message, GSXML.RESPONSE_ELEM);
103 if (info_response == null)
104 {
105 logger.error("couldn't query the message router!");
106 return null;
107 }
108
109 // second, get the metadata for each collection - we only want specific
110 // elements but for now, we'll just get it all
111 Element collection_list = (Element) GSXML.getChildByTagName(info_response, GSXML.COLLECTION_ELEM + GSXML.LIST_MODIFIER);
112 logger.debug(GSXML.xmlNodeToString(collection_list));
113 if (collection_list != null)
114 {
115 NodeList colls = GSXML.getChildrenByTagName(collection_list, GSXML.COLLECTION_ELEM);
116 if (colls.getLength() > 0)
117 {
118 sendMultipleRequests(colls, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
119 }
120 }
121
122 // get metadata for any services
123 Element service_list = (Element) GSXML.getChildByTagName(info_response, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
124 if (service_list != null)
125 {
126 NodeList services = GSXML.getChildrenByTagName(service_list, GSXML.SERVICE_ELEM);
127 if (services.getLength() > 0)
128 {
129 sendMultipleRequests(services, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
130 }
131 }
132
133 // get metadata for service clusters
134 Element cluster_list = (Element) GSXML.getChildByTagName(info_response, GSXML.CLUSTER_ELEM + GSXML.LIST_MODIFIER);
135 if (cluster_list != null)
136 {
137 NodeList clusters = GSXML.getChildrenByTagName(cluster_list, GSXML.CLUSTER_ELEM);
138 if (clusters.getLength() > 0)
139 {
140 sendMultipleRequests(clusters, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
141
142 }
143 }
144
145 addSiteMetadata(info_response, userContext);
146 addInterfaceOptions(info_response);
147 // all the components have been merged into info_response
148 return info_response;
149
150 } // homePage
151
152 protected Element aboutPage(Element request)
153 {
154 UserContext userContext = new UserContext(request);
155 // extract the params from the cgi-request,
156 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
157 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
158
159 String coll_name = (String) params.get(GSParams.COLLECTION);
160 if (coll_name == null || coll_name.equals(""))
161 {
162 logger.error("about page requested with no collection or cluster specified!");
163 // return an empty response
164 Element response = this.doc.createElement(GSXML.RESPONSE_ELEM);
165 addSiteMetadata(response, userContext);
166 addInterfaceOptions(response);
167 return response;
168 }
169
170 // get the collection or cluster description
171 Element coll_about_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
172
173 Element coll_about_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
174 coll_about_message.appendChild(coll_about_request);
175 Element coll_about_response = (Element) this.mr.process(coll_about_message);
176
177 // add collection type attribute to paramList
178 String col_type = "";
179 NodeList collect_elem = coll_about_response.getElementsByTagName(GSXML.COLLECTION_ELEM);
180 if (collect_elem.getLength() != 0)
181 {
182 for (int i = 0; i < collect_elem.getLength(); i++)
183 {
184 Element e = (Element) collect_elem.item(i);
185 col_type = e.getAttribute(GSXML.TYPE_ATT);
186 }
187 }
188 else
189 {
190 logger.error(GSXML.COLLECTION_ELEM + " element is null");
191 }
192
193 NodeList paramList = request.getElementsByTagName(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
194 if (paramList.getLength() != 0)
195 {
196 for (int i = 0; i < paramList.getLength(); i++)
197 {
198 Element e = (Element) paramList.item(i);
199 Element ct = GSXML.createParameter(request.getOwnerDocument(), GSParams.COLLECTION_TYPE, col_type.equalsIgnoreCase("mg") ? "0" : "1");
200 e.appendChild(ct);
201 }
202 }
203 else
204 {
205 logger.info("paramList is null!!");
206 }
207
208 if (coll_about_response == null)
209 {
210 return null;
211 }
212
213 // second, get the info for each service - we only want display items
214 // but for now, we'll just get it all
215 NodeList services = coll_about_response.getElementsByTagName(GSXML.SERVICE_ELEM);
216 if (services.getLength() > 0)
217 {
218 sendMultipleRequests(services, coll_name, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
219 }
220
221 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
222 //add the site metadata
223 addSiteMetadata(response, userContext);
224 addInterfaceOptions(response);
225 return response;
226 }
227
228 //protected Element prefsPage(Element request) {
229
230 // return null;
231 //}
232
233 /** if we dont know the page type, use this method */
234 protected Element unknownPage(Element request)
235 {
236 UserContext userContext = new UserContext(request);
237 String page_name = request.getAttribute(GSXML.SUBACTION_ATT);
238
239 // extract the params from the cgi-request,
240 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
241 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
242
243 String coll_name = (String) params.get(GSParams.COLLECTION);
244 if (coll_name == null || coll_name.equals(""))
245 {
246 // just return an empty response
247 Element response = this.doc.createElement(GSXML.RESPONSE_ELEM);
248 addSiteMetadata(response, userContext);
249 addInterfaceOptions(response);
250 return response;
251 }
252
253 // else get the coll description - actually this is the same as for the about page - should we merge these two methods??
254
255 // if there is a service specified should we get the service description instead??
256 // get the collection or cluster description
257 Element coll_about_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
258
259 Element coll_about_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
260 coll_about_message.appendChild(coll_about_request);
261
262 Element coll_about_response = (Element) this.mr.process(coll_about_message);
263
264 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
265
266 //add the site metadata
267 addSiteMetadata(response, userContext);
268 addInterfaceOptions(response);
269
270 return response;
271
272 }
273
274 protected boolean sendMultipleRequests(NodeList items, String path_prefix, String request_type, UserContext userContext)
275 {
276 // we will send all the requests in a single message
277 Element message = this.doc.createElement(GSXML.MESSAGE_ELEM);
278 for (int i = 0; i < items.getLength(); i++)
279 {
280 Element c = (Element) items.item(i);
281 String path = c.getAttribute(GSXML.NAME_ATT);
282 if (path_prefix != null)
283 {
284 path = GSPath.appendLink(path_prefix, path);
285 }
286 Element request = GSXML.createBasicRequest(this.doc, request_type, path, userContext);
287 message.appendChild(request);
288 }
289
290 Element response_message = (Element) this.mr.process(message);
291
292 NodeList responses = response_message.getElementsByTagName(GSXML.RESPONSE_ELEM);
293 // check that have same number of responses as requests
294 if (items.getLength() != responses.getLength())
295 {
296 logger.error("didn't get a response for each request - somethings gone wrong!");
297 return false;
298 }
299
300 for (int i = 0; i < items.getLength(); i++)
301 {
302 Element c1 = (Element) items.item(i);
303 Element c2 = (Element) GSXML.getChildByTagName((Element) responses.item(i), c1.getTagName());
304 if (c1 != null && c2 != null && c1.getAttribute(GSXML.NAME_ATT).endsWith(c2.getAttribute(GSXML.NAME_ATT)))
305 {
306 //add the new data into the original element
307 GSXML.mergeElements(c1, c2);
308 }
309 else
310 {
311 logger.debug(" response does not correspond to request!");
312 }
313
314 }
315
316 return true;
317
318 }
319
320 protected Element gli4gs3Page(Element request)
321 {
322 String lang = request.getAttribute(GSXML.LANG_ATT);
323 String uid = request.getAttribute(GSXML.USER_ID_ATT);
324
325 Element page_response = this.doc.createElement(GSXML.RESPONSE_ELEM);
326
327 Element applet_elem = this.doc.createElement("Applet");
328 page_response.appendChild(applet_elem);
329 applet_elem.setAttribute("ARCHIVE", "SignedGatherer.jar");
330 applet_elem.setAttribute("CODE", "org.greenstone.gatherer.GathererApplet");
331 applet_elem.setAttribute("CODEBASE", "applet");
332 applet_elem.setAttribute("HEIGHT", "50");
333 applet_elem.setAttribute("WIDTH", "380");
334 Element gwcgi_param_elem = this.doc.createElement("PARAM");
335 gwcgi_param_elem.setAttribute("name", "gwcgi");
336 String library_name = GlobalProperties.getGSDL3WebAddress();
337 gwcgi_param_elem.setAttribute("value", library_name);
338 applet_elem.appendChild(gwcgi_param_elem);
339
340 Element gsdl3_param_elem = this.doc.createElement("PARAM");
341 gsdl3_param_elem.setAttribute("name", "gsdl3");
342 gsdl3_param_elem.setAttribute("value", "true");
343 applet_elem.appendChild(gsdl3_param_elem);
344
345 return page_response;
346 }
347}
Note: See TracBrowser for help on using the repository browser.