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

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

Reformatting this file ahead of some changes

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