[jboss-svn-commits] JBoss Common SVN: r2364 - in jbossxb/trunk/src: main/java/org/jboss/xb/binding/parser/sax and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 4 19:49:17 EDT 2007


Author: scott.stark at jboss.org
Date: 2007-04-04 19:49:16 -0400 (Wed, 04 Apr 2007)
New Revision: 2364

Modified:
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
   jbossxb/trunk/src/main/java/org/jboss/xb/binding/parser/sax/SaxJBossXBParser.java
   jbossxb/trunk/src/test/java/org/jboss/test/xml/SimpleTestCase.java
   jbossxb/trunk/src/test/resources/xml/book/book-dtd.xml
   jbossxb/trunk/src/test/resources/xml/book/book-xs.xml
   jbossxb/trunk/src/test/resources/xml/book/books2-dtd.xml
Log:
JBXB-101, need to disable both VALIDATION and DYNAMIC_VALIDATION features to ignore invalid docs with a DOCTYPE

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/UnmarshallerImpl.java	2007-04-04 23:49:16 UTC (rev 2364)
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.io.Reader;
 
+import org.jboss.logging.Logger;
 import org.jboss.xb.binding.parser.JBossXBParser;
 import org.jboss.xb.binding.parser.sax.SaxJBossXBParser;
 import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
@@ -58,6 +59,7 @@
    public void setValidation(boolean validation) throws JBossXBException
    {
       parser.setFeature(VALIDATION, validation);
+      parser.setFeature(DYNAMIC_VALIDATION, false);
    }
 
    public void setSchemaValidation(boolean validation) throws JBossXBException

Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/parser/sax/SaxJBossXBParser.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/parser/sax/SaxJBossXBParser.java	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/parser/sax/SaxJBossXBParser.java	2007-04-04 23:49:16 UTC (rev 2364)
@@ -59,6 +59,7 @@
       enableXInclude();
    }
 
+   private final SAXParser parser;
    private final XMLReader reader;
    private JBossXBParser.ContentHandler contentHandler;
    private DelegatingContentHandler delegateHandler;
