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

Last change on this file since 26055 was 26055, checked in by sjm84, 12 years ago

Adding constants for the various XML namespaces used in the code

  • Property svn:keywords set to Author Date Id Revision
File size: 8.5 KB
Line 
1package org.greenstone.gsdl3.action;
2
3import java.util.HashMap;
4import java.util.HashSet;
5import java.util.Iterator;
6
7import org.apache.log4j.Logger;
8import org.greenstone.gsdl3.core.ModuleInterface;
9import org.greenstone.gsdl3.util.GSConstants;
10import org.greenstone.gsdl3.util.GSParams;
11import org.greenstone.gsdl3.util.GSXML;
12import org.greenstone.gsdl3.util.UserContext;
13import org.greenstone.gsdl3.util.XMLConverter;
14import org.w3c.dom.Document;
15import org.w3c.dom.Element;
16import org.w3c.dom.Node;
17import org.w3c.dom.NodeList;
18
19/** base class for Actions */
20abstract public class Action
21{
22
23 /** the system set up variables */
24 protected HashMap<String, Comparable> 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 /**
30 * a reference to the message router that it must talk to to get info. it
31 * may be a communicator acting as a proxy, but it doesn't care about that
32 */
33 protected ModuleInterface mr = null;
34
35 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.action.Action.class.getName());
36
37 public Action()
38 {
39 this.converter = new XMLConverter();
40 this.doc = this.converter.newDOM();
41 }
42
43 /** the config variables must be set before configure is called */
44 public void setConfigParams(HashMap<String, Comparable> params)
45 {
46 this.config_params = params;
47 }
48
49 /** sets the message router */
50 public void setMessageRouter(ModuleInterface m)
51 {
52 this.mr = m;
53 }
54
55 public boolean configure()
56 {
57 // does nothing yet
58 return true;
59 }
60
61 /**
62 * process takes an xml representation of cgi args and returns the page of
63 * results - may be in html/xml/other depending on the output att of the
64 * request
65 */
66 public String process(String xml_in)
67 {
68
69 Document message_doc = this.converter.getDOM(xml_in);
70 if (message_doc == null)
71 {
72 logger.error("Couldn't parse request");
73 logger.error(xml_in);
74 return null;
75 }
76 Node result = process(message_doc);
77 return this.converter.getString(result);
78 }
79
80 /** the main process method - must be implemented in subclass */
81 abstract public Node process(Node xml_in);
82
83 /**
84 * tell the param class what its arguments are if an action has its own
85 * arguments, this should add them to the params object - particularly
86 * important for args that should not be saved
87 */
88 public boolean addActionParameters(GSParams params)
89 {
90 return true;
91 }
92
93 protected void getRequiredMetadataNames(Element format, HashSet<String> meta_names)
94 {
95 extractMetadataNames(format, meta_names);
96 addLinkMetadataNames(format, meta_names);
97 }
98
99 protected void extractMetadataNames(Element format, HashSet<String> meta_names)
100 {
101 NodeList metadata_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "metadata");
102 for (int i = 0; i < metadata_nodes.getLength(); i++)
103 {
104 Element elem = (Element) metadata_nodes.item(i);
105 StringBuffer metadata = new StringBuffer();
106 String pos = elem.getAttribute("pos");
107 String name = elem.getAttribute("name");
108 String select = elem.getAttribute("select");
109 String sep = elem.getAttribute("separator");
110
111 if (pos.equals("offset"))
112 { // offset when requested to use mdoffset
113 metadata.append("offset");
114 metadata.append(GSConstants.META_RELATION_SEP);
115 }
116 else if (!pos.equals(""))
117 {
118 metadata.append("pos" + pos); // first, last or indexing number
119 metadata.append(GSConstants.META_RELATION_SEP);
120 }
121
122 if (!select.equals(""))
123 {
124 metadata.append(select);
125 metadata.append(GSConstants.META_RELATION_SEP);
126 }
127 if (!sep.equals(""))
128 {
129 metadata.append(GSConstants.META_SEPARATOR_SEP);
130 metadata.append(sep);
131 metadata.append(GSConstants.META_SEPARATOR_SEP);
132 metadata.append(GSConstants.META_RELATION_SEP);
133 }
134
135 metadata.append(name);
136 meta_names.add(metadata.toString());
137 }
138 }
139
140 protected void addLinkMetadataNames(Element format, HashSet<String> meta_names)
141 {
142 // The XSL tranform for
143 // gsf:link type="source"
144 // makes use of 'assocfilepath' so need to make sure it's asked for
145
146 boolean getEquivLinkMeta = false;
147
148 NodeList link_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "link");
149 for (int i = 0; i < link_nodes.getLength(); i++)
150 {
151 Element elem = (Element) link_nodes.item(i);
152 String type = elem.getAttribute("type");
153 if (type.equals("source"))
154 {
155 meta_names.add("assocfilepath");
156 meta_names.add("srclinkFile");
157 }
158 else if (type.equals("web"))
159 {
160 meta_names.add("weblink");
161 meta_names.add("webicon");
162 meta_names.add("/weblink");
163 }
164 else if (type.equals("equivdoc"))
165 {
166 getEquivLinkMeta = true;
167 }
168 }
169
170 // get all the metadata necessary for when the user has used "gsf:equivlink"
171 // so that we can build up the equivlink from the metadata components it needs
172 link_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "equivlinkgs3");
173 if (getEquivLinkMeta || link_nodes.getLength() > 0)
174 {
175 String[] equivlink_metanames = { "equivDocIcon", "equivDocLink", "/equivDocLink" };
176
177 for (int i = 0; i < equivlink_metanames.length; i++)
178 {
179 StringBuffer metadata = new StringBuffer();
180 metadata.append("all"); // this means the attr multiple = true;
181 metadata.append(GSConstants.META_RELATION_SEP);
182
183 metadata.append(GSConstants.META_SEPARATOR_SEP);
184 metadata.append(','); // attr separator = ","
185 metadata.append(GSConstants.META_SEPARATOR_SEP);
186 metadata.append(GSConstants.META_RELATION_SEP);
187
188 // the name of the metadata we're retrieving
189 metadata.append(equivlink_metanames[i]);
190 meta_names.add(metadata.toString());
191 }
192 }
193
194 if (format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "image").getLength() > 0)
195 {
196 meta_names.add("Thumb");
197 meta_names.add("Screen");
198 meta_names.add("SourceFile");
199 }
200 }
201
202 protected Element createMetadataParamList(HashSet<String> metadata_names)
203 {
204 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
205
206 Element param = null;
207 Iterator<String> i = metadata_names.iterator();
208 while (i.hasNext())
209 {
210 String name = i.next();
211 param = this.doc.createElement(GSXML.PARAM_ELEM);
212 param_list.appendChild(param);
213 param.setAttribute(GSXML.NAME_ATT, "metadata");
214 param.setAttribute(GSXML.VALUE_ATT, name);
215
216 }
217 return param_list;
218 }
219
220 protected boolean processErrorElements(Element message, Element page)
221 {
222 NodeList error_nodes = message.getElementsByTagName(GSXML.ERROR_ELEM);
223 if (error_nodes.getLength() == 0)
224 {
225 return false;
226 }
227 Document owner = page.getOwnerDocument();
228 for (int i = 0; i < error_nodes.getLength(); i++)
229 {
230 page.appendChild(owner.importNode(error_nodes.item(i), true));
231 }
232 return true;
233 }
234
235 /**
236 * Takes an XML element and adds the metadata of the current site to it.
237 * Useful for adding the current site's metadata to a response before
238 * sending it
239 *
240 * @param element
241 * the element to add site metadata to
242 * @param lang
243 * the current language
244 * @param uid
245 * the current user id
246 */
247 protected void addSiteMetadata(Element element, UserContext userContext)
248 {
249 //ADD SITE METADATA
250 Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
251 //create a hashmap of params
252 HashMap subset_params = new HashMap(1);
253 subset_params.put(GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
254 //create the element to put the params in
255 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
256 //put them in
257 GSXML.addParametersToList(this.doc, param_list, subset_params);
258 metadata_request.appendChild(param_list);
259 //create the message
260 Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
261 metadata_message.appendChild(metadata_request);
262 //get response
263 Element metadata_response_message = (Element) this.mr.process(metadata_message);
264 //drill down to response
265 Element metadata_response = (Element) GSXML.getChildByTagName(metadata_response_message, GSXML.RESPONSE_ELEM);
266 //merge in metadata
267 GSXML.mergeMetadataLists(element, metadata_response);
268 }
269
270 protected void addInterfaceOptions(Element elem)
271 {
272 Element documentOptionList = this.doc.createElement("interfaceOptions");
273 for (Object key : this.config_params.keySet())
274 {
275 Element option = this.doc.createElement("option");
276 option.setAttribute(GSXML.NAME_ATT, (String) key);
277 option.setAttribute(GSXML.VALUE_ATT, this.config_params.get(key).toString());
278 documentOptionList.appendChild(option);
279 }
280 elem.appendChild(elem.getOwnerDocument().importNode(documentOptionList, true));
281 }
282}
Note: See TracBrowser for help on using the repository browser.