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

Last change on this file since 25805 was 25805, checked in by ak19, 12 years ago

Asking for a piece of metadata like dc.Creator returns all values for dc.Creator. So multiple=true is always the case by default. No multiple=false was defined. Moreover, there was no way of getting a single value, which was the default in GS2 and which returned the first value for the requested metadata. Now multiple is no longer used, as all values are (still) returned by default. Instead the pos attribute has been introduced, which can be the terms first or last, or else it can be a number representing which value for that metadata needs to be returned.

  • Property svn:keywords set to Author Date Id Revision
File size: 8.1 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 NodeList image_nodes = format.getElementsByTagName("gsf:image");
178 for(int i = 0; i < image_nodes.getLength(); i++)
179 {
180 if(format.getElementsByTagName("gsf:image").getLength() > 0)
181 {
182 meta_names.add("Thumb");
183 meta_names.add("Screen");
184 meta_names.add("SourceFile");
185 }
186 }
187 }
188
189 protected Element createMetadataParamList(HashSet<String> metadata_names)
190 {
191 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
192
193 Element param = null;
194 Iterator<String> i = metadata_names.iterator();
195 while (i.hasNext())
196 {
197 String name = i.next();
198 param = this.doc.createElement(GSXML.PARAM_ELEM);
199 param_list.appendChild(param);
200 param.setAttribute(GSXML.NAME_ATT, "metadata");
201 param.setAttribute(GSXML.VALUE_ATT, name);
202
203 }
204 return param_list;
205 }
206
207 protected boolean processErrorElements(Element message, Element page)
208 {
209 NodeList error_nodes = message.getElementsByTagName(GSXML.ERROR_ELEM);
210 if (error_nodes.getLength() == 0)
211 {
212 return false;
213 }
214 Document owner = page.getOwnerDocument();
215 for (int i = 0; i < error_nodes.getLength(); i++)
216 {
217 page.appendChild(owner.importNode(error_nodes.item(i), true));
218 }
219 return true;
220 }
221
222 /**
223 * Takes an XML element and adds the metadata of the current site to it.
224 * Useful for adding the current site's metadata to a response before
225 * sending it
226 *
227 * @param element
228 * the element to add site metadata to
229 * @param lang
230 * the current language
231 * @param uid
232 * the current user id
233 */
234 protected void addSiteMetadata(Element element, UserContext userContext)
235 {
236 //ADD SITE METADATA
237 Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
238 //create a hashmap of params
239 HashMap subset_params = new HashMap(1);
240 subset_params.put(GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
241 //create the element to put the params in
242 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
243 //put them in
244 GSXML.addParametersToList(this.doc, param_list, subset_params);
245 metadata_request.appendChild(param_list);
246 //create the message
247 Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
248 metadata_message.appendChild(metadata_request);
249 //get response
250 Element metadata_response_message = (Element) this.mr.process(metadata_message);
251 //drill down to response
252 Element metadata_response = (Element) GSXML.getChildByTagName(metadata_response_message, GSXML.RESPONSE_ELEM);
253 //merge in metadata
254 GSXML.mergeMetadataLists(element, metadata_response);
255 }
256
257 protected void addInterfaceOptions(Element elem)
258 {
259 Element documentOptionList = this.doc.createElement("interfaceOptions");
260 for(Object key : this.config_params.keySet())
261 {
262 Element option = this.doc.createElement("option");
263 option.setAttribute(GSXML.NAME_ATT, (String)key);
264 option.setAttribute(GSXML.VALUE_ATT, this.config_params.get(key).toString());
265 documentOptionList.appendChild(option);
266 }
267 elem.appendChild(elem.getOwnerDocument().importNode(documentOptionList, true));
268 }
269}
Note: See TracBrowser for help on using the repository browser.