Pavel,

I committed this code for now.

I believe the only outstanding patch submission from you is
SOAPMappingRegistry.  I know it's hard to believe, but I will get to it
eventually!

Thanks for all the work on the MIME stuff.  It is a great performance
boost.

Scott Nichol

----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, November 20, 2002 4:54 PM
Subject: cvs commit: xml-soap/java/src/org/apache/soap/util/xml
XMLParserUtils.java


> snichol     2002/11/20 13:54:25
>
>   Modified:    java/src/org/apache/soap/rpc Call.java
>                java/src/org/apache/soap/server/http
RPCRouterServlet.java
>                java/src/org/apache/soap/util/xml XMLParserUtils.java
>   Log:
>   Submitted by: Pavel Ausianik <[EMAIL PROTECTED]>
>
>   Please see what I propose to solve problem with many allocated
>   DocumentBuilders.
>   Other classes were DocumentBuilder is used can be easily adopted in
the same
>   way as Call is.
>
>   See thread at
http://marc.theaimsgroup.com/?l=soap-dev&m=103582304223623&w=2
>   for discussion of document builder pooling.
>
>   Revision  Changes    Path
>   1.24      +10 -4     xml-soap/java/src/org/apache/soap/rpc/Call.java
>
>   Index: Call.java
>   ===================================================================
>   RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/rpc/Call.java,v
>   retrieving revision 1.23
>   retrieving revision 1.24
>   diff -u -r1.23 -r1.24
>   --- Call.java 20 Nov 2002 21:34:42 -0000 1.23
>   +++ Call.java 20 Nov 2002 21:54:25 -0000 1.24
>   @@ -90,7 +90,6 @@
>     */
>    public class Call extends RPCMessage
>    {
>   -  private DocumentBuilder     xdb;
>      private SOAPMappingRegistry smr = null;
>      private SOAPTransport       st  = null;;
>      private int                 to  = 0;
>   @@ -452,8 +451,15 @@
>        }
>
>        // if the DOM parser hasn't been created yet, do it now
>   -    if (xdb == null)
>   -      xdb = XMLParserUtils.getXMLDocBuilder();
>   -    return xdb.parse(input);
>   +    DocumentBuilder  xdb =
XMLParserUtils.getXMLDocBuilderFromPool();
>   +    Document doc = null;
>   +    // if the DOM parser hasn't been created yet, do it now
>   +    try {
>   +        doc = xdb.parse(input);
>   +    }
>   +    finally {
>   +        XMLParserUtils.returnDocumentBuilderToPool(xdb);
>   +    }
>   +    return doc;
>      }
>    }
>
>
>
>   1.44      +14 -10
xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet.java
>
>   Index: RPCRouterServlet.java
>   ===================================================================
>   RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet
.java,v
>   retrieving revision 1.43
>   retrieving revision 1.44
>   diff -u -r1.43 -r1.44
>   --- RPCRouterServlet.java 20 Nov 2002 21:34:42 -0000 1.43
>   +++ RPCRouterServlet.java 20 Nov 2002 21:54:25 -0000 1.44
>   @@ -307,17 +307,21 @@
>              // EnvelopeEditor
>              // Note: XMLParser that is specified by init-param isused
in
>              // this process.
>   -          DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
>   +          DocumentBuilder xdb =
XMLParserUtils.getXMLDocBuilderFromPool();
>
>   -          callEnv =
>   -            ServerHTTPUtils.readEnvelopeFromRequest(xdb,
>   -
req.getContentType(),
>   -
req.getContentLength(),
>   -
req.getInputStream(),
>   -                                                    editor,
>   -                                                    res,
>   -                                                    reqCtx,
>   -
ServerHTTPUtils.getHeaders(req));
>   +          try {
>   +            callEnv =
>   +              ServerHTTPUtils.readEnvelopeFromRequest(xdb,
>   +
req.getContentType(),
>   +
req.getContentLength(),
>   +
req.getInputStream(),
>   +                                                      editor,
>   +                                                      res,
>   +                                                      reqCtx,
>   +
ServerHTTPUtils.getHeaders(req));
>   +          } finally {
>   +            XMLParserUtils.returnDocumentBuilderToPool(xdb);
>   +          }
>              if (callEnv == null)
>                return;
>              call = RPCRouter.extractCallFromEnvelope(serviceManager,
callEnv,
>
>
>
>   1.8       +38 -12
xml-soap/java/src/org/apache/soap/util/xml/XMLParserUtils.java
>
>   Index: XMLParserUtils.java
>   ===================================================================
>   RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XMLParserUtils.java
,v
>   retrieving revision 1.7
>   retrieving revision 1.8
>   diff -u -r1.7 -r1.8
>   --- XMLParserUtils.java 30 Oct 2002 02:43:04 -0000 1.7
>   +++ XMLParserUtils.java 20 Nov 2002 21:54:25 -0000 1.8
>   @@ -57,7 +57,8 @@
>
>    package org.apache.soap.util.xml;
>
>   -import java.util.HashMap;
>   +import java.util.List;
>   +import java.util.ArrayList;
>    import javax.xml.parsers.*;
>    import org.xml.sax.*;
>    import org.xml.sax.helpers.*;
>   @@ -73,7 +74,7 @@
>     */
>    public class XMLParserUtils {
>      private static DocumentBuilderFactory dbf = null;
>   -  private static HashMap docBuilderTable = new HashMap ();
>   +  private static List allocatedBuildersList = new ArrayList(10);
>
>      static {
>        // Create a default instance.
>   @@ -167,20 +168,45 @@
>       */
>      synchronized public static DocumentBuilder getXMLDocBuilder()
>        throws IllegalArgumentException {
>   -    // if a document builder has already been created for this
thread
>   -    // then just reuse that. otherwise create a new one and
remember it.
>   -    Thread t = Thread.currentThread ();
>   -    DocumentBuilder db = (DocumentBuilder) docBuilderTable.get (t);
>   -    if (db != null) {
>   -      return db;
>   -    } else {
>          try {
>   -        db = dbf.newDocumentBuilder();
>   -        docBuilderTable.put (t, db);
>   -        return db;
>   +        return dbf.newDocumentBuilder();
>          } catch (ParserConfigurationException pce) {
>            throw new IllegalArgumentException(pce.toString());
>          }
>        }
>   +
>   +
>   +  /**
>   +   * Use this method to get a JAXP document builder.
>   +   * This method either returns a previosly allocated
DocumentBuilder
>   +   * or creates a namespace aware, nonvalidating
>   +   * instance of the XML parser.
>   +   *
>   +   * @return DocumentBuilder an instance of a document builder,
>   +   * or null if a ParserConfigurationException was thrown.
>   +   */
>   +  synchronized public static DocumentBuilder
getXMLDocBuilderFromPool() {
>   +      // First check if we have DocBuider available
>   +      DocumentBuilder  builder = null;
>   +      int size = allocatedBuildersList.size();
>   +      if ( size > 0) {
>   +          builder =
(DocumentBuilder)allocatedBuildersList.get(size-1);
>   +          allocatedBuildersList.remove(size-1);
>   +      } else
>   +          // Not available - create a new DocumentBuilder
>   +          builder = XMLParserUtils.getXMLDocBuilder();
>   +
>   +      return builder;
>   +  }
>   +
>   +  /**
>   +   * Return a JAXP document builder, previosly allocated by method
>   +   * getXMLDocBuilderFromPool() for further reuse
>   +   *
>   +   * @param builder a DocumentBuilder to release
>   +   */
>   +  synchronized public static void
returnDocumentBuilderToPool(DocumentBuilder builder) {
>   +      if (builder != null)
>   +          allocatedBuildersList.add(builder);
>      }
>    }
>
>
>
>
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to