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

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

Analyse xsl files in advance to find out what metadata we need

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