You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2008/12/16 02:04:16 UTC
svn commit: r726903 - in /webservices/commons/trunk/modules/axiom/modules:
axiom-api/src/main/java/org/apache/axiom/om/impl/builder/
axiom-api/src/main/java/org/apache/axiom/om/util/
axiom-tests/src/test/java/org/apache/axiom/om/ axiom-tests/test-resou...
Author: veithen
Date: Mon Dec 15 17:04:16 2008
New Revision: 726903
URL: http://svn.apache.org/viewvc?rev=726903&view=rev
Log:
WSCOMMONS-394: Improved the network detached XMLStreamReader capability by using a custom XMLResolver that returns empty documents. This avoids the network access entirely and gives more predictable results.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDTDTest.java
webservices/commons/trunk/modules/axiom/modules/axiom-tests/test-resources/xml/web_w_dtd2.xml
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java?rev=726903&r1=726902&r2=726903&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java Mon Dec 15 17:04:16 2008
@@ -33,7 +33,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
@@ -444,42 +443,9 @@
if (!parser.hasText()) {
return null;
}
- String dtdText = getDTDText();
- lastNode = omfactory.createOMDocType(document, dtdText);
+ lastNode = omfactory.createOMDocType(document, parser.getText());
return lastNode;
}
-
- /**
- * The getText() method for a DOCTYPE returns the
- * subset of the DOCTYPE (not the direct infoset).
- * This may force the parser to get information from
- * the network.
- * @return doctype subset
- * @throws OMException
- */
- private String getDTDText() throws OMException {
- String text = null;
- try {
- text = parser.getText();
- } catch (RuntimeException e) {
- // Woodstox (and perhaps other parsers)
- // attempts to load the external subset even if
- // external enties is false. So ignore this error
- // if external entity support is explicitly disabled.
- Boolean b = (Boolean) parser.getProperty(
- XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES);
- if (b == null || b == Boolean.TRUE) {
- throw e;
- }
- if (log.isDebugEnabled()) {
- log.debug("An exception occurred while calling getText() for a DOCTYPE. " +
- "The exception is ignored because external " +
- "entites support is disabled. " +
- "The ignored exception is " + e);
- }
- }
- return text;
- }
/**
* Method createPI.
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java?rev=726903&r1=726902&r2=726903&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java Mon Dec 15 17:04:16 2008
@@ -25,9 +25,12 @@
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLResolver;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
+
+import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
@@ -292,6 +295,16 @@
if (isNetworkDetached) {
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,
Boolean.FALSE);
+ // Some StAX parser such as Woodstox still try to load the external DTD subset,
+ // even if IS_SUPPORTING_EXTERNAL_ENTITIES is set to false. To work around this,
+ // we add a custom XMLResolver that returns empty documents. See WSTX-117 for
+ // an interesting discussion about this.
+ factory.setXMLResolver(new XMLResolver() {
+ public Object resolveEntity(String publicID, String systemID, String baseURI,
+ String namespace) throws XMLStreamException {
+ return new ByteArrayInputStream(new byte[0]);
+ }
+ });
}
return factory;
}
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDTDTest.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDTDTest.java?rev=726903&r1=726902&r2=726903&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDTDTest.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/om/OMDTDTest.java Mon Dec 15 17:04:16 2008
@@ -79,15 +79,11 @@
// can be obtained from StAXUtils and used to process configuration files
// (like a web.xml) that may contain DTD information.
//
- // The following test first reads a normal web.xml that has a proper
- // DTD.
- // The second test has a web.xml where the external link is intentionally
- // changed to use the "urn" protocol. This second test is designed to simulate
- // reading the XML in a "network disconnected environment". Both
- // of these examples should pass without error.
- // Read a web.xml file that contains a DTD.
+ // The following test reads an XML file that has a DTD with a system ID
+ // that intentionally points to a non existing URL. With a network
+ // detached reader this should not produce errors.
- InputStream is = new FileInputStream("test-resources/xml/web_w_dtd.xml");
+ InputStream is = new FileInputStream("test-resources/xml/web_w_dtd2.xml");
XMLStreamReader reader = StAXUtils.createNetworkDetachedXMLStreamReader(is);
StAXOMBuilder builder = new StAXOMBuilder(reader);
OMElement root = builder.getDocumentElement();
@@ -102,24 +98,5 @@
}
}
assertTrue(docType != null);
-
- // Make sure that a web.xml with a dtd can be loaded even if disconnected
- // from the network. In this case, the dtd has an invalid protocol (urn)
- // to simulate a disconnect from the network.
- is = new FileInputStream("test-resources/xml/web_w_dtd2.xml");
- reader = StAXUtils.createNetworkDetachedXMLStreamReader(is);
- builder = new StAXOMBuilder(reader);
- root = builder.getDocumentElement();
- assertTrue(root.getLocalName().equals("web-app"));
- document = builder.getDocument();
- i = document.getChildren();
- docType = null;
- while (docType == null && i.hasNext()) {
- Object obj = i.next();
- if (obj instanceof OMDocType) {
- docType = (OMDocType) obj;
- }
- }
- assertTrue(docType != null);
}
}
Modified: webservices/commons/trunk/modules/axiom/modules/axiom-tests/test-resources/xml/web_w_dtd2.xml
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/test-resources/xml/web_w_dtd2.xml?rev=726903&r1=726902&r2=726903&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-tests/test-resources/xml/web_w_dtd2.xml (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-tests/test-resources/xml/web_w_dtd2.xml Mon Dec 15 17:04:16 2008
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "urn://java.sun.com/dtd/web-app_2_3.dtd">
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://localhost:4321/this/should/not/exist.dtd">
<!-- The location of the DOCTYPE is intentionally invalid to ensure that the document is built even
if disconnected from the network -->
<web-app>