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

Last change on this file since 26494 was 25991, checked in by sjm84, 12 years ago

All collection pages will try to include any formatting that is global to that collection

  • Property svn:keywords set to Author Date Id Revision
File size: 11.7 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 // all the components have been merged into info_response
146 return info_response;
147
148 } // homePage
149
150 protected Element aboutPage(Element request)
151 {
152 UserContext userContext = new UserContext(request);
153 // extract the params from the cgi-request,
154 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
155 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
156
157 String coll_name = (String) params.get(GSParams.COLLECTION);
158 if (coll_name == null || coll_name.equals(""))
159 {
160 logger.error("about page requested with no collection or cluster specified!");
161 // return an empty response
162 Element response = this.doc.createElement(GSXML.RESPONSE_ELEM);
163 addSiteMetadata(response, userContext);
164 addInterfaceOptions(response);
165 return response;
166 }
167
168 // get the collection or cluster description
169 Element coll_about_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
170
171 Element coll_about_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
172 coll_about_message.appendChild(coll_about_request);
173 Element coll_about_response = (Element) this.mr.process(coll_about_message);
174
175 // add collection type attribute to paramList
176 String col_type = "";
177 NodeList collect_elem = coll_about_response.getElementsByTagName(GSXML.COLLECTION_ELEM);
178 if (collect_elem.getLength() != 0)
179 {
180 for (int i = 0; i < collect_elem.getLength(); i++)
181 {
182 Element e = (Element) collect_elem.item(i);
183 col_type = e.getAttribute(GSXML.TYPE_ATT);
184 }
185 }
186 else
187 {
188 logger.error(GSXML.COLLECTION_ELEM + " element is null");
189 }
190
191 NodeList paramList = request.getElementsByTagName(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
192 if (paramList.getLength() != 0)
193 {
194 for (int i = 0; i < paramList.getLength(); i++)
195 {
196 Element e = (Element) paramList.item(i);
197 Element ct = GSXML.createParameter(request.getOwnerDocument(), GSParams.COLLECTION_TYPE, col_type.equalsIgnoreCase("mg") ? "0" : "1");
198 e.appendChild(ct);
199 }
200 }
201 else
202 {
203 logger.info("paramList is null!!");
204 }
205
206 if (coll_about_response == null)
207 {
208 return null;
209 }
210
211 // second, get the info for each service - we only want display items
212 // but for now, we'll just get it all
213 NodeList services = coll_about_response.getElementsByTagName(GSXML.SERVICE_ELEM);
214 if (services.getLength() > 0)
215 {
216 sendMultipleRequests(services, coll_name, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
217 }
218
219 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
220 //add the site metadata
221 addSiteMetadata(response, userContext);
222 addInterfaceOptions(response);
223 return response;
224 }
225
226 //protected Element prefsPage(Element request) {
227
228 // return null;
229 //}
230
231 /** if we dont know the page type, use this method */
232 protected Element unknownPage(Element request)
233 {
234 UserContext userContext = new UserContext(request);
235 String page_name = request.getAttribute(GSXML.SUBACTION_ATT);
236
237 // extract the params from the cgi-request,
238 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
239 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
240
241 String coll_name = (String) params.get(GSParams.COLLECTION);
242 if (coll_name == null || coll_name.equals(""))
243 {
244 // just return an empty response
245 Element response = this.doc.createElement(GSXML.RESPONSE_ELEM);
246 addSiteMetadata(response, userContext);
247 addInterfaceOptions(response);
248 return response;
249 }
250
251 // else get the coll description - actually this is the same as for the about page - should we merge these two methods??
252
253 // if there is a service specified should we get the service description instead??
254 // get the collection or cluster description
255 Element coll_about_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
256
257 Element coll_about_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
258 coll_about_message.appendChild(coll_about_request);
259
260 Element coll_about_response = (Element) this.mr.process(coll_about_message);
261
262 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
263
264 //add the site metadata
265 addSiteMetadata(response, userContext);
266 addInterfaceOptions(response);
267
268 return response;
269
270 }
271
272 protected boolean sendMultipleRequests(NodeList items, String path_prefix, String request_type, UserContext userContext)
273 {
274 // we will send all the requests in a single message
275 Element message = this.doc.createElement(GSXML.MESSAGE_ELEM);
276 for (int i = 0; i < items.getLength(); i++)
277 {
278 Element c = (Element) items.item(i);
279 String path = c.getAttribute(GSXML.NAME_ATT);
280 if (path_prefix != null)
281 {
282 path = GSPath.appendLink(path_prefix, path);
283 }
284 Element request = GSXML.createBasicRequest(this.doc, request_type, path, userContext);
285 message.appendChild(request);
286 }
287
288 Element response_message = (Element) this.mr.process(message);
289
290 NodeList responses = response_message.getElementsByTagName(GSXML.RESPONSE_ELEM);
291 // check that have same number of responses as requests
292 if (items.getLength() != responses.getLength())
293 {
294 logger.error("didn't get a response for each request - somethings gone wrong!");
295 return false;
296 }
297
298 for (int i = 0; i < items.getLength(); i++)
299 {
300 Element c1 = (Element) items.item(i);
301 Element c2 = (Element) GSXML.getChildByTagName((Element) responses.item(i), c1.getTagName());
302 if (c1 != null && c2 != null && c1.getAttribute(GSXML.NAME_ATT).endsWith(c2.getAttribute(GSXML.NAME_ATT)))
303 {
304 //add the new data into the original element
305 GSXML.mergeElements(c1, c2);
306 }
307 else
308 {
309 logger.debug(" response does not correspond to request!");
310 }
311
312 }
313
314 return true;
315
316 }
317
318 protected Element gli4gs3Page(Element request)
319 {
320 String lang = request.getAttribute(GSXML.LANG_ATT);
321 String uid = request.getAttribute(GSXML.USER_ID_ATT);
322
323 Element page_response = this.doc.createElement(GSXML.RESPONSE_ELEM);
324
325 Element applet_elem = this.doc.createElement("Applet");
326 page_response.appendChild(applet_elem);
327 applet_elem.setAttribute("ARCHIVE", "SignedGatherer.jar");
328 applet_elem.setAttribute("CODE", "org.greenstone.gatherer.GathererApplet");
329 applet_elem.setAttribute("CODEBASE", "applet");
330 applet_elem.setAttribute("HEIGHT", "50");
331 applet_elem.setAttribute("WIDTH", "380");
332 Element gwcgi_param_elem = this.doc.createElement("PARAM");
333 gwcgi_param_elem.setAttribute("name", "gwcgi");
334 String library_name = GlobalProperties.getGSDL3WebAddress();
335 gwcgi_param_elem.setAttribute("value", library_name);
336 applet_elem.appendChild(gwcgi_param_elem);
337
338 Element gsdl3_param_elem = this.doc.createElement("PARAM");
339 gsdl3_param_elem.setAttribute("name", "gsdl3");
340 gsdl3_param_elem.setAttribute("value", "true");
341 applet_elem.appendChild(gsdl3_param_elem);
342
343 return page_response;
344 }
345}
Note: See TracBrowser for help on using the repository browser.