snichol 2002/11/21 08:36:58
Modified: java/src/org/apache/soap Utils.java
java/src/org/apache/soap/messaging Message.java
java/src/org/apache/soap/rpc Call.java
java/src/org/apache/soap/server DeploymentDescriptor.java
ServiceManager.java ServiceManagerClient.java
XMLConfigManager.java
java/src/org/apache/soap/server/http
MessageRouterServlet.java RPCRouterServlet.java
java/src/org/apache/soap/transport FilterTransport.java
java/src/org/apache/soap/util/xml XMLParserUtils.java
Log:
1. Disable lazy expansion of DOM nodes for Xerces.
2. Push XML parsing into XMLParserUtils, so that clients (a) need not be
aware of pooling, (b) don't carry around their own DocumentBuilder
instances (which affects which pooling algorithms can be used), and (c)
can benefit from any parsing improvements, such as the use of transforms
or parser-specific options. The servlets still get and return instances
from the pools, but that may be removed with time, as well.
3. Use more restrictive import statements for the util.xml package as part
of the general move toward explicit specification of which classes are
imported.
4. Add comments in the servlets regarding how "optimistic" it is to think
that the parser specified in the servlet config will be the one actually
used, since this can be set from any piece of code. It is currently set
up as "last servlet to load wins" if only servlet loading sets this.
Revision Changes Path
1.12 +11 -7 xml-soap/java/src/org/apache/soap/Utils.java
Index: Utils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Utils.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Utils.java 6 Sep 2002 17:50:26 -0000 1.11
+++ Utils.java 21 Nov 2002 16:36:56 -0000 1.12
@@ -57,11 +57,16 @@
package org.apache.soap;
-import java.io.*;
-import java.util.*;
-import javax.xml.parsers.*;
-import org.w3c.dom.*;
-import org.apache.soap.util.xml.*;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Vector;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+import org.apache.soap.util.xml.DOM2Writer;
+import org.apache.soap.util.xml.XMLParserUtils;
/**
* <em>SOAP</em> utilities.
@@ -117,8 +122,7 @@
public static Vector buildFaultDetailsFromThrowable (Throwable t)
{
Vector details = new Vector();
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
- Document doc = xdb.newDocument();
+ Document doc = XMLParserUtils.newDocument();
Element elem = doc.createElement("stackTrace");
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
1.13 +4 -5 xml-soap/java/src/org/apache/soap/messaging/Message.java
Index: Message.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/messaging/Message.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Message.java 19 Nov 2002 02:47:38 -0000 1.12
+++ Message.java 21 Nov 2002 16:36:56 -0000 1.13
@@ -64,9 +64,9 @@
import org.w3c.dom.*;
import org.xml.sax.*;
import org.apache.soap.util.*;
-import org.apache.soap.util.xml.*;
-import org.apache.soap.rpc.SOAPContext;
+import org.apache.soap.util.xml.XMLParserUtils;
import org.apache.soap.rpc.Call;
+import org.apache.soap.rpc.SOAPContext;
import org.apache.soap.*;
import org.apache.soap.transport.*;
import org.apache.soap.transport.http.*;
@@ -85,11 +85,11 @@
*
* @author Sanjiva Weerawarana ([EMAIL PROTECTED])
* @author Pavel Ausianik <[EMAIL PROTECTED]>
+ * @author Scott Nichol ([EMAIL PROTECTED])
*/
public class Message {
SOAPTransport st;
SOAPContext reqCtx = new SOAPContext (), resCtx = null;
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
public Message () {
}
@@ -164,8 +164,7 @@
return null;
String payloadStr = Call.getEnvelopeString (st);
- Document doc =
- xdb.parse(new InputSource(new StringReader(payloadStr)));
+ Document doc = XMLParserUtils.parse(payloadStr);
if (doc == null) {
throw new SOAPException (Constants.FAULT_CODE_CLIENT,
1.26 +3 -64 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.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- Call.java 20 Nov 2002 22:27:10 -0000 1.25
+++ Call.java 21 Nov 2002 16:36:57 -0000 1.26
@@ -175,7 +175,7 @@
}
/**
- * Set timeout in our MessageContext.
+ * Set timeout in our SOAPTransport.
*
* @param value the maximum amount of time, in milliseconds
*/
@@ -184,7 +184,7 @@
}
/**
- * Get timeout from our MessageContext.
+ * Get timeout from our SOAPTransport.
*
* @return value the maximum amount of time, in milliseconds
*/
@@ -334,7 +334,7 @@
String payloadStr = getEnvelopeString(st);
// Parse the incoming response stream.
- Document respDoc = parsePayload(payloadStr);
+ Document respDoc = XMLParserUtils.parse(payloadStr, useDocumentBuilder);
Element payload = null;
if (respDoc != null)
@@ -382,66 +382,5 @@
throw new SOAPException(Constants.FAULT_CODE_PROTOCOL,
e.getMessage(), e);
}
- }
-
- /**
- * Parses the payload into a DOM. Depending on what JAXP facilities are
- * available at run-time, this will either use the DOM parser or the SAX
- * parser plus a transformation.
- */
- private Document parsePayload(String payload) throws IOException, SAXException {
- InputSource input = new InputSource(new StringReader(payload));
- if (!useDocumentBuilder) {
- try {
- // If classes required for transformation are all present, use that method
- Class domResultClass = Class.forName("javax.xml.transform.dom.DOMResult");
- Class transformerFactoryClass =
Class.forName("javax.xml.transform.TransformerFactory");
- Class transformerClass = Class.forName("javax.xml.transform.Transformer");
- Class saxSourceClass = Class.forName("javax.xml.transform.sax.SAXSource");
- Class sourceClass = Class.forName("javax.xml.transform.Source");
- Class resultClass = Class.forName("javax.xml.transform.Result");
-
- Object output = domResultClass.newInstance();
- Object source = saxSourceClass.newInstance();
-
- // Create factory and use to create transformer
- Method method = transformerFactoryClass.getDeclaredMethod("newInstance",
new Class[]{});
- Object xformFactory = method.invoke(null, new Object[]{});
- method = transformerFactoryClass.getDeclaredMethod("newTransformer", new
Class[]{});
- Object idTransform = method.invoke(xformFactory, new Object[]{});
-
- // Set input source for SAX source
- method = saxSourceClass.getDeclaredMethod("setInputSource", new
Class[]{InputSource.class});
- method.invoke(source, new Object[]{input});
-
- // Transform from SAX source to DOM result
- method = transformerClass.getDeclaredMethod("transform", new
Class[]{sourceClass, resultClass});
- method.invoke(idTransform, new Object[]{source, output});
-
- // Grab document node from DOM result
- method = domResultClass.getDeclaredMethod("getNode", new Class[]{});
-
- // If all has worked, we return here; for exceptions,
- // we fall through to the DOM parser.
- return (Document) method.invoke(output, new Object[]{});
- } catch (ClassNotFoundException e) {
- } catch (NoSuchMethodException e) {
- } catch (InvocationTargetException e) {
- } catch (InstantiationException e) {
- } catch (IllegalAccessException e) {
- }
- }
-
- // if the DOM parser hasn't been created yet, do it now
- 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.36 +6 -4
xml-soap/java/src/org/apache/soap/server/DeploymentDescriptor.java
Index: DeploymentDescriptor.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/server/DeploymentDescriptor.java,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- DeploymentDescriptor.java 30 Aug 2002 03:22:54 -0000 1.35
+++ DeploymentDescriptor.java 21 Nov 2002 16:36:57 -0000 1.36
@@ -59,14 +59,17 @@
import java.io.*;
import java.util.*;
-import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.apache.soap.Constants;
import org.apache.soap.encoding.*;
import org.apache.soap.rpc.*;
import org.apache.soap.server.http.*;
-import org.apache.soap.util.xml.*;
+import org.apache.soap.util.xml.Deserializer;
+import org.apache.soap.util.xml.DOMUtils;
+import org.apache.soap.util.xml.QName;
+import org.apache.soap.util.xml.Serializer;
+import org.apache.soap.util.xml.XMLParserUtils;
/**
* This class represents the deployment information about a SOAP service.
@@ -445,8 +448,7 @@
}
try {
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
- Document doc = xdb.parse(new InputSource(rd));
+ Document doc = XMLParserUtils.parse(rd);
if (doc != null) {
Element root = doc.getDocumentElement();
1.19 +3 -4 xml-soap/java/src/org/apache/soap/server/ServiceManager.java
Index: ServiceManager.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/ServiceManager.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- ServiceManager.java 10 Sep 2002 07:02:02 -0000 1.18
+++ ServiceManager.java 21 Nov 2002 16:36:57 -0000 1.19
@@ -60,11 +60,11 @@
import java.util.*;
import java.io.*;
import javax.servlet.*;
-import javax.xml.parsers.*;
import org.apache.soap.*;
import org.apache.soap.server.http.*;
import org.apache.soap.util.* ;
-import org.apache.soap.util.xml.*;
+import org.apache.soap.util.xml.QName;
+import org.apache.soap.util.xml.XMLParserUtils;
import org.apache.soap.rpc.SOAPContext ;
import org.w3c.dom.*;
import org.xml.sax.*;
@@ -80,7 +80,6 @@
protected DeploymentDescriptor smsdd; // Svc Mgmnt Svc's Dep Descriptor
protected ConfigManager configMgr = null;
protected ServletContext context = null;
- protected DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
protected boolean soapInterfaceEnabled = true;
public ServiceManager (ServletContext context, String configFilename) {
@@ -151,7 +150,7 @@
ServerHTTPUtils.getFileFromNameAndContext(configFilename, context);
reader = new FileReader(configFile);
- doc = xdb.parse(new InputSource(reader));
+ doc = XMLParserUtils.parse(reader);
elem = doc.getDocumentElement();
if ( !"soapServer".equals(elem.getTagName()) )
throw new Exception( "Root element must be 'soapServer'" );
1.11 +13 -8
xml-soap/java/src/org/apache/soap/server/ServiceManagerClient.java
Index: ServiceManagerClient.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/server/ServiceManagerClient.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ServiceManagerClient.java 5 Sep 2002 16:50:52 -0000 1.10
+++ ServiceManagerClient.java 21 Nov 2002 16:36:57 -0000 1.11
@@ -57,17 +57,23 @@
package org.apache.soap.server;
-import java.net.URL;
import java.io.*;
+import java.net.URL;
import java.util.*;
-import javax.xml.parsers.*;
-import org.w3c.dom.*;
import org.xml.sax.*;
-import org.apache.soap.util.xml.*;
-import org.apache.soap.*;
+import org.w3c.dom.*;
+import org.apache.soap.Constants;
+import org.apache.soap.Fault;
+import org.apache.soap.SOAPException;
import org.apache.soap.encoding.SOAPMappingRegistry;
+import org.apache.soap.rpc.Call;
+import org.apache.soap.rpc.Parameter;
+import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
-import org.apache.soap.rpc.*;
+import org.apache.soap.util.xml.Deserializer;
+import org.apache.soap.util.xml.QName;
+import org.apache.soap.util.xml.Serializer;
+import org.apache.soap.util.xml.XMLParserUtils;
/**
* This is a client to talk to an Apache SOAP ServiceManager to manage services
@@ -224,8 +230,7 @@
badUsage ();
}
FileReader fr = new FileReader (args[base+2]);
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
- Document doc = xdb.parse(new InputSource(fr));
+ Document doc = XMLParserUtils.parse(fr);
smc.deploy (DeploymentDescriptor.fromXML (doc.getDocumentElement ()));
} else if (op.equals ("undeploy")) {
if (args.length != base+3) {
1.4 +2 -4 xml-soap/java/src/org/apache/soap/server/XMLConfigManager.java
Index: XMLConfigManager.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/XMLConfigManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XMLConfigManager.java 17 May 2001 18:25:54 -0000 1.3
+++ XMLConfigManager.java 21 Nov 2002 16:36:57 -0000 1.4
@@ -66,7 +66,6 @@
import javax.servlet.http.* ;
// XML Classes
-import javax.xml.parsers.* ;
import org.w3c.dom.* ;
import org.xml.sax.* ;
@@ -76,7 +75,7 @@
import org.apache.soap.server.* ;
import org.apache.soap.server.http.* ;
import org.apache.soap.util.* ;
-import org.apache.soap.util.xml.* ;
+import org.apache.soap.util.xml.XMLParserUtils;
/**
* An <code>XMLConfigManager</code> ...
@@ -97,7 +96,6 @@
*/
public class XMLConfigManager extends BaseConfigManager
implements ConfigManager {
- protected DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
/** The name of the deployment file. */
protected String filename = "DeployedServices.xml";
@@ -129,7 +127,7 @@
Element root = null;
try {
- doc = xdb.parse(new InputSource(rd));
+ doc = XMLParserUtils.parse(rd);
root = doc.getDocumentElement();
} catch (Exception e) {
e.printStackTrace();
1.38 +21 -11
xml-soap/java/src/org/apache/soap/server/http/MessageRouterServlet.java
Index: MessageRouterServlet.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/server/http/MessageRouterServlet.java,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- MessageRouterServlet.java 6 Sep 2002 06:14:10 -0000 1.37
+++ MessageRouterServlet.java 21 Nov 2002 16:36:58 -0000 1.38
@@ -69,7 +69,7 @@
import org.apache.soap.server.*;
import org.apache.soap.encoding.*;
import org.apache.soap.util.*;
-import org.apache.soap.util.xml.*;
+import org.apache.soap.util.xml.XMLParserUtils;
import org.apache.soap.transport.*;
import org.apache.soap.encoding.soapenc.SoapEncUtils;
@@ -198,6 +198,10 @@
tempStr = servletConfig.getInitParameter(Constants.XML_PARSER);
// Is there a user-specified JAXP implementation?
+ // Note: this is extremely lame, since XMLParserUtils could be
+ // "refreshed" with another implementation at any time. The
+ // value in the configuration must be viewed as just a hopeful
+ // suggestion.
if (tempStr != null) {
XMLParserUtils.refreshDocumentBuilderFactory(tempStr,
true, // namespaceAware
@@ -251,6 +255,7 @@
SOAPContext reqCtx = new SOAPContext() ;
SOAPContext resCtx = new SOAPContext() ;
+ Envelope msgEnv = null;
reqCtx.setClassLoader( ServerHTTPUtils.
getServletClassLoaderFromContext(context) );
@@ -265,16 +270,21 @@
// Generate Envelope after the incoming message is translated by
// EnvelopeEditor
- // Note: XMLParser that is specified by init-param isused in
- // this process.
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
- Envelope msgEnv =
- ServerHTTPUtils.readEnvelopeFromRequest(xdb,
- req.getContentType(),
- req.getContentLength(),
- req.getInputStream(),
- editor, res, reqCtx,
- ServerHTTPUtils.getHeaders(req));
+ // Note: XMLParser that is specified by init-param is used in
+ // this process, unless some other piece of code specifies
+ // a different parser!
+ DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilderFromPool();
+ try {
+ msgEnv =
+ ServerHTTPUtils.readEnvelopeFromRequest(xdb,
+ req.getContentType(),
+ req.getContentLength(),
+ req.getInputStream(),
+ editor, res, reqCtx,
+
ServerHTTPUtils.getHeaders(req));
+ } finally {
+ XMLParserUtils.returnDocumentBuilderToPool(xdb);
+ }
if (msgEnv == null)
return;
1.45 +7 -2
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.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- RPCRouterServlet.java 20 Nov 2002 21:54:25 -0000 1.44
+++ RPCRouterServlet.java 21 Nov 2002 16:36:58 -0000 1.45
@@ -70,7 +70,7 @@
import org.apache.soap.encoding.*;
import org.apache.soap.transport.*;
import org.apache.soap.util.*;
-import org.apache.soap.util.xml.*;
+import org.apache.soap.util.xml.XMLParserUtils;
import org.apache.soap.transport.EnvelopeEditor;
import org.apache.soap.transport.EnvelopeEditorFactory;
import org.apache.soap.encoding.soapenc.SoapEncUtils;
@@ -232,6 +232,10 @@
tempStr = servletContext.getInitParameter(Constants.XML_PARSER);
// Is there a user-specified JAXP implementation?
+ // Note: this is extremely lame, since XMLParserUtils could be
+ // "refreshed" with another implementation at any time. The
+ // value in the configuration must be viewed as just a hopeful
+ // suggestion.
if (tempStr != null) {
XMLParserUtils.refreshDocumentBuilderFactory(tempStr,
true, // namespaceAware
@@ -306,7 +310,8 @@
// Generate Envelope after the incoming message is translated by
// EnvelopeEditor
// Note: XMLParser that is specified by init-param isused in
- // this process.
+ // this process, unless some other piece of code specifies
+ // a different parser!
DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilderFromPool();
try {
1.7 +2 -4 xml-soap/java/src/org/apache/soap/transport/FilterTransport.java
Index: FilterTransport.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/transport/FilterTransport.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FilterTransport.java 17 May 2001 18:26:07 -0000 1.6
+++ FilterTransport.java 21 Nov 2002 16:36:58 -0000 1.7
@@ -63,11 +63,10 @@
import java.io.*;
import java.net.*;
import java.util.*;
-import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.apache.soap.util.net.*;
-import org.apache.soap.util.xml.*;
+import org.apache.soap.util.xml.XMLParserUtils;
import org.apache.soap.*;
import org.apache.soap.rpc.SOAPContext;
import org.apache.soap.encoding.*;
@@ -122,8 +121,7 @@
sin = new StringReader(sout.getBuffer().toString());
}
- DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
- Element docElem = xdb.parse(new InputSource(sin)).getDocumentElement();
+ Element docElem = XMLParserUtils.parse(sin).getDocumentElement();
Envelope env2 = Envelope.unmarshall(docElem);
transport.send(sendTo, action, headers, env2, smr, ctx);
1.9 +140 -2 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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XMLParserUtils.java 20 Nov 2002 21:54:25 -0000 1.8
+++ XMLParserUtils.java 21 Nov 2002 16:36:58 -0000 1.9
@@ -57,9 +57,16 @@
package org.apache.soap.util.xml;
-import java.util.List;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
-import javax.xml.parsers.*;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
@@ -71,6 +78,8 @@
*
* @author Ruth Bergman ([EMAIL PROTECTED])
* @author Matthew J. Duftler ([EMAIL PROTECTED])
+ * @author Scott Nichol ([EMAIL PROTECTED])
+ * @author Pavel Ausianik ([EMAIL PROTECTED])
*/
public class XMLParserUtils {
private static DocumentBuilderFactory dbf = null;
@@ -151,6 +160,13 @@
dbf.setValidating(validating);
dbf.setExpandEntityReferences(expandEntityReferences);
+ try {
+ dbf.setAttribute("http://apache.org/xml/features/dom/defer-node-expansion",
+ Boolean.FALSE);
+ } catch (IllegalArgumentException e) {
+ // parsers that do not support this option with throw this exception
+ }
+
/*
At this point the DocumentBuilderFactory instance can be saved
and reused to create any number of DocumentBuilder instances
@@ -208,5 +224,127 @@
synchronized public static void returnDocumentBuilderToPool(DocumentBuilder
builder) {
if (builder != null)
allocatedBuildersList.add(builder);
+ }
+
+ /**
+ * Gets a new XML DOM.
+ *
+ * @return The new XML DOM.
+ */
+ public static Document newDocument() {
+ DocumentBuilder xdb = getXMLDocBuilderFromPool();
+ Document doc = null;
+ try {
+ doc = xdb.newDocument();
+ } finally {
+ XMLParserUtils.returnDocumentBuilderToPool(xdb);
+ }
+ return doc;
+ }
+
+ /**
+ * Parses XML text from a Reader into an XML DOM.
+ *
+ * @param xmlReader XML reader.
+ * @return The XML in DOM form.
+ * @exception IOException For errors reading the XML.
+ * @exception SAXException For errors parsing the XML.
+ */
+ public static Document parse(Reader xmlReader)
+ throws IOException, SAXException {
+ return parse(new InputSource(xmlReader), true);
+ }
+
+ /**
+ * Parses XML text into an XML DOM.
+ *
+ * @param xmlText XML text.
+ * @return The XML in DOM form.
+ * @exception IOException For errors reading the XML.
+ * @exception SAXException For errors parsing the XML.
+ */
+ public static Document parse(String xmlText)
+ throws IOException, SAXException {
+ return parse(new InputSource(xmlText), true);
+ }
+
+ /**
+ * Parses XML text into an XML DOM.
+ *
+ * @param xmlString XML text.
+ * @param useDocumentBuilder True to use a document builder, false to use
+ * a transform. If the transform classes cannot
+ * be loaded, a document builder will be used.
+ * @return The XML in DOM form.
+ * @exception IOException For errors reading the XML.
+ * @exception SAXException For errors parsing the XML.
+ */
+ public static Document parse(String xmlText, boolean useDocumentBuilder)
+ throws IOException, SAXException {
+ return parse(new InputSource(new StringReader(xmlText)), useDocumentBuilder);
+ }
+
+ /**
+ * Parses an XML source into an XML DOM.
+ *
+ * @param xmlSource The source of the XML.
+ * @param useDocumentBuilder True to use a document builder, false to use
+ * a transform. If the transform classes cannot
+ * be loaded, a document builder will be used.
+ * @return The XML in DOM form.
+ * @exception IOException For errors reading the XML.
+ * @exception SAXException For errors parsing the XML.
+ */
+ public static Document parse(InputSource xmlSource, boolean useDocumentBuilder)
+ throws IOException, SAXException {
+ if (!useDocumentBuilder) {
+ try {
+ // If classes required for transformation are all present, use that method
+ Class domResultClass = Class.forName("javax.xml.transform.dom.DOMResult");
+ Class transformerFactoryClass =
Class.forName("javax.xml.transform.TransformerFactory");
+ Class transformerClass = Class.forName("javax.xml.transform.Transformer");
+ Class saxSourceClass = Class.forName("javax.xml.transform.sax.SAXSource");
+ Class sourceClass = Class.forName("javax.xml.transform.Source");
+ Class resultClass = Class.forName("javax.xml.transform.Result");
+
+ Object output = domResultClass.newInstance();
+ Object source = saxSourceClass.newInstance();
+
+ // Create factory and use to create transformer
+ Method method = transformerFactoryClass.getDeclaredMethod("newInstance",
new Class[]{});
+ Object xformFactory = method.invoke(null, new Object[]{});
+ method = transformerFactoryClass.getDeclaredMethod("newTransformer", new
Class[]{});
+ Object idTransform = method.invoke(xformFactory, new Object[]{});
+
+ // Set input source for SAX source
+ method = saxSourceClass.getDeclaredMethod("setInputSource", new
Class[]{InputSource.class});
+ method.invoke(source, new Object[]{xmlSource});
+
+ // Transform from SAX source to DOM result
+ method = transformerClass.getDeclaredMethod("transform", new
Class[]{sourceClass, resultClass});
+ method.invoke(idTransform, new Object[]{source, output});
+
+ // Grab document node from DOM result
+ method = domResultClass.getDeclaredMethod("getNode", new Class[]{});
+
+ // If all has worked, we return here; for exceptions,
+ // we fall through to the DOM parser.
+ return (Document) method.invoke(output, new Object[]{});
+ } catch (ClassNotFoundException e) {
+ } catch (NoSuchMethodException e) {
+ } catch (InvocationTargetException e) {
+ } catch (InstantiationException e) {
+ } catch (IllegalAccessException e) {
+ }
+ }
+
+ DocumentBuilder xdb = getXMLDocBuilderFromPool();
+ Document doc = null;
+ try {
+ doc = xdb.parse(xmlSource);
+ } finally {
+ returnDocumentBuilderToPool(xdb);
+ }
+ return doc;
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>