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

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

Changed 'Element process(Element)' in ModuleInterface to 'Node process(Node)'. After some deliberation is was decided this is a more useful (generic) layer of the DOM to pass information around in. Helps with the DocType problem when producing XSL Transformed pages, for example. When this was an Element, it would loose track of its DocType. Supporting method provided in XMLConverter 'Element nodeToElement(Node)' which checks a nodes docType and casts to Element if appropriate, or if a Document, typecasts to that and then extracts the top-level Element. With this fundamental change in ModuleInterface, around 20 files needed to be updated (Actions, Services, etc) that build on top of 'process()' to reflect this change, and use nodeToElement where necessary.

  • Property svn:keywords set to Author Date Id Revision
File size: 4.8 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
16/** action class for handling applets */
17public class AppletAction extends Action {
18
19 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.action.AppletAction.class.getName());
20
21 public Node process (Node message_node) {
22
23 Element message = this.converter.nodeToElement(message_node);
24
25 Element request = (Element)GSXML.getChildByTagName(message, GSXML.REQUEST_ELEM);
26 Element result = this.doc.createElement(GSXML.MESSAGE_ELEM);
27 Element page_response = this.doc.createElement(GSXML.RESPONSE_ELEM);
28 result.appendChild(page_response);
29
30 // get the collection and service params
31 Element cgi_param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
32 HashMap params = GSXML.extractParams(cgi_param_list, false);
33
34 // request_type is display (d) or request (r)
35 String request_type = (String)params.get(GSParams.REQUEST_TYPE);
36 if (!request_type.equals("d")&&!request_type.equals("r")) {
37 logger.error("AppletAction Error: the rt arg should be either d or r, instead it was "+request_type+"!");
38 return result;
39 }
40
41 String collection = (String)params.get(GSParams.COLLECTION);
42 boolean coll_specified = true;
43 String service_name=(String)params.get(GSParams.SERVICE);
44 String lang = request.getAttribute(GSXML.LANG_ATT);
45 String uid = request.getAttribute(GSXML.USER_ID_ATT);
46 String to=null;
47 if (collection==null||collection.equals("") ) {
48 coll_specified = false;
49 to = service_name;
50 } else {
51 to = GSPath.appendLink(collection, service_name);
52 }
53
54 if (request_type.equals("r")) {
55 // we are processing stuff for the applet send a message to the service, type="query", and take out the something element, and return that as our result - the applet must take xml
56
57 Element mr_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
58 Element mr_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid);
59 mr_message.appendChild(mr_request);
60 // just append all the params for now - should filter out unneeded ones
61 mr_request.appendChild(this.doc.importNode(cgi_param_list, true));
62
63 // process the request
64 Element mr_response = (Element)this.mr.process(mr_message);
65 // get the applet data out and pass it back as is.
66 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.APPLET_DATA_ELEM);
67Element applet_info = GSXML.getFirstElementChild(GSXML.getNodeByPath(mr_response, path));
68 //Element applet_info = (Element)GSXML.getNodeByPath(mr_response, path).getFirstChild();
69 return applet_info;
70
71 }
72
73
74 // get the applet description, and the collection info if a collection is specified
75
76 Element mr_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
77 Element applet_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, lang, uid);
78 mr_message.appendChild(applet_request);
79
80
81 Element mr_response = (Element)this.mr.process(mr_message);
82
83 // add in the applet info
84 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.SERVICE_ELEM);
85 //path = GSPath.appendLink(path, GSXML.APPLET_ELEM);
86 Element service_elem = (Element)this.doc.importNode(GSXML.getNodeByPath(mr_response, path), true);
87 Element applet_elem = (Element)GSXML.getChildByTagName(service_elem, GSXML.APPLET_ELEM);
88 // must handle any params that have values that are not
89 // necessarily known by the service
90 // should this be done here or by web receptionist??
91 // cant really have an applet without web?
92 editLocalParams(applet_elem, (String)config_params.get(GSConstants.LIBRARY_NAME), collection);
93 page_response.appendChild(service_elem);
94
95 return result;
96
97 }
98
99 /** this method looks through the PARAMs of the applet description for
100 * 'library' or 'collection'. If found, the params are set to
101 * the appropriate values
102 * should this be done here or in the receptionist?
103 */
104 protected void editLocalParams(Element description, String library_name,
105 String full_collection_name) {
106
107 Node child = description.getFirstChild();
108 while (child != null) {
109 if (child.getNodeType() == Node.ELEMENT_NODE) {
110 String param = child.getNodeName();
111 if (param.equals("PARAM")||param.equals("param")) {
112 String name = ((Element)child).getAttribute("NAME");
113 if (name == null || name.equals("")) {
114 // somethings wrong!!
115 } else if (name.equals("library")) {
116 ((Element)child).setAttribute("VALUE", library_name);
117 } else if (name.equals("collection")) {
118 ((Element)child).setAttribute("VALUE", full_collection_name);
119 }
120
121 }
122 }
123 child = child.getNextSibling();
124 }
125 }
126
127}
Note: See TracBrowser for help on using the repository browser.