@@ -86,10 +87,14 @@
    public SaxJBossXBParser()
       throws JBossXBException
    {
-      SAXParser parser;
       try
       {
          parser = saxFactory.newSAXParser();
+         log.debug("Created parser: "+parser
+               + ", isNamespaceAware: "+parser.isNamespaceAware()
+               + ", isValidating: "+parser.isValidating()
+               + ", isXIncludeAware: "+parser.isXIncludeAware()
+               );
       }
       catch(Exception e)
       {
@@ -153,6 +158,7 @@
       try
       {
          reader.setFeature(name, value);
+         log.debug(name+" set to: "+reader.getFeature(name));
       }
       catch(SAXException e)
       {
@@ -166,6 +172,11 @@
       trace = log.isTraceEnabled();
       try
       {
+         log.debug("Using parser: "+parser
+               + ", isNamespaceAware: "+parser.isValidating()
+               + ", isValidating: "+parser.isValidating()
+               + ", isXIncludeAware: "+parser.isXIncludeAware()
+               );
          reader.parse(systemId);
       }
       catch(Exception e)
@@ -180,6 +191,11 @@
       trace = log.isTraceEnabled();
       try
       {
+         log.debug("Using parser: "+parser
+               + ", isNamespaceAware: "+parser.isValidating()
+               + ", isValidating: "+parser.isValidating()
+               + ", isXIncludeAware: "+parser.isXIncludeAware()
+               );
          reader.parse(new InputSource(is));
       }
       catch(Exception e)
@@ -194,6 +210,11 @@
       trace = log.isTraceEnabled();
       try
       {
+         log.debug("Using parser: "+parser
+               + ", isNamespaceAware: "+parser.isValidating()
+               + ", isValidating: "+parser.isValidating()
+               + ", isXIncludeAware: "+parser.isXIncludeAware()
+               );
          this.reader.parse(new InputSource(reader));
       }
       catch(Exception e)

Modified: jbossxb/trunk/src/test/java/org/jboss/test/xml/SimpleTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xml/SimpleTestCase.java	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xml/SimpleTestCase.java	2007-04-04 23:49:16 UTC (rev 2364)
@@ -30,6 +30,10 @@
 import java.net.URL;
 import java.util.Calendar;
 import java.util.Iterator;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
 import org.jboss.logging.Logger;
 import org.jboss.test.xml.book.Book;
 import org.jboss.test.xml.book.BookCharacter;
@@ -52,15 +56,17 @@
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
 
-import junit.framework.TestCase;
-
 /**
  * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
+ * @author Scott.Stark at jboss.org
  * @version <tt>$Revision: 43309 $</tt>
  */
 public class SimpleTestCase
-   extends TestCase
+   extends AbstractJBossXBTest
 {
    private static final Logger log = Logger.getLogger(SimpleTestCase.class);
 
@@ -76,6 +82,54 @@
       unmarshalBook("book-dtd.xml", factory);
    }
 
+   /**
+    * Test that parser validation can be disabled to parse a non-conforming doc
+    * @throws Exception
+    */
+   public void testParserValidationFeature()
+      throws Exception
+   {
+      SAXParserFactory saxFactory = SAXParserFactory.newInstance();
+      saxFactory.setValidating(true);
+      saxFactory.setNamespaceAware(true);
+      saxFactory.setXIncludeAware(true);
+      //
+      SAXParser parser = saxFactory.newSAXParser();
+      log.debug("Created parser: "+parser
+            + ", isNamespaceAware: "+parser.isNamespaceAware()
+            + ", isValidating: "+parser.isValidating()
+            + ", isXIncludeAware: "+parser.isXIncludeAware()
+            );
+      XMLReader reader = parser.getXMLReader();
+      // Both these features need to be false
+      reader.setFeature(Unmarshaller.VALIDATION, false);
+      reader.setFeature(Unmarshaller.DYNAMIC_VALIDATION, false);
+      reader.setEntityResolver(new BooksEntityResolver());
+      assertFalse(parser.isValidating());
+      URL xmlUrl = getResource("/xml/book/books2-dtd.xml");
+      log.debug("parsing: "+xmlUrl);
+      parser.parse(xmlUrl.openStream(), new DefaultHandler()
+         {
+            @Override
+            public void error(SAXParseException e) throws SAXException
+            {
+               throw e;
+            }
+   
+            @Override
+            public void fatalError(SAXParseException e) throws SAXException
+            {
+               throw e;
+            }
+         }
+      );
+   }
+
+   /**
+    * Test that one can disable validation to parse a doc that does not
+    * conform to its dtd
+    * @throws Exception
+    */
    public void testUnmarshalBooks2Dtd() throws Exception
    {
       // create an object model factory
@@ -84,7 +138,7 @@
       log.debug("<test-unmarshal-" + xmlSource + '>');
 
       // get the XML stream
-      URL xmlUrl = getResourceUrl("xml/book/" + xmlSource);
+      URL xmlUrl = getResource("/xml/book/" + xmlSource);
 
       // create unmarshaller
       Unmarshaller unmarshaller = getBookUnmarshaller();
@@ -123,7 +177,8 @@
       StringWriter xmlOutput = new StringWriter();
 
       // get the DTD source
-      InputStream is = getResource("xml/book/books.dtd");
+      URL dtdURL = getResource("/xml/book/books.dtd");
+      InputStream is = dtdURL.openStream();
       Reader dtdReader = new InputStreamReader(is);
 
       // create an instance of DTD marshaller
@@ -178,7 +233,8 @@
       StringWriter xmlOutput = new StringWriter();
 
       // get the DTD source
-      InputStream is = getResource("xml/book/books.dtd");
+      URL dtdURL = getResource("/xml/book/books.dtd");
+      InputStream is = dtdURL.openStream();
       Reader dtdReader = new InputStreamReader(is);
 
       // create an instance of DTD marshaller
@@ -236,7 +292,7 @@
       ObjectModelProvider provider = new BookObjectProvider();
 
       // marshall Book instance passing it as an argument instead of using the one that is returned by the BookObjectProvider
-      marshaller.marshal(getResourceUrl("xml/book/books.xsd").toString(), provider, book, xmlOutput);
+      marshaller.marshal(getResource("/xml/book/books.xsd").toString(), provider, book, xmlOutput);
 
       String xml = xmlOutput.getBuffer().toString();
       if(log.isTraceEnabled())
@@ -251,7 +307,7 @@
       log.debug("<test-unmarshal-" + xmlSource + '>');
 
       // get the XML stream
-      URL xmlUrl = getResourceUrl("xml/book/" + xmlSource);
+      URL xmlUrl = getResource("/xml/book/" + xmlSource);
 
       // create unmarshaller
       Unmarshaller unmarshaller = getBookUnmarshaller();
@@ -310,23 +366,7 @@
    private static Unmarshaller getBookUnmarshaller() throws JBossXBException
    {
       Unmarshaller unmarshaller = UnmarshallerFactory.newInstance().newUnmarshaller();
-      unmarshaller.setEntityResolver(
-            new EntityResolver()
-            {
-               public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException
-               {
-                  if(systemId.endsWith("books.dtd"))
-                  {
-                     return new InputSource(getResource("xml/book/books.dtd"));
-                  }
-                  if(systemId.endsWith("books2.dtd"))
-                  {
-                     return new InputSource(getResource("xml/book/books2.dtd"));
-                  }
-                  return null;
-               }
-            }
-         );
+      unmarshaller.setEntityResolver(new BooksEntityResolver());
       return unmarshaller;
    }
 
@@ -353,23 +393,27 @@
       return book;
    }
 
-   private static InputStream getResource(String name)
+   private static InputStream getResourceStream(String name)
+      throws IOException
    {
-      InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
-      if(is == null)
-      {
-         throw new IllegalStateException("Resource not found: " + name);
-      }
-      return is;
+      URL resURL = findResource(SimpleTestCase.class, name);
+      return resURL.openStream();
    }
-
-   private static URL getResourceUrl(String name)
+   private static class BooksEntityResolver implements EntityResolver
    {
-      URL url = Thread.currentThread().getContextClassLoader().getResource(name);
-      if(url == null)
+      public InputSource resolveEntity(String publicId, String systemId)
+         throws SAXException, IOException
       {
-         throw new IllegalStateException("Resource not found: " + name);
-      }
-      return url;
+         log.debug("resolveEntity, publicId: "+publicId+", systemId: "+systemId);
+         if(systemId.endsWith("books.dtd"))
+         {
+            return new InputSource(getResourceStream("/xml/book/books.dtd"));
+         }
+         if(systemId.endsWith("books2.dtd"))
+         {
+            return new InputSource(getResourceStream("/xml/book/books2.dtd"));
+         }
+         return null;
+      }      
    }
 }

Modified: jbossxb/trunk/src/test/resources/xml/book/book-dtd.xml
===================================================================
--- jbossxb/trunk/src/test/resources/xml/book/book-dtd.xml	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/test/resources/xml/book/book-dtd.xml	2007-04-04 23:49:16 UTC (rev 2364)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//DTD Books//EN" "resources/xml/book/books.dtd">
+<!DOCTYPE book PUBLIC "-//DTD Books//EN" "target/test-classes/xml/book/books.dtd">
 
 <book isbn="0836217462">
    <title>Being a Dog Is a Full-Time Job</title>

Modified: jbossxb/trunk/src/test/resources/xml/book/book-xs.xml
===================================================================
--- jbossxb/trunk/src/test/resources/xml/book/book-xs.xml	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/test/resources/xml/book/book-xs.xml	2007-04-04 23:49:16 UTC (rev 2364)
@@ -4,7 +4,7 @@
    isbn="0836217462"
    xmlns="http://example.org/ns/books/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://example.org/ns/books/ resources/xml/book/books.xsd">
+   xsi:schemaLocation="http://example.org/ns/books/ target/test-classes/xml/book/book/books.xsd">
 
    <title>Being a Dog Is a Full-Time Job</title>
    <author>Charles M. Schulz</author>

Modified: jbossxb/trunk/src/test/resources/xml/book/books2-dtd.xml
===================================================================
--- jbossxb/trunk/src/test/resources/xml/book/books2-dtd.xml	2007-04-04 20:01:57 UTC (rev 2363)
+++ jbossxb/trunk/src/test/resources/xml/book/books2-dtd.xml	2007-04-04 23:49:16 UTC (rev 2364)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//DTD Books//EN" "resources/xml/book/books2.dtd">
+<!DOCTYPE book PUBLIC "-//DTD Books2//EN" "target/test-classes/xml/book/books2.dtd">
 
 <book isbn="0836217462">
    <title>Being a Dog Is a Full-Time Job</title>




More information about the jboss-svn-commits mailing list