source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/Action.java@ 24219

Last change on this file since 24219 was 24219, checked in by ak19, 13 years ago

Thanks to Sam, Veronica and Dr Bainbridge, can finally commit the changes necessary for ticket 449.

  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 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.Element;
9import org.w3c.dom.Document;
10
11// other java stuff
12import java.io.File;
13import java.util.Vector;
14import java.util.HashMap;
15import java.util.HashSet;
16import java.util.Iterator;
17
18import org.apache.log4j.*;
19
20/** base class for Actions */
21abstract public class Action {
22
23 /** the system set up variables */
24 protected HashMap config_params = null;
25 /** container Document to create XML Nodes */
26 protected Document doc=null;
27 /** a converter class to parse XML and create Docs */
28 protected XMLConverter converter=null;
29 /** a reference to the message router that it must talk to to
30 * get info. it may be a communicator acting as a proxy, but it
31 doesn't care about that */
32 protected ModuleInterface mr=null;
33
34 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.action.Action.class.getName());
35
36 public Action() {
37 this.converter = new XMLConverter();
38 this.doc = this.converter.newDOM();
39 }
40
41 /** the config variables must be set before configure is called */
42 public void setConfigParams(HashMap params) {
43 this.config_params = params;
44 }
45 /** sets the message router */
46 public void setMessageRouter(ModuleInterface m) {
47 this.mr = m;
48 }
49 public boolean configure() {
50 // does nothing yet
51 return true;
52 }
53
54 /** process takes an xml representation of cgi args
55 * and returns the page of results - may be in html/xml/other
56 * depending on the output att of the request */
57 public String process(String xml_in) {
58
59 Document message_doc = this.converter.getDOM(xml_in);
60 if (message_doc == null) {
61 logger.error("Couldn't parse request");
62 logger.error(xml_in);
63 return null;
64 }
65 Node result = process(message_doc);
66 return this.converter.getString(result);
67 }
68
69 /** the main process method - must be implemented in subclass */
70 abstract public Node process(Node xml_in);
71
72 /** tell the param class what its arguments are
73 * if an action has its own arguments, this should add them to the params
74 * object - particularly important for args that should not be saved */
75 public boolean getActionParameters(GSParams params) {
76 return true;
77 }
78
79 protected void extractMetadataNames(Element format, HashSet meta_names) {
80 //NodeList nodes = format.getElementsByTagNameNS("metadata", "http://www.greenstone.org/configformat");
81 NodeList metadata_nodes = format.getElementsByTagName("gsf:metadata");
82 for (int i=0; i<metadata_nodes.getLength(); i++) {
83 Element elem = (Element)metadata_nodes.item(i);
84 StringBuffer metadata = new StringBuffer();
85 String all = elem.getAttribute("multiple");
86 String name = elem.getAttribute("name");
87 String select = elem.getAttribute("select");
88 String sep = elem.getAttribute("separator");
89 if (all.equals("true")) {
90 metadata.append("all");
91 metadata.append(GSConstants.META_RELATION_SEP);
92 }
93 if (!select.equals("")) {
94 metadata.append(select);
95 metadata.append(GSConstants.META_RELATION_SEP);
96 }
97 if (!sep.equals("")) {
98 metadata.append(GSConstants.META_SEPARATOR_SEP);
99 metadata.append(sep);
100 metadata.append(GSConstants.META_SEPARATOR_SEP);
101 metadata.append(GSConstants.META_RELATION_SEP);
102 }
103
104 metadata.append(name);
105 meta_names.add(metadata.toString());
106 }
107
108 // The XSL tranform for
109 // gsf:link type="source"
110 // makes use of 'assocfilepath' so need to make sure it's asked for
111
112 NodeList link_nodes = format.getElementsByTagName("gsf:link");
113 for (int i=0; i<link_nodes.getLength(); i++) {
114 Element elem = (Element)link_nodes.item(i);
115 String type = elem.getAttribute("type");
116 if (type.equals("source")) {
117 meta_names.add("assocfilepath");
118 } else if (type.equals("sourcelinkfile")) {
119 meta_names.add("assocfilepath");
120 //meta_names.add("srclinkFile");
121 }
122 }
123
124
125 // get all the metadata necessary for when the user has used "gsf:equivlink"
126 // so that we can build up the equivlink from the metadata components it needs
127 link_nodes = format.getElementsByTagName("gsf:equivlinkgs3");
128 if(link_nodes != null) {
129
130 String[] equivlink_metanames = {"equivDocIcon", "equivDocLink", "/equivDocLink"};
131
132 for(int i = 0; i < equivlink_metanames.length; i++) {
133 StringBuffer metadata = new StringBuffer();
134 metadata.append("all"); // this means the attr multiple = true;
135 metadata.append(GSConstants.META_RELATION_SEP);
136
137 metadata.append(GSConstants.META_SEPARATOR_SEP);
138 metadata.append(','); // attr separator = ","
139 metadata.append(GSConstants.META_SEPARATOR_SEP);
140 metadata.append(GSConstants.META_RELATION_SEP);
141
142 // the name of the metadata we're retrieving
143 metadata.append(equivlink_metanames[i]);
144 meta_names.add(metadata.toString());
145 }
146 }
147 }
148
149 protected Element createMetadataParamList(HashSet metadata_names) {
150 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
151
152 Element param = null;
153 Iterator i = metadata_names.iterator();
154 while (i.hasNext()) {
155 String name = (String)i.next();
156 param = this.doc.createElement(GSXML.PARAM_ELEM);
157 param_list.appendChild(param);
158 param.setAttribute(GSXML.NAME_ATT, "metadata");
159 param.setAttribute(GSXML.VALUE_ATT, name);
160
161 }
162 return param_list;
163 }
164
165 protected boolean processErrorElements(Element message, Element page) {
166 NodeList error_nodes = message.getElementsByTagName(GSXML.ERROR_ELEM);
167 if (error_nodes.getLength()==0) {
168 return false;
169 }
170 Document owner = page.getOwnerDocument();
171 for (int i=0; i<error_nodes.getLength(); i++) {
172 page.appendChild(owner.importNode(error_nodes.item(i), true));
173 }
174 return true;
175 }
176
177 /**
178 * Takes an XML element and adds the metadata of the current site to it.
179 * Useful for adding the current site's metadata to a response before sending it
180 *
181 * @param element the element to add site metadata to
182 * @param lang the current language
183 * @param uid the current user id
184 */
185 protected void addSiteMetadata( Element element, String lang, String uid ) {
186 //ADD SITE METADATA
187 Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", lang, uid);
188 //create a hashmap of params
189 HashMap subset_params = new HashMap(1);
190 subset_params.put(GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
191 //create the element to put the params in
192 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
193 //put them in
194 GSXML.addParametersToList( this.doc, param_list, subset_params );
195 metadata_request.appendChild(param_list);
196 //create the message
197 Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
198 metadata_message.appendChild(metadata_request);
199 //get response
200 Element metadata_response_message = (Element)this.mr.process(metadata_message);
201 //drill down to response
202 Element metadata_response = (Element)GSXML.getChildByTagName(metadata_response_message, GSXML.RESPONSE_ELEM);
203 //merge in metadata
204 GSXML.mergeMetadataLists(element,metadata_response);
205 }
206
207}
208
209
210
211
Note: See TracBrowser for help on using the repository browser.