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

Last change on this file since 20292 was 19984, checked in by oranfry, 15 years ago

initial implementation of support for site-level metadata

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