source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/FormatAction.java@ 28382

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

Elimination of the 'this.doc' field from the Action baseclass and the subclasses that rely on it. For Greenstone3 purposes it is unsafe to create this object in the constructor to the action and then store it for other methods to access. This is because the Greenstone 3 (and in particular calls to 'process' operate in a multi-threaded context, that is managed by the Servlet server (e.g. Tomcat by default). Calls to DOM methods are not guaranteed to be thread safe, this became apparent when we started looking in to an exception that was being thrown, and centred around use of the DOM method 'item(i)'. The change this commit makes is to remove 'this.doc' being stored as a field. A document is now created in the top level of a call to 'process()' and when a DOM reference is needed in a subsequent method an Element variable (typically passed in as a parameter to the method) is used (through 'Document doc = element.getOwnerDocument()') to gain access to the DOM

File size: 5.7 KB
Line 
1package org.greenstone.gsdl3.action;
2
3import org.greenstone.gsdl3.core.ModuleInterface;
4import org.greenstone.gsdl3.util.*;
5import org.greenstone.util.GlobalProperties;
6
7// XML classes
8import org.w3c.dom.Node;
9import org.w3c.dom.Element;
10import org.w3c.dom.Document;
11
12// other java stuff
13import java.io.File;
14import java.util.*;
15import java.io.StringReader;
16import org.xml.sax.InputSource;
17import javax.xml.parsers.DocumentBuilder;
18import javax.xml.parsers.DocumentBuilderFactory;
19
20import java.io.*;
21import org.xml.sax.*;
22import javax.xml.parsers.SAXParserFactory;
23import javax.xml.parsers.ParserConfigurationException;
24import javax.xml.parsers.SAXParser;
25
26import java.io.PrintWriter;
27import java.io.Serializable;
28import java.io.StringWriter;
29
30import org.apache.log4j.*;
31
32public class FormatAction extends Action {
33
34 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.action.FormatAction.class.getName());
35 XMLTransformer transformer = null;
36
37 String tempVal = "";
38
39 /** process a request */
40 public Node process (Node message_node) {
41
42 Element message = this.converter.nodeToElement(message_node);
43 Document doc = message.getOwnerDocument();
44
45 // assume only one request
46 Element request = (Element)GSXML.getChildByTagName(message, GSXML.REQUEST_ELEM);
47
48 String subaction = request.getAttribute(GSXML.SUBACTION_ATT);
49 UserContext userContext = new UserContext(request);
50 // get the param list
51 Element cgi_param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
52 HashMap<String, Serializable> params = GSXML.extractParams(cgi_param_list, false);
53
54 Element result = doc.createElement(GSXML.MESSAGE_ELEM);
55
56 String coll = (String)params.get(GSParams.COLLECTION); //SYSTEM_CLUSTER);
57 String service = (String)params.get(GSParams.SERVICE);
58 String classifier = (String)params.get("cl");
59
60 String to = "";
61 if (coll!=null && !coll.equals("")) {
62 to = coll;
63 }
64
65 Element mr_request_message = doc.createElement(GSXML.MESSAGE_ELEM);
66 Element mr_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_FORMAT_STRING, to, userContext);
67
68 mr_request.setAttribute("service", service);
69 mr_request.setAttribute("subaction", subaction);
70 //if(classifier != null)
71 mr_request.setAttribute("classifier", classifier);
72
73 mr_request_message.appendChild(mr_request);
74
75 String format_string = (String)params.get("data");
76
77 Element page_response = doc.createElement(GSXML.RESPONSE_ELEM);
78
79 Iterator<String> it = params.keySet().iterator();
80
81 if(subaction.equals("saveDocument"))
82 {
83 Element format = doc.createElement(GSXML.FORMAT_STRING_ELEM);
84 try{
85 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
86 DocumentBuilder builder = factory.newDocumentBuilder();
87 InputSource is = new InputSource( new StringReader( format_string ) );
88 Document d = (Document) builder.parse( is );
89 Node n1 = d.getFirstChild();
90
91 Element format_statement = (Element) doc.importNode(n1, true);
92 format.appendChild(format_statement);
93 mr_request.appendChild(format);
94 } catch( Exception ex ) {
95 logger.error("There was an exception "+ex);
96
97 StringWriter sw = new StringWriter();
98 PrintWriter pw = new PrintWriter(sw, true);
99 ex.printStackTrace(pw);
100 pw.flush();
101 sw.flush();
102 logger.error(sw.toString());
103 }
104
105 }
106
107 else
108 {
109
110 try {
111 Document d = this.converter.getDOM(format_string);
112
113 // Call XSLT to transform document to xml format string
114 XMLTransformer transformer = new XMLTransformer();
115 String style = GSFile.interfaceStylesheetFile(GlobalProperties.getGSDL3Home(),(String)this.config_params.get(GSConstants.INTERFACE_NAME), "formatString.xsl");
116 //logger.error("Style doc is "+style+", compared to /research/sjb48/greenstone3/web/interfaces/oran/transform/formatString.xsl");
117 Document style_doc = this.converter.getDOM(new File(style), "UTF-8");
118 //Document style_doc = this.converter.getDOM(new File("/research/sjb48/greenstone3/web/interfaces/oran/transform/formatString.xsl"), "UTF-8"); /*************************/
119
120 if(style_doc == null)
121 logger.error("style_doc is null");
122
123 logger.error("About to transform");
124 Node transformed = (Node) transformer.transform(style_doc, d);
125
126 if(transformed.getNodeType() == Node.DOCUMENT_NODE)
127 transformed = ((Document)transformed).getDocumentElement();
128
129 Element format = doc.createElement(GSXML.FORMAT_STRING_ELEM);
130 format.appendChild(doc.importNode(transformed,true));
131 mr_request.appendChild(format);
132 logger.error("Transformed: "+transformed);
133
134 } catch( Exception ex ) {
135 logger.error("There was an exception "+ex);
136
137 StringWriter sw = new StringWriter();
138 PrintWriter pw = new PrintWriter(sw, true);
139 ex.printStackTrace(pw);
140 pw.flush();
141 sw.flush();
142 logger.error(sw.toString());
143 }
144 }
145
146 Node response_message = this.mr.process(mr_request_message);
147
148 result.appendChild(GSXML.duplicateWithNewName(doc, (Element)GSXML.getChildByTagName(response_message, GSXML.RESPONSE_ELEM), GSXML.RESPONSE_ELEM, true));
149 return result;
150
151 }
152
153}
Note: See TracBrowser for help on using the repository browser.