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

Last change on this file since 22134 was 22134, checked in by xiao, 14 years ago

changed addSiteMetadata method signature to protected so that it can be accessed from sub-packages

  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 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 nodes = format.getElementsByTagName("gsf:metadata");
82 for (int i=0; i<nodes.getLength(); i++) {
83 Element elem = (Element)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
109 protected Element createMetadataParamList(HashSet metadata_names) {
110 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
111
112 Element param = null;
113 Iterator i = metadata_names.iterator();
114 while (i.hasNext()) {
115 String name = (String)i.next();
116 param = this.doc.createElement(GSXML.PARAM_ELEM);
117 param_list.appendChild(param);
118 param.setAttribute(GSXML.NAME_ATT, "metadata");
119 param.setAttribute(GSXML.VALUE_ATT, name);
120
121 }
122 return param_list;
123 }
124
125 protected boolean processErrorElements(Element message, Element page) {
126 NodeList error_nodes = message.getElementsByTagName(GSXML.ERROR_ELEM);
127 if (error_nodes.getLength()==0) {
128 return false;
129 }
130 Document owner = page.getOwnerDocument();
131 for (int i=0; i<error_nodes.getLength(); i++) {
132 page.appendChild(owner.importNode(error_nodes.item(i), true));
133 }
134 return true;
135 }
136
137 /**
138 * Takes an XML element and adds the metadata of the current site to it.
139 * Useful for adding the current site's metadata to a response before sending it
140 *
141 * @param element the element to add site metadata to
142 * @param lang the current language
143 * @param uid the current user id
144 */
145 protected void addSiteMetadata( Element element, String lang, String uid ) {
146 //ADD SITE METADATA
147 Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, "", lang, uid);
148 //create a hashmap of params
149 HashMap subset_params = new HashMap(1);
150 subset_params.put(GSXML.SUBSET_PARAM, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
151 //create the element to put the params in
152 Element param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
153 //put them in
154 GSXML.addParametersToList( this.doc, param_list, subset_params );
155 metadata_request.appendChild(param_list);
156 //create the message
157 Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
158 metadata_message.appendChild(metadata_request);
159 //get response
160 Element metadata_response_message = (Element)this.mr.process(metadata_message);
161 //drill down to response
162 Element metadata_response = (Element)GSXML.getChildByTagName(metadata_response_message, GSXML.RESPONSE_ELEM);
163 //merge in metadata
164 GSXML.mergeMetadataLists(element,metadata_response);
165 }
166
167}
168
169
170
171
Note: See TracBrowser for help on using the repository browser.