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

Last change on this file since 14642 was 14642, checked in by anna, 17 years ago

Added ct parameter when processing the about pagerequest, so that preference page and search page knows the collection's index type and display search modes properly.

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