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

Last change on this file since 32127 was 32127, checked in by ak19, 6 years ago

Fixing up the GS3 GLI applet. To get it to work, follow the instructions at http://wiki.greenstone.org/doku.php?id=old:remote_greenstone&s[]=applet 2. But need to put the SignedGatherer.java in web\applet for GS3. 3. In the default interface, edit home.xsl and uncomment <gslib:libraryInterfaceLink/>. 4. Set up Java Control Panel to allow from the host:port of the (remote) GS server on which the GS3 to connect to is hosted. This will then allow accessing applets from that host:port. 5. Configure Internet Explorer (works on Win 8) as explained in GS3's Tudors tutorial for the Phind phrase browser. 6. In Internet Explorer, visit the GS home page, click on the Librarian Interface link and now you will be asked to allow and run the SignedGatherer.jar GLI applet.

  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1package org.greenstone.gsdl3.action;
2
3import java.io.Serializable;
4import java.util.HashMap;
5
6import org.apache.log4j.Logger;
7import org.greenstone.gsdl3.util.GSParams;
8import org.greenstone.gsdl3.util.GSPath;
9import org.greenstone.gsdl3.util.GSXML;
10import org.greenstone.gsdl3.util.UserContext;
11import org.greenstone.gsdl3.util.XMLConverter;
12import org.greenstone.util.GlobalProperties;
13import org.w3c.dom.Document;
14import org.w3c.dom.Element;
15import org.w3c.dom.Node;
16import org.w3c.dom.NodeList;
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 {
30 Element message = GSXML.nodeToElement(message_node);
31 Document doc = XMLConverter.newDOM();
32
33 Element request = (Element) GSXML.getChildByTagName(message, GSXML.REQUEST_ELEM);
34 Element paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
35 String collection = "";
36 if (paramList != null)
37 {
38 HashMap<String, Serializable> params = GSXML.extractParams(paramList, false);
39 if (params != null && params.get(GSParams.COLLECTION) != null)
40 {
41 collection = (String) params.get(GSParams.COLLECTION);
42 }
43 }
44
45 // the page name is the subaction
46 String page_name = request.getAttribute(GSXML.SUBACTION_ATT);
47 if (page_name.equals(""))
48 { // if no page specified, assume home page
49 page_name = HOME_PAGE;
50 }
51 Element result = doc.createElement(GSXML.MESSAGE_ELEM);
52 Element response;
53 if (page_name.equals(HOME_PAGE))
54 {
55 response = homePage(request);
56 //} else if (page_name.equals(ABOUT_PAGE)) {
57 }
58 else if (page_name.equals(ABOUT_PAGE) || page_name.equals(PREFS_PAGE))
59 {
60 response = aboutPage(request);
61 //}else if (page_name.equals(PREFS_PAGE)) {
62 //response = prefsPage(request);
63 }
64 else if (page_name.equals(GLI4GS3_PAGE))
65 {
66 response = gli4gs3Page(request);
67 }
68 else
69 { // unknown page
70 response = unknownPage(request);
71 }
72
73 Element formatMessage = doc.createElement(GSXML.MESSAGE_ELEM);
74 Element formatRequest = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_FORMAT, collection, new UserContext(request));
75 formatMessage.appendChild(formatRequest);
76 Element formatResponseMessage = (Element) this.mr.process(formatMessage);
77 Element formatResponse = (Element) GSXML.getChildByTagName(formatResponseMessage, GSXML.RESPONSE_ELEM);
78
79 Element globalFormat = (Element) GSXML.getChildByTagName(formatResponse, GSXML.FORMAT_ELEM);
80 if (globalFormat != null)
81 {
82 response.appendChild(response.getOwnerDocument().importNode(globalFormat, true));
83 }
84
85 result.appendChild(doc.importNode(response, true));
86 logger.debug("page action result: " + this.converter.getPrettyString(result));
87
88 return result;
89 }
90
91 protected Element homePage(Element request)
92 {
93 Document doc = XMLConverter.newDOM();
94
95
96 UserContext userContext = new UserContext(request);
97 // first, get the message router info
98 Element info_message = doc.createElement(GSXML.MESSAGE_ELEM);
99 Element info_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
100 //Create param list
101 Element param_list_element = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
102 info_request.appendChild(param_list_element);
103 //Describe params without collectionlist. Collectionlist provided by CollectionGroup service
104 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM, GSXML.CLUSTER_ELEM + GSXML.LIST_MODIFIER);
105 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
106 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM, GSXML.SITE_ELEM + GSXML.LIST_MODIFIER);
107 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
108 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM, GSXML.DISPLAY_TEXT_ELEM + GSXML.LIST_MODIFIER);
109 info_message.appendChild(info_request);
110 //Send request to message router
111 Element info_response_message = (Element) this.mr.process(info_message);
112 //Check if it is not null
113 if (info_response_message == null)
114 {
115 logger.error(" couldn't query the message router!");
116 return null;
117 }
118 //Check if it is not null
119 Element info_response = (Element) GSXML.getChildByTagName(info_response_message, GSXML.RESPONSE_ELEM);
120 if (info_response == null)
121 {
122 logger.error("couldn't query the message router!");
123 return null;
124 }
125
126 Element resp_service_list = (Element) GSXML.getChildByTagName(info_response, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
127
128 if (resp_service_list == null) {
129 logger.error("No services available. Couldn't query the message router!");
130 return null;
131 }
132 Element groupInfoService = GSXML.getNamedElement(resp_service_list, GSXML.SERVICE_ELEM, GSXML.TYPE_ATT,
133 GSXML.SERVICE_TYPE_GROUPINFO);
134 if (groupInfoService != null) {
135 // Prepare request for CollectionGroup service to get current
136 // collections and groups list
137 Element group_info_message = doc.createElement(GSXML.MESSAGE_ELEM);
138 Element group_info_request = GSXML.createBasicRequest(doc, GSXML.TO_ATT,
139 groupInfoService.getAttribute(GSXML.NAME_ATT), userContext);
140 group_info_message.appendChild(group_info_request);
141 //Append group request if exists
142 Element paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
143 if (paramList != null) {
144 group_info_request.appendChild(doc.importNode(paramList, true));
145 }
146 Element group_info_response_message = (Element) this.mr.process(group_info_message);
147 Element group_info_response = (Element) GSXML.getChildByTagName(group_info_response_message,
148 GSXML.RESPONSE_ELEM);
149 Element collection_list = (Element) GSXML.getChildByTagName(group_info_response,
150 GSXML.COLLECTION_ELEM + GSXML.LIST_MODIFIER);
151 // Add Collection List from CollectionGroup Service to response
152 // from message router
153 info_response = (Element) doc.importNode(info_response, true);
154 if (collection_list != null) {
155 info_response.appendChild(doc.importNode(collection_list, true));
156 }
157 Element group_list = (Element) GSXML.getChildByTagName(group_info_response,
158 GSXML.GROUP_ELEM + GSXML.LIST_MODIFIER);
159 if (group_list != null) {
160 info_response.appendChild(doc.importNode(group_list, true));
161 }
162 Element path_list = (Element) GSXML.getChildByTagName(group_info_response,
163 GSXML.PATH_ELEM + GSXML.LIST_MODIFIER);
164 if (path_list != null) {
165 info_response.appendChild(doc.importNode(path_list, true));
166 }
167 // Send message to groupInfoType Services
168 } else {
169 // If no service with type SERVICE_TYPE_GROUPINFO could be provided
170 // request message router for all available collections
171 GSXML.addParameterToList(param_list_element, GSXML.SUBSET_PARAM,
172 GSXML.COLLECTION_ELEM + GSXML.LIST_MODIFIER);
173 info_response_message = (Element) this.mr.process(info_message);
174
175 if (info_response_message == null) {
176 logger.error(" couldn't query the message router!");
177 return null;
178 }
179 info_response = (Element) GSXML.getChildByTagName(info_response_message, GSXML.RESPONSE_ELEM);
180 if (info_response == null) {
181 logger.error("couldn't query the message router!");
182 return null;
183 }
184 }
185
186 // second, get the metadata for each collection - we only want specific
187 // elements but for now, we'll just get it all
188 Element collection_list = (Element) GSXML.getChildByTagName(info_response, GSXML.COLLECTION_ELEM + GSXML.LIST_MODIFIER);
189 //logger.debug(GSXML.xmlNodeToString(collection_list));
190 if (collection_list != null)
191 {
192 NodeList colls = GSXML.getChildrenByTagName(collection_list, GSXML.COLLECTION_ELEM);
193 if (colls.getLength() > 0)
194 {
195 sendMultipleRequests(doc, colls, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
196 }
197 }
198
199 // get metadata for any services
200 Element service_list = (Element) GSXML.getChildByTagName(info_response, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
201 if (service_list != null)
202 {
203 NodeList services = GSXML.getChildrenByTagName(service_list, GSXML.SERVICE_ELEM);
204 if (services.getLength() > 0)
205 {
206 sendMultipleRequests(doc, services, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
207 }
208 }
209
210 // get metadata for service clusters
211 Element cluster_list = (Element) GSXML.getChildByTagName(info_response, GSXML.CLUSTER_ELEM + GSXML.LIST_MODIFIER);
212 if (cluster_list != null)
213 {
214 NodeList clusters = GSXML.getChildrenByTagName(cluster_list, GSXML.CLUSTER_ELEM);
215 if (clusters.getLength() > 0)
216 {
217 sendMultipleRequests(doc, clusters, null, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
218
219 }
220 }
221
222 addSiteMetadata(info_response, userContext);
223 addInterfaceOptions(info_response);
224 // all the components have been merged into info_response
225 return info_response;
226
227 } // homePage
228
229 protected Element aboutPage(Element request)
230 {
231 Document doc = XMLConverter.newDOM();
232
233 UserContext userContext = new UserContext(request);
234 // extract the params from the cgi-request,
235 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
236 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
237
238 String coll_name = (String) params.get(GSParams.COLLECTION);
239 if (coll_name == null || coll_name.equals(""))
240 {
241 logger.error("about page requested with no collection or cluster specified!");
242 // return an empty response
243 Element response = doc.createElement(GSXML.RESPONSE_ELEM);
244 addSiteMetadata(response, userContext);
245 addInterfaceOptions(response);
246 return response;
247 }
248
249 // get the collection or cluster description
250 Element coll_about_message = doc.createElement(GSXML.MESSAGE_ELEM);
251
252 Element coll_about_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
253 coll_about_message.appendChild(coll_about_request);
254 Element coll_about_response = (Element) this.mr.process(coll_about_message);
255
256 // add collection type attribute to paramList
257 String col_type = "";
258 NodeList collect_elem = coll_about_response.getElementsByTagName(GSXML.COLLECTION_ELEM);
259 if (collect_elem.getLength() != 0)
260 {
261 for (int i = 0; i < collect_elem.getLength(); i++)
262 {
263 Element e = (Element) collect_elem.item(i);
264 col_type = e.getAttribute(GSXML.TYPE_ATT);
265 }
266 }
267 else
268 {
269 logger.error(GSXML.COLLECTION_ELEM + " element is null");
270 }
271
272 // adding a ct param to paramlist. only needed for gs2 interface, not default
273 NodeList paramList_list = request.getElementsByTagName(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
274 if (paramList_list.getLength() != 0)
275 {
276 for (int i = 0; i < paramList_list.getLength(); i++)
277 {
278 Element e = (Element) paramList_list.item(i);
279 Element ct = GSXML.createParameter(request.getOwnerDocument(), GSParams.COLLECTION_TYPE, col_type.equalsIgnoreCase("mg") ? "0" : "1");
280 e.appendChild(ct);
281 }
282 }
283 else
284 {
285 logger.info("paramList is null!!");
286 }
287
288 if (coll_about_response == null)
289 {
290 return null;
291 }
292
293 // second, get the info for each service - we only want display items
294 // but for now, we'll just get it all
295 NodeList services = coll_about_response.getElementsByTagName(GSXML.SERVICE_ELEM);
296 if (services.getLength() > 0)
297 {
298 sendMultipleRequests(doc, services, coll_name, GSXML.REQUEST_TYPE_DESCRIBE, userContext);
299 }
300
301 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
302 //add the site metadata
303 addSiteMetadata(response, userContext);
304 addInterfaceOptions(response);
305 return response;
306 }
307
308 //protected Element prefsPage(Element request) {
309
310 // return null;
311 //}
312
313 /** if we dont know the page type, use this method */
314 protected Element unknownPage(Element request)
315 {
316 Document doc = XMLConverter.newDOM();
317
318 UserContext userContext = new UserContext(request);
319 String page_name = request.getAttribute(GSXML.SUBACTION_ATT);
320
321 // extract the params from the cgi-request,
322 Element cgi_paramList = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
323 HashMap<String, Serializable> params = GSXML.extractParams(cgi_paramList, false);
324
325 String coll_name = (String) params.get(GSParams.COLLECTION);
326 if (coll_name == null || coll_name.equals(""))
327 {
328 // just return an empty response
329 Element response = doc.createElement(GSXML.RESPONSE_ELEM);
330 addSiteMetadata(response, userContext);
331 addInterfaceOptions(response);
332 return response;
333 }
334
335 // else get the coll description - actually this is the same as for the about page - should we merge these two methods??
336
337 // if there is a service specified should we get the service description instead??
338 // get the collection or cluster description
339 Element coll_about_message = doc.createElement(GSXML.MESSAGE_ELEM);
340
341 Element coll_about_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, userContext);
342 coll_about_message.appendChild(coll_about_request);
343
344 Element coll_about_response = (Element) this.mr.process(coll_about_message);
345
346 Element response = (Element) GSXML.getChildByTagName(coll_about_response, GSXML.RESPONSE_ELEM);
347
348 //add the site metadata
349 addSiteMetadata(response, userContext);
350 addInterfaceOptions(response);
351
352 return response;
353
354 }
355
356 protected boolean sendMultipleRequests(Document doc, NodeList items, String path_prefix, String request_type, UserContext userContext)
357 {
358 // we will send all the requests in a single message
359 Element message = doc.createElement(GSXML.MESSAGE_ELEM);
360 for (int i = 0; i < items.getLength(); i++)
361 {
362 Element c = (Element) items.item(i);
363 String path = c.getAttribute(GSXML.NAME_ATT);
364 if (path_prefix != null)
365 {
366 path = GSPath.appendLink(path_prefix, path);
367 }
368 Element request = GSXML.createBasicRequest(doc, request_type, path, userContext);
369 message.appendChild(request);
370 }
371
372 Element response_message = (Element) this.mr.process(message);
373
374 NodeList responses = response_message.getElementsByTagName(GSXML.RESPONSE_ELEM);
375 // check that have same number of responses as requests
376 if (items.getLength() != responses.getLength())
377 {
378 logger.error("didn't get a response for each request - somethings gone wrong!");
379 return false;
380 }
381
382 for (int i = 0; i < items.getLength(); i++)
383 {
384 Element c1 = (Element) items.item(i);
385 Element c2 = (Element) GSXML.getChildByTagName((Element) responses.item(i), c1.getTagName());
386 if (c1 != null && c2 != null && c1.getAttribute(GSXML.NAME_ATT).endsWith(c2.getAttribute(GSXML.NAME_ATT)))
387 {
388 //add the new data into the original element
389 GSXML.mergeElements(c1, c2);
390 }
391 else
392 {
393 logger.debug(" response does not correspond to request!");
394 }
395
396 }
397
398 return true;
399
400 }
401
402 protected Element gli4gs3Page(Element request)
403 {
404 Document doc = XMLConverter.newDOM();
405
406 String lang = request.getAttribute(GSXML.LANG_ATT);
407 String uid = request.getAttribute(GSXML.USER_ID_ATT);
408
409 Element page_response = doc.createElement(GSXML.RESPONSE_ELEM);
410
411 Element applet_elem = doc.createElement("Applet");
412 page_response.appendChild(applet_elem);
413 applet_elem.setAttribute("ARCHIVE", "SignedGatherer.jar"); // SignedGatherer.jar should be placed in web/applet.
414 applet_elem.setAttribute("CODE", "org.greenstone.gatherer.GathererApplet");
415 applet_elem.setAttribute("CODEBASE", "applet"); // SignedGatherer.jar is in web/applet. But CODEBASE is the *URL* path to the (jar) file containing the main class, and is relative to documentroot "web".
416 applet_elem.setAttribute("HEIGHT", "50");
417 applet_elem.setAttribute("WIDTH", "380");
418
419 Element gwcgi_param_elem = doc.createElement("PARAM");
420 gwcgi_param_elem.setAttribute("name", "gwcgi");
421 String library_name = GlobalProperties.getGSDL3WebAddress();
422 gwcgi_param_elem.setAttribute("value", library_name);
423 applet_elem.appendChild(gwcgi_param_elem);
424
425 Element gsdl3_param_elem = doc.createElement("PARAM");
426 gsdl3_param_elem.setAttribute("name", "gsdl3");
427 gsdl3_param_elem.setAttribute("value", "true");
428 applet_elem.appendChild(gsdl3_param_elem);
429
430 Node default_text = doc.createTextNode("GLI applet");
431 applet_elem.appendChild(default_text);
432
433 return page_response;
434 }
435}
Note: See TracBrowser for help on using the repository browser.