source: greenstone3/branches/3.03/src/java/org/greenstone/gsdl3/action/PageAction.java@ 14653

Last change on this file since 14653 was 14653, checked in by qq6, 17 years ago

updated by Anna

  • 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.