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

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

Second round of changes adding in the login ability, also interface options are now returned whenever site metadata is returned

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