Ignore:
Timestamp:
2013-10-10T17:21:30+13:00 (11 years ago)
Author:
davidb
Message:

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:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/BrowseAction.java

    r26026 r28382  
    1212import org.greenstone.gsdl3.util.OID;
    1313import org.greenstone.gsdl3.util.UserContext;
     14import org.w3c.dom.Document;
    1415import org.w3c.dom.Element;
    1516import org.w3c.dom.Node;
     
    2930    public Node process(Node message_node)
    3031    {
    31 
    3232        Element message = this.converter.nodeToElement(message_node);
    33 
     33        Document doc = message.getOwnerDocument();
     34       
    3435        // get the request - assume only one
    3536        Element request = (Element) GSXML.getChildByTagName(message, GSXML.REQUEST_ELEM);
    3637
    3738        // the result
    38         Element result = this.doc.createElement(GSXML.MESSAGE_ELEM);
     39        Element result = doc.createElement(GSXML.MESSAGE_ELEM);
    3940        Element response = classifierBrowse(request);
    4041        result.appendChild(response);
     
    4445    protected Element classifierBrowse(Element request)
    4546    {
    46 
    47         Element page_response = this.doc.createElement(GSXML.RESPONSE_ELEM);
     47        Document doc = request.getOwnerDocument();
     48       
     49        Element page_response = doc.createElement(GSXML.RESPONSE_ELEM);
    4850
    4951        // extract the params from the cgi-request, and check that we have a coll specified
     
    7577        // this should be cached somehow later on.
    7678
    77         Element info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
    78         Element info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, userContext);
     79        Element info_message = doc.createElement(GSXML.MESSAGE_ELEM);
     80        Element info_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, to, userContext);
    7981        info_message.appendChild(info_request);
    8082
    8183        // also get the format stuff now if there is some
    82         Element format_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_FORMAT, to, userContext);
     84        Element format_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_FORMAT, to, userContext);
    8385        info_message.appendChild(format_request);
    8486        // process the requests
     
    9294
    9395        Element service_description = (Element) GSXML.getChildByTagName(service_response, GSXML.SERVICE_ELEM);
    94         page_response.appendChild(this.doc.importNode(service_description, true));
     96        page_response.appendChild(doc.importNode(service_description, true));
    9597
    9698        //append site metadata
     
    137139                    GSXSLT.mergeFormatElements(this_format, global_format_elem, false);
    138140                }
    139                 Element new_format = GSXML.duplicateWithNewName(this.doc, this_format, GSXML.FORMAT_ELEM, false);
     141                Element new_format = GSXML.duplicateWithNewName(doc, this_format, GSXML.FORMAT_ELEM, false);
    140142                // set teh format type
    141143                new_format.setAttribute(GSXML.TYPE_ATT, "browse");
     
    158160        logger.info("extracted meta names, " + metadata_names.toString());
    159161        // get the browse structure for the selected node
    160         Element classify_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
    161         Element classify_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, userContext);
     162        Element classify_message = doc.createElement(GSXML.MESSAGE_ELEM);
     163        Element classify_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_PROCESS, to, userContext);
    162164        classify_message.appendChild(classify_request);
    163165
    164166        //Create a parameter list to specify the required structure information
    165167        // for now, always get ancestors and children
    166         Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
     168        Element param_list = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
    167169        classify_request.appendChild(param_list);
    168         Element param = this.doc.createElement(GSXML.PARAM_ELEM);
     170        Element param = doc.createElement(GSXML.PARAM_ELEM);
    169171        param_list.appendChild(param);
    170172        param.setAttribute(GSXML.NAME_ATT, "structure");
    171173        param.setAttribute(GSXML.VALUE_ATT, "ancestors");
    172         param = this.doc.createElement(GSXML.PARAM_ELEM);
     174        param = doc.createElement(GSXML.PARAM_ELEM);
    173175        param_list.appendChild(param);
    174176        param.setAttribute(GSXML.NAME_ATT, "structure");
     
    176178        if (get_siblings)
    177179        {
    178             param = this.doc.createElement(GSXML.PARAM_ELEM);
     180            param = doc.createElement(GSXML.PARAM_ELEM);
    179181            param_list.appendChild(param);
    180182            param.setAttribute(GSXML.NAME_ATT, "structure");
     
    183185
    184186        // put the classifier node into a classifier node list
    185         Element classifier_list = this.doc.createElement(GSXML.CLASS_NODE_ELEM + GSXML.LIST_MODIFIER);
    186         Element classifier = this.doc.createElement(GSXML.CLASS_NODE_ELEM);
     187        Element classifier_list = doc.createElement(GSXML.CLASS_NODE_ELEM + GSXML.LIST_MODIFIER);
     188        Element classifier = doc.createElement(GSXML.CLASS_NODE_ELEM);
    187189        classifier.setAttribute(GSXML.NODE_ID_ATT, classifier_node);
    188190        classifier_list.appendChild(classifier);
     
    205207
    206208        // add the classifier node as the page classifier
    207         Element page_classifier = GSXML.duplicateWithNewName(this.doc, cl_structure, GSXML.CLASSIFIER_ELEM, true);
     209        Element page_classifier = GSXML.duplicateWithNewName(doc, cl_structure, GSXML.CLASSIFIER_ELEM, true);
    208210        page_response.appendChild(page_classifier);
    209211        page_classifier.setAttribute(GSXML.NAME_ATT, top_id);
     
    212214        // then for each document node
    213215
    214         Element metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
     216        Element metadata_message = doc.createElement(GSXML.MESSAGE_ELEM);
    215217
    216218        boolean did_classifier = false;
     
    225227        {
    226228            did_classifier = true;
    227             Element cl_meta_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to + "MetadataRetrieve", userContext);
     229            Element cl_meta_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_PROCESS, to + "MetadataRetrieve", userContext);
    228230            metadata_message.appendChild(cl_meta_request);
    229231
    230             Element new_cl_nodes_list = this.doc.createElement(GSXML.CLASS_NODE_ELEM + GSXML.LIST_MODIFIER);
     232            Element new_cl_nodes_list = doc.createElement(GSXML.CLASS_NODE_ELEM + GSXML.LIST_MODIFIER);
    231233            cl_meta_request.appendChild(new_cl_nodes_list);
    232234
     
    234236            {
    235237
    236                 Element cl = this.doc.createElement(GSXML.CLASS_NODE_ELEM);
     238                Element cl = doc.createElement(GSXML.CLASS_NODE_ELEM);
    237239                cl.setAttribute(GSXML.NODE_ID_ATT, ((Element) cl_nodes.item(c)).getAttribute(GSXML.NODE_ID_ATT));
    238240                new_cl_nodes_list.appendChild(cl);
     
    245247            if (metadata_names.isEmpty())
    246248            {
    247                 cl_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
    248                 Element p = this.doc.createElement(GSXML.PARAM_ELEM);
     249                cl_param_list = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
     250                Element p = doc.createElement(GSXML.PARAM_ELEM);
    249251                cl_param_list.appendChild(p);
    250252                p.setAttribute(GSXML.NAME_ATT, "metadata");
     
    253255            else
    254256            {
    255                 cl_param_list = createMetadataParamList(metadata_names);
     257                cl_param_list = createMetadataParamList(doc,metadata_names);
    256258            }
    257259
     
    267269        {
    268270            did_documents = true;
    269             Element doc_meta_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, GSPath.appendLink(collection, "DocumentMetadataRetrieve"), userContext);
     271            Element doc_meta_request = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_PROCESS, GSPath.appendLink(collection, "DocumentMetadataRetrieve"), userContext);
    270272            metadata_message.appendChild(doc_meta_request);
    271273
    272             Element doc_list = this.doc.createElement(GSXML.DOC_NODE_ELEM + GSXML.LIST_MODIFIER);
     274            Element doc_list = doc.createElement(GSXML.DOC_NODE_ELEM + GSXML.LIST_MODIFIER);
    273275            doc_meta_request.appendChild(doc_list);
    274276
     
    276278            {
    277279
    278                 Element d = this.doc.createElement(GSXML.DOC_NODE_ELEM);
     280                Element d = doc.createElement(GSXML.DOC_NODE_ELEM);
    279281                d.setAttribute(GSXML.NODE_ID_ATT, ((Element) doc_nodes.item(c)).getAttribute(GSXML.NODE_ID_ATT));
    280282                doc_list.appendChild(d);
     
    282284
    283285            // create and add in the param list - add all for now
    284             Element doc_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
    285             Element p = this.doc.createElement(GSXML.PARAM_ELEM);
     286            Element doc_param_list = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
     287            Element p = doc.createElement(GSXML.PARAM_ELEM);
    286288            doc_param_list.appendChild(p);
    287289            p.setAttribute(GSXML.NAME_ATT, "metadata");
Note: See TracChangeset for help on using the changeset viewer.