source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/DebugService.java@ 26556

Last change on this file since 26556 was 26556, checked in by sjm84, 11 years ago

Differentiating between requested match and name templates

  • Property svn:executable set to *
File size: 9.4 KB
Line 
1package org.greenstone.gsdl3.service;
2
3import java.io.File;
4import java.io.FileWriter;
5import java.io.Serializable;
6import java.util.HashMap;
7
8import javax.xml.transform.Transformer;
9import javax.xml.transform.TransformerFactory;
10import javax.xml.transform.dom.DOMSource;
11import javax.xml.transform.stream.StreamResult;
12
13import org.apache.log4j.Logger;
14import org.greenstone.gsdl3.util.GSXML;
15import org.greenstone.gsdl3.util.XMLConverter;
16import org.w3c.dom.Document;
17import org.w3c.dom.Element;
18import org.w3c.dom.NodeList;
19
20public class DebugService extends ServiceRack
21{
22 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.DebugService.class.getName());
23
24 /**********************************************************
25 * The list of services the utility service rack supports *
26 *********************************************************/
27 protected static final String RETRIEVE_TEMPLATE_FROM_XML_FILE = "RetrieveXMLTemplateFromFile";
28 protected static final String SAVE_TEMPLATE_TO_XML_FILE = "SaveXMLTemplateToFile";
29 /*********************************************************/
30
31 String[] services = { RETRIEVE_TEMPLATE_FROM_XML_FILE, SAVE_TEMPLATE_TO_XML_FILE };
32
33 public boolean configure(Element info, Element extra_info)
34 {
35 if (!super.configure(info, extra_info))
36 {
37 return false;
38 }
39
40 logger.info("Configuring DebugServices...");
41 this.config_info = info;
42
43 for (int i = 0; i < services.length; i++)
44 {
45 Element service = this.doc.createElement(GSXML.SERVICE_ELEM);
46 service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
47 service.setAttribute(GSXML.NAME_ATT, services[i]);
48 this.short_service_info.appendChild(service);
49 }
50
51 return true;
52 }
53
54 protected Element getServiceDescription(String service_id, String lang, String subset)
55 {
56 for (int i = 0; i < services.length; i++)
57 {
58 if (service_id.equals(services[i]))
59 {
60 Element service_elem = this.doc.createElement(GSXML.SERVICE_ELEM);
61 service_elem.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
62 service_elem.setAttribute(GSXML.NAME_ATT, services[i]);
63 return service_elem;
64 }
65 }
66
67 return null;
68 }
69
70 protected Element processRetrieveXMLTemplateFromFile(Element request)
71 {
72 Element result = GSXML.createBasicResponse(this.doc, RETRIEVE_TEMPLATE_FROM_XML_FILE);
73
74 if (request == null)
75 {
76 GSXML.addError(this.doc, result, RETRIEVE_TEMPLATE_FROM_XML_FILE + ": Request is null", GSXML.ERROR_TYPE_SYNTAX);
77 return result;
78 }
79
80 String lang = request.getAttribute(GSXML.LANG_ATT);
81 String uid = request.getAttribute(GSXML.USER_ID_ATT);
82
83 // Get the parameters of the request
84 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
85
86 if (param_list == null)
87 {
88 GSXML.addError(this.doc, result, RETRIEVE_TEMPLATE_FROM_XML_FILE + ": No param list specified", GSXML.ERROR_TYPE_SYNTAX);
89 return result;
90 }
91
92 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
93
94 String filepath = (String) params.get("filePath");
95 String namespace = (String) params.get("namespace");
96 String nodeName = (String) params.get("nodename");
97 String nameToGet = (String) params.get("name");
98 String matchToGet = (String) params.get("match");
99
100 String fullNamespace;
101 if (namespace.toLowerCase().equals("gsf"))
102 {
103 fullNamespace = GSXML.GSF_NAMESPACE;
104 }
105 else if (namespace.toLowerCase().equals("xsl"))
106 {
107 fullNamespace = GSXML.XSL_NAMESPACE;
108 }
109 else
110 {
111 return result;
112 }
113
114 File xslFile = new File(filepath);
115 if (xslFile.exists())
116 {
117 XMLConverter converter = new XMLConverter();
118 Document xslDoc = converter.getDOM(xslFile, "UTF-8");
119
120 NodeList templateElems = xslDoc.getElementsByTagNameNS(fullNamespace, nodeName);
121
122 if (nameToGet != null && nameToGet.length() != 0)
123 {
124 for (int i = 0; i < templateElems.getLength(); i++)
125 {
126 Element template = (Element) templateElems.item(i);
127 if (template.getAttribute("name").equals(nameToGet))
128 {
129 Element requestedTemplate = this.doc.createElement("requestedNameTemplate");
130 requestedTemplate.appendChild(this.doc.importNode(template, true));
131 result.appendChild(requestedTemplate);
132 }
133 }
134 }
135
136 //Maybe should look for highest priority
137 if (matchToGet != null && matchToGet.length() != 0)
138 {
139 for (int i = 0; i < templateElems.getLength(); i++)
140 {
141 Element template = (Element) templateElems.item(i);
142 if (template.getAttribute("match").equals(matchToGet))
143 {
144 Element requestedTemplate = this.doc.createElement("requestedMatchTemplate");
145 requestedTemplate.appendChild(this.doc.importNode(template, true));
146 result.appendChild(requestedTemplate);
147 }
148 }
149 }
150 }
151
152 return result;
153 }
154
155 protected Element processSaveXMLTemplateToFile(Element request)
156 {
157 Element result = GSXML.createBasicResponse(this.doc, SAVE_TEMPLATE_TO_XML_FILE);
158
159 if (request == null)
160 {
161 GSXML.addError(this.doc, result, SAVE_TEMPLATE_TO_XML_FILE + ": Request is null", GSXML.ERROR_TYPE_SYNTAX);
162 return result;
163 }
164
165 String lang = request.getAttribute(GSXML.LANG_ATT);
166 String uid = request.getAttribute(GSXML.USER_ID_ATT);
167
168 // Get the parameters of the request
169 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
170
171 if (param_list == null)
172 {
173 GSXML.addError(this.doc, result, SAVE_TEMPLATE_TO_XML_FILE + ": No param list specified", GSXML.ERROR_TYPE_SYNTAX);
174 return result;
175 }
176
177 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
178
179 String filepath = (String) params.get("filePath");
180 String namespace = (String) params.get("namespace");
181 String nodeName = (String) params.get("nodename");
182 String nameToSave = (String) params.get("name");
183 String matchToSave = (String) params.get("match");
184 String xml = (String) params.get("xml");
185
186 String fullNamespace;
187 if (namespace.toLowerCase().equals("gsf"))
188 {
189 fullNamespace = GSXML.GSF_NAMESPACE;
190 }
191 else if (namespace.toLowerCase().equals("xsl"))
192 {
193 fullNamespace = GSXML.XSL_NAMESPACE;
194 }
195 else
196 {
197 GSXML.addError(this.doc, result, SAVE_TEMPLATE_TO_XML_FILE + ": The specified namespace was not valid", GSXML.ERROR_TYPE_SYNTAX);
198 return result;
199 }
200
201 File xslFile = new File(filepath);
202 if (xslFile.exists())
203 {
204 XMLConverter converter = new XMLConverter();
205 Document xslDoc = converter.getDOM(xslFile, "UTF-8");
206
207 NodeList templateElems = xslDoc.getElementsByTagNameNS(fullNamespace, nodeName);
208
209 /*
210 * NodeList textElems =
211 * xslDoc.getElementsByTagNameNS(GSXML.XSL_NAMESPACE, "text"); for
212 * (int i = 0; i < textElems.getLength(); i++) {
213 * System.err.println("\n\n" + i + "\n\n" +
214 * GSXML.xmlNodeToString(textElems.item(i))); }
215 */
216
217 boolean found = false;
218 if (nameToSave != null && nameToSave.length() != 0)
219 {
220 for (int i = 0; i < templateElems.getLength(); i++)
221 {
222 Element template = (Element) templateElems.item(i);
223 if (template.getAttribute("name").equals(nameToSave))
224 {
225 try
226 {
227 System.err.println(xml);
228 Element newTemplate = (Element) converter.getDOM("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"" + GSXML.XSL_NAMESPACE + "\" xmlns:java=\"" + GSXML.JAVA_NAMESPACE + "\" xmlns:util=\"" + GSXML.UTIL_NAMESPACE + "\" xmlns:gsf=\"" + GSXML.GSF_NAMESPACE + "\">" + xml + "</xsl:stylesheet>", "UTF-8").getDocumentElement().getElementsByTagNameNS(fullNamespace, nodeName).item(0);
229 template.getParentNode().replaceChild(xslDoc.importNode(newTemplate, true), template);
230 found = true;
231 }
232 catch (Exception ex)
233 {
234 ex.printStackTrace();
235 }
236 }
237 }
238 }
239 //Maybe should look for highest priority match
240 if (matchToSave != null && matchToSave.length() != 0)
241 {
242 for (int i = 0; i < templateElems.getLength(); i++)
243 {
244 Element template = (Element) templateElems.item(i);
245 if (template.getAttribute("match").equals(matchToSave))
246 {
247
248 Element newTemplate = (Element) converter.getDOM("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"" + GSXML.XSL_NAMESPACE + "\" xmlns:java=\"" + GSXML.JAVA_NAMESPACE + "\" xmlns:util=\"" + GSXML.UTIL_NAMESPACE + "\" xmlns:gsf=\"" + GSXML.GSF_NAMESPACE + "\">" + xml + "</xsl:stylesheet>", "UTF-8").getDocumentElement().getFirstChild();
249 template.getParentNode().replaceChild(xslDoc.importNode(newTemplate, true), template);
250 found = true;
251 }
252 }
253 }
254
255 if (!found)
256 {
257 GSXML.addError(this.doc, result, SAVE_TEMPLATE_TO_XML_FILE + ": Could not save as the specified template could not be found", GSXML.ERROR_TYPE_SYNTAX);
258 }
259 else
260 {
261
262 try
263 {
264 Transformer transformer = TransformerFactory.newInstance().newTransformer();
265
266 //initialize StreamResult with File object to save to file
267 StreamResult sresult = new StreamResult(new FileWriter(xslFile));
268 DOMSource source = new DOMSource(xslDoc);
269 transformer.transform(source, sresult);
270 }
271 catch (Exception ex)
272 {
273 GSXML.addError(this.doc, result, SAVE_TEMPLATE_TO_XML_FILE + ": There was an error writing out the XML file", GSXML.ERROR_TYPE_SYNTAX);
274 }
275
276 }
277 }
278
279 return result;
280 }
281}
Note: See TracBrowser for help on using the repository browser.