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

Last change on this file since 26491 was 26491, checked in by davidb, 11 years ago

Another place where we now also want to check for gsf:foreach-metadata

  • Property svn:keywords set to Author Date Id Revision
File size: 8.4 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 // should change to metadataList?? and use attributes for select rather than
100 // prepending parent_ etc
101 protected void extractMetadataNames(Element format, HashSet<String> meta_names)
102 {
103
104 NodeList metadata_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "metadata"); // gsf:metadata
105 for (int i = 0; i < metadata_nodes.getLength(); i++)
106 {
107 Element elem = (Element) metadata_nodes.item(i);
108 String name = elem.getAttribute("name");
109 String select = elem.getAttribute("select");
110
111 if (!select.equals("")) {
112 name = select+GSConstants.META_RELATION_SEP+name;
113 }
114 meta_names.add(name);
115 }
116
117 NodeList foreach_metadata_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "foreach-metadata"); // gsf:foreach-metadata
118 for (int i = 0; i < foreach_metadata_nodes.getLength(); i++)
119 {
120 Element elem = (Element) foreach_metadata_nodes.item(i);
121 String name = elem.getAttribute("name");
122 String select = elem.getAttribute("select");
123
124 if (!select.equals("")) {
125 name = select+GSConstants.META_RELATION_SEP+name;
126 }
127 meta_names.add(name);
128 }
129 }
130
131 protected void addLinkMetadataNames(Element format, HashSet<String> meta_names)
132 {
133 // The XSL tranform for
134 // gsf:link type="source"
135 // makes use of 'assocfilepath' so need to make sure it's asked for
136
137 boolean getEquivLinkMeta = false;
138
139 NodeList link_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "link");
140 for (int i = 0; i < link_nodes.getLength(); i++)
141 {
142 Element elem = (Element) link_nodes.item(i);
143 String type = elem.getAttribute("type");
144 if (type.equals("source"))
145 {
146 meta_names.add("assocfilepath");
147 meta_names.add("srclinkFile");
148 }
149 else if (type.equals("web"))
150 {
151 meta_names.add("weblink");
152 meta_names.add("webicon");
153 meta_names.add("/weblink");
154 }
155 else if (type.equals("equivdoc"))
156 {
157 getEquivLinkMeta = true;
158 }
159 }
160
161 // get all the metadata necessary for when the user has used "gsf:equivlink"
162 // so that we can build up the equivlink from the metadata components it needs
163 link_nodes = format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "equivlinkgs3");
164 if (getEquivLinkMeta || link_nodes.getLength() > 0)
165 {
166 String[] equivlink_metanames = { "equivDocIcon", "equivDocLink", "/equivDocLink" };
167
168 for (int i = 0; i < equivlink_metanames.length; i++)
169 {
170 StringBuffer metadata = new StringBuffer();
171 metadata.append("all"); // this means the attr multiple = true;
172 metadata.append(GSConstants.META_RELATION_SEP);
173
174 metadata.append(GSConstants.META_SEPARATOR_SEP);
175 metadata.append(','); // attr separator = ","
176 metadata.append(GSConstants.META_SEPARATOR_SEP);
177 metadata.append(GSConstants.META_RELATION_SEP);
178
179 // the name of the metadata we're retrieving
180 metadata.append(equivlink_metanames[i]);
181 meta_names.add(metadata.toString());
182 }
183 }
184
185 if (format.getElementsByTagNameNS(GSXML.GSF_NAMESPACE, "image").getLength() > 0)
186 {
187 meta_names.add("Thumb");
188 meta_names.add("Screen");
189 meta_names.add("SourceFile");
190 }
191 }
192
193 protected Element createMetadataParamList(HashSet<String> metadata_names)
194 {
195 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
196
197 Element param = null;
198 Iterator<String> i = metadata_names.iterator();
199 while (i.hasNext())
200 {
201 String name = i.next();
202 param = this.doc.createElement(GSXML.PARAM_ELEM);
203 param_list.appendChild(param);
204 param.setAttribute(GSXML.NAME_ATT, "metadata");
205 param.setAttribute(GSXML.VALUE_ATT, name);
206
207 }
208 return param_list;
209 }
210
211 protected boolean processErrorElements(Element message, Element page)
212 {
213 NodeList error_nodes = message.getElementsByTagName(GSXML.ERROR_ELEM);
214 if (error_nodes.getLength() == 0)
215 {
216 return false;
217 }
218 Document owner = page.getOwnerDocument();
219 for (int i = 0; i < error_nodes.getLength(); i++)
220 {
221 page.appendChild(owner.importNode(error_nodes.item(i), true));
222 }
223 return true;
224 }
225
226 /**
227 * Takes an XML element and adds the metadata of the current site to it.
228 * Useful for adding the current site's metadata to a response before
229 * sending it
230 *
231 * @param element
232 * the element to add site metadata to
233 * @param lang
234 * the current language
235 * @param uid
236 * the current user id
237 */
238 protected void addSiteMetadata(Element element, UserContext userContext)
239 {
240 //ADD SITE METADATA
241 Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
242 //create a hashmap of params
243 HashMap subset_params = new HashMap(1);
244 subset_params.put(GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
245 //create the element to put the params in
246 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
247 //put them in
248 GSXML.addParametersToList(this.doc, param_list, subset_params);
249 metadata_request.appendChild(param_list);
250 //create the message
251 Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
252 metadata_message.appendChild(metadata_request);
253 //get response
254 Element metadata_response_message = (Element) this.mr.process(metadata_message);
255 //drill down to response
256 Element metadata_response = (Element) GSXML.getChildByTagName(metadata_response_message, GSXML.RESPONSE_ELEM);
257 //merge in metadata
258 GSXML.mergeMetadataLists(element, metadata_response);
259 }
260
261 protected void addInterfaceOptions(Element elem)
262 {
263 Element documentOptionList = this.doc.createElement("interfaceOptions");
264 for (Object key : this.config_params.keySet())
265 {
266 Element option = this.doc.createElement("option");
267 option.setAttribute(GSXML.NAME_ATT, (String) key);
268 option.setAttribute(GSXML.VALUE_ATT, this.config_params.get(key).toString());
269 documentOptionList.appendChild(option);
270 }
271 elem.appendChild(elem.getOwnerDocument().importNode(documentOptionList, true));
272 }
273}
Note: See TracBrowser for help on using the repository browser.