source: greenstone3/trunk/src/java/org/greenstone/gsdl3/core/SkinnedReceptionist.java@ 16446

Last change on this file since 16446 was 16446, checked in by davidb, 16 years ago

Replacement of Java 1.5 code with Java 1.4 equivalent, plus tidied up indentation

File size: 14.1 KB
Line 
1package org.greenstone.gsdl3.core;
2
3import java.util.*;
4import java.io.*;
5
6import org.w3c.dom.NodeList;
7import org.w3c.dom.Document;
8import org.w3c.dom.Element;
9import org.w3c.dom.Node;
10
11import org.greenstone.gsdl3.util.*;
12
13import javax.xml.xpath.*;
14
15public class SkinnedReceptionist extends NZDLReceptionist {
16
17 /** a transformer class to transform xml using xslt */
18 protected XMLTransformer transformer=null;
19
20 public SkinnedReceptionist() {
21 super();
22 System.out.println("Skinned Receptionist created");
23 //this.xslt_map = new HashMap();
24 this.transformer = new XMLTransformer();
25 }
26
27 protected Node postProcessPage(Element p) {
28 try {
29 //Avoid the duplicate attribute in the namespaces declaration of the generated html file
30 //String NAMESPACE_URI = "http://www.greenstone.org/greenstone3/schema/gsf";
31 //String NAMESPACE_PREFIX = "gsf";
32 //p.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + NAMESPACE_PREFIX, NAMESPACE_URI);
33
34
35 Page page = new Page(p, this);
36 Skin skin = new Skin(page, this);
37
38 addExtraInfo(p);
39 addCssFiles(page, skin);
40 addJsFiles(page, skin);
41 addUiElements(page);
42 addMetadataElements(page);
43
44 String output = page.getPageRequest().getAttribute(GSXML.OUTPUT_ATT);
45
46 // might need to add some data to the page
47 //addExtraInfo(page);
48
49
50 System.out.println("action = " + page.getAction());
51 // if we are displaying a document, specify an attribute for weither a cover image exists.
52 if (page.getAction().equals("d")) {
53
54 System.out.println("doing the document thing");
55
56 Element document = (Element)p.getElementsByTagName("document").item(0);
57 Element metadataList = (Element)GSXML.getChildByTagName(document, "metadataList");
58 String archiveDir = "";
59 NodeList metadata = metadataList.getChildNodes();
60 for (int i=0; i<metadata.getLength(); i++) {
61 Element m = (Element) metadata.item(i);
62 if (m.getAttribute("name").equals("archivedir"))
63 archiveDir = GSXML.getNodeText(m);
64 }
65
66 String coverImage_path = page.getCollectionHome()
67 + File.separatorChar + "index"
68 + File.separatorChar + "assoc"
69 + File.separatorChar + archiveDir
70 + File.separatorChar + "cover.jpg";
71
72 document.setAttribute("coverImage", coverImage_path);
73
74 File coverImage = new File(coverImage_path);
75 document.setAttribute("hasCoverImage", String.valueOf(coverImage.canRead()));
76 }
77
78
79 Node np = null;
80 try {
81
82 if (skin != null && !output.equals("xml")) {
83 System.err.println("Away to to skin transformPage");
84 np = skin.transformPage(page);
85 System.err.println("done");
86
87
88 }
89 else {
90 np = p;
91 }
92 } catch (Exception e) {
93 e.printStackTrace();
94 }
95
96
97
98 return np;
99 } catch (Exception e) {
100 e.printStackTrace();
101 return doc.createElement("page");
102 }
103 }
104
105 /** overwrite this to add any extra info that might be needed in the page before transformation */
106 protected void addExtraInfo(Element page) {
107
108 //logger.debug("the page before adding extra info is");
109 //logger.debug(this.converter.getPrettyString(page));
110
111 super.addExtraInfo(page);
112
113 // this gets the collection info
114 Element page_response = (Element)GSXML.getChildByTagName(page, GSXML.PAGE_RESPONSE_ELEM);
115 Element page_request = (Element)GSXML.getChildByTagName(page, GSXML.PAGE_REQUEST_ELEM);
116 Element collection_info = (Element)GSXML.getChildByTagName(page_response, GSXML.COLLECTION_ELEM);
117 if (collection_info== null) {
118 return;
119 }
120
121 String collection = collection_info.getAttribute("name"); // should we take this from the request instead??
122 // look through services and see if classifier one is present - need to
123 // get the list of classifiers
124 Element service_list = (Element)GSXML.getChildByTagName(collection_info, GSXML.SERVICE_ELEM+GSXML.LIST_MODIFIER);
125 if (service_list == null) {
126 // something weird has gone wrong
127 return;
128 }
129
130 Element info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
131 String lang = page.getAttribute(GSXML.LANG_ATT);
132
133 boolean do_classifier = false;
134 boolean do_query = false;
135 Element classifier_service = GSXML.getNamedElement(service_list, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, "ClassifierBrowse");
136 Element query_service = GSXML.getNamedElement(service_list, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, "TextQuery");
137 if (classifier_service != null) {
138 do_classifier = true;
139 // find the list of classifiers
140
141 String to = GSPath.appendLink(collection, "ClassifierBrowse");
142 Element info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, lang, "");
143 info_message.appendChild(info_request);
144 }
145
146 String action = page_request.getAttribute(GSXML.ACTION_ATT);
147 String subaction = page_request.getAttribute(GSXML.SUBACTION_ATT);
148
149 if (query_service != null && action.equals("p") && subaction.equals("about")) {
150 do_query = true;
151 // get the full description
152 String to = GSPath.appendLink(collection, "TextQuery");
153 Element query_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, lang, "");
154 info_message.appendChild(query_request);
155
156 }
157
158 Element info_resp_message = (Element) this.mr.process(info_message);
159 Element info_response = (Element) GSXML.getChildByTagName(info_resp_message, GSXML.RESPONSE_ELEM);
160 // String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.SERVICE_ELEM);
161 if (do_classifier) {
162 Element classifier_service_info = (Element)GSXML.getNamedElement(info_response, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, "CLassifierBrowse");
163 if (classifier_service_info != null) {
164 service_list.replaceChild(this.doc.importNode(classifier_service_info, true), classifier_service);
165 }
166 }
167 if (do_query) {
168 Element query_service_info = (Element)GSXML.getNamedElement(info_response, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, "TextQuery");
169 if (query_service_info != null) {
170 service_list.replaceChild(this.doc.importNode(query_service_info, true), query_service);
171 }
172 }
173 //logger.debug("the final page before transforming is");
174 //logger.debug(this.converter.getPrettyString(page));
175 return;
176 }
177
178 protected void addCssFiles(Page page, Skin skin) {
179
180 Element cssFileList = doc.createElement("cssFileList");
181
182 // get skin level files
183 if (skin != null) {
184 File dir = new File(skin.rootDirectory.getPath() + File.separatorChar + "css");
185 if (dir.isDirectory()) {
186 File[] files = dir.listFiles();
187
188 for (int fi=0, fn=files.length; fi<fn; fi++) {
189 if (files[fi].getName().endsWith(".css")) {
190 Element cssFile = doc.createElement("cssFile");
191 String path = files[fi].getPath();
192 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
193 //changes to a correct path in case GS3 runs on Windows
194 path = path.replace( '\\', '/' );
195 cssFile.setAttribute("path", path);
196 cssFileList.appendChild(cssFile);
197 }
198 }
199 }
200 }
201
202 // get site level files
203 String site_home = page.getSiteHome();
204 File dir = new File(site_home + File.separatorChar + "ui" + File.separatorChar + "css");
205 if (dir.isDirectory()) {
206 File[] files = dir.listFiles();
207 for (int fi=0, fn=files.length; fi<fn; fi++) {
208 if (files[fi].getName().endsWith(".css")) {
209 Element cssFile = doc.createElement("cssFile");
210 String path = files[fi].getPath();
211 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
212 //changes to a correct path in case GS3 runs on Windows
213 path = path.replace( '\\', '/' );
214 cssFile.setAttribute("path", path);
215 cssFileList.appendChild(cssFile);
216 }
217 }
218 }
219
220 // get collect level files
221 String collect_home = page.getCollectionHome();
222 if (collect_home != "") {
223 dir = new File(collect_home + File.separatorChar + "ui" + File.separatorChar + "css");
224 if (dir.isDirectory()) {
225 File[] files = dir.listFiles();
226 for (int fi=0, fn=files.length; fi<fn; fi++) {
227 if (files[fi].getName().endsWith(".css")) {
228 Element cssFile = doc.createElement("cssFile");
229 String path = files[fi].getPath();
230 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
231 //changes to a correct path in case GS3 runs on Windows
232 path = path.replace( '\\', '/' );
233 cssFile.setAttribute("path", path);
234 cssFileList.appendChild(cssFile);
235 }
236 }
237 }
238 }
239
240 page.getPageResponse().appendChild(cssFileList);
241 }
242
243 protected void addJsFiles(Page page, Skin skin) {
244
245 Element jsFileList = doc.createElement("jsFileList");
246
247 // get skin level files
248 if (skin != null) {
249 File dir = new File(skin.rootDirectory.getPath() + File.separatorChar + "js");
250 if (dir.isDirectory()) {
251 File[] files = dir.listFiles();
252
253 for (int fi=0, fn=files.length; fi<fn; fi++) {
254 if (files[fi].getName().endsWith(".js")) {
255 Element jsFile = doc.createElement("jsFile");
256 String path = files[fi].getPath();
257 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
258 //changes to a correct path in case GS3 runs on Windows
259 path = path.replace( '\\', '/' );
260 jsFile.setAttribute("path", path);
261 jsFileList.appendChild(jsFile);
262 }
263 }
264 }
265 }
266
267 // get site level files
268 String site_home = page.getSiteHome();
269 File dir = new File(site_home + File.separatorChar + "ui" + File.separatorChar + "js");
270 if (dir.isDirectory()) {
271 File[] files = dir.listFiles();
272 for (int fi=0, fn=files.length; fi<fn; fi++) {
273 if (files[fi].getName().endsWith(".js")) {
274 Element jsFile = doc.createElement("jsFile");
275 String path = files[fi].getPath();
276 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
277 //changes to a correct path in case GS3 runs on Windows
278 path = path.replace( '\\', '/' );
279 jsFile.setAttribute("path", path);
280 jsFileList.appendChild(jsFile);
281 }
282 }
283 }
284
285 // get collect level files
286 String collect_home = page.getCollectionHome();
287 if (collect_home != "") {
288 dir = new File(collect_home + File.separatorChar + "ui" + File.separatorChar + "js");
289 if (dir.isDirectory()) {
290 File[] files = dir.listFiles();
291 for (int fi=0, fn=files.length; fi<fn; fi++) {
292 if (files[fi].getName().endsWith(".js")) {
293 Element jsFile = doc.createElement("jsFile");
294 String path = files[fi].getPath();
295 path = "." + path.substring(GlobalProperties.getGSDL3Home().length());
296 //changes to a correct path in case GS3 runs on Windows
297 path = path.replace( '\\', '/' );
298 jsFile.setAttribute("path", path);
299 jsFileList.appendChild(jsFile);
300 }
301 }
302 }
303 }
304
305 page.getPageResponse().appendChild(jsFileList);
306 }
307
308 protected void addUiElements(Page page) {
309
310 Document siteUi = page.getSiteUi();
311 Document collectUi = page.getCollectUi();
312 String lang = page.getLanguage();
313
314 HashMap elements = getRelevantElements("uiItem", lang, siteUi, collectUi);
315 Element xmlElements = doc.createElement("uiItemList");
316
317 Iterator i = elements.values().iterator();
318 while (i.hasNext()) {
319 Element element = (Element)i.next();
320
321 // doc.adoptNode(element); // Java 1.5 (DOM Level 3)
322 // xmlElements.appendChild(element);
323
324 // Java 1.4 equivalent
325 Node doc_owned_node = doc.importNode(element,true);
326 // Should also remove element from its original parent, as adopt does?
327 // element.getParentNode().removeChild(element);
328
329
330 xmlElements.appendChild(doc_owned_node);
331
332
333 }
334
335 page.getPageResponse().appendChild(xmlElements);
336 }
337
338 protected void addMetadataElements(Page page) {
339 Document siteMetadata = page.getSiteMetadata();
340 Document collectMetadata = page.getCollectMetadata();
341 String lang = page.getLanguage();
342
343 HashMap elements = getRelevantElements("metadataItem", lang, siteMetadata, collectMetadata);
344 Element xmlElements = doc.createElement("metadataList");
345
346 Iterator i = elements.values().iterator();
347 while (i.hasNext()) {
348 Element element = (Element)i.next();
349
350 // doc.adoptNode(element); // Java 1.5 (DOM Level 3)
351 // xmlElements.appendChild(element);
352
353 // Java 1.4 equivalent
354 Node doc_owned_node = doc.importNode(element,true);
355 // Should also remove element from its original parent, as adopt does?
356 // element.getParentNode().removeChild(element);
357
358 xmlElements.appendChild(doc_owned_node);
359 }
360
361 page.getPageResponse().appendChild(xmlElements);
362 }
363
364 protected Node transformPage(Element page) {
365 return super.transformPage(page);
366 }
367
368 private HashMap getRelevantElements(String tagName, String lang, Document siteLevel, Document collectLevel) {
369
370 HashMap elements = new HashMap();
371
372 // get all relevant elements from collect level
373 if (collectLevel != null) {
374
375 NodeList xmlElements = collectLevel.getElementsByTagName(tagName);
376 for (int di = 0, dn = xmlElements.getLength(); di < dn; di++) {
377
378 Element xmlElement = (Element)xmlElements.item(di);
379
380 // only include elements that are language independent or are the correct language, and do not specify inherit=true
381 if ((xmlElement.getAttribute("lang").equals("") || xmlElement.getAttribute("lang").equalsIgnoreCase(lang)) && !xmlElement.getAttribute("inherit").equalsIgnoreCase("true")) {
382 String name = xmlElement.getAttribute("name");
383 //System.out.println(name + " found and added at collect level");
384 elements.put(name, xmlElement);
385 }
386 }
387 }
388
389 // get all elements from site level
390 if (siteLevel != null) {
391
392 //System.out.println("getting all " + tagName + "'s (" + lang + ") from " + converter.getPrettyString(siteLevel));
393
394 NodeList xmlElements = siteLevel.getElementsByTagName(tagName);
395 for (int di = 0, dn = xmlElements.getLength(); di < dn; di++) {
396
397 Element xmlElement = (Element)xmlElements.item(di);
398
399 // only include elements that are language independent or are the correct language, and which havent already been specified at collect level
400 if (xmlElement.getAttribute("lang").equals("") || xmlElement.getAttribute("lang").equalsIgnoreCase(lang)) {
401 String name = xmlElement.getAttribute("name");
402 //System.out.println(name + " found at site level");
403
404 if (!elements.containsKey(name)) {
405 elements.put(name, xmlElement);
406 //System.out.println(name + " added at site level");
407 }
408 }
409 }
410 }
411
412 return elements;
413 }
414
415
416}
Note: See TracBrowser for help on using the repository browser.