Author: vsiveton
Date: Wed Jan 28 12:09:08 2009
New Revision: 738463

URL: http://svn.apache.org/viewvc?rev=738463&view=rev
Log:
o removed errors when validating an xml with xsd and entities like  

Modified:
    
maven/doxia/doxia-sitetools/trunk/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
    
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java

Modified: 
maven/doxia/doxia-sitetools/trunk/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml?rev=738463&r1=738462&r2=738463&view=diff
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
 (original)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
 Wed Jan 28 12:09:08 2009
@@ -18,8 +18,20 @@
   under the License.
 -->
 
-<!-- Voluntarily no XSD -->
-<document>
+<!DOCTYPE document [
+  <!-- These are the entity sets for ISO Latin 1 characters for the XHTML -->
+  <!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent";>
+  %HTMLlat1;
+  <!-- These are the entity sets for special characters for the XHTML -->
+  <!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent";>
+  %HTMLsymbol;
+  <!-- These are the entity sets for symbol characters for the XHTML -->
+  <!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent";>
+  %HTMLspecial;
+]>
+<document xmlns="http://maven.apache.org/XDOC/2.0";
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 
file:../../../../../../../doxia/doxia-modules/doxia-module-xdoc/src/main/resources/xdoc-2.0.xsd">
   <properties>
     <title>Test entities, cdatas and comments</title>
   </properties>

Modified: 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java?rev=738463&r1=738462&r2=738463&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
 Wed Jan 28 12:09:08 2009
@@ -523,19 +523,16 @@
                 hasDoctype = true;
             }
 
-            // 2 if no doctype, check for an xmlns instance
+            // 2 check for an xmlns instance
             boolean hasXsd = false;
-            if ( !hasDoctype )
+            matcher = PATTERN_TAG.matcher( content );
+            if ( matcher.find() )
             {
-                matcher = PATTERN_TAG.matcher( content );
-                if ( matcher.find() )
-                {
-                    String value = matcher.group( 2 );
+                String value = matcher.group( 2 );
 
-                    if ( value.indexOf( 
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI ) != -1 )
-                    {
-                        hasXsd = true;
-                    }
+                if ( value.indexOf( 
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI ) != -1 )
+                {
+                    hasXsd = true;
                 }
             }
 
@@ -546,7 +543,7 @@
                 {
                     getLog().debug( "Validating the content..." );
                 }
-                getXmlReader().parse( new InputSource( new StringReader( 
content ) ) );
+                getXmlReader( hasXsd && hasDoctype ).parse( new InputSource( 
new StringReader( content ) ) );
             }
         }
         catch ( IOException e )
@@ -568,10 +565,11 @@
     }
 
     /**
+     * @param hasDtdAndXsd to flag the <code>ErrorHandler</code>.
      * @return an xmlReader instance.
      * @throws SAXException if any
      */
-    private XMLReader getXmlReader()
+    private XMLReader getXmlReader( boolean hasDtdAndXsd )
         throws SAXException
     {
         if ( xmlReader == null )
@@ -585,6 +583,8 @@
             xmlReader.setEntityResolver( new CachedFileEntityResolver() );
         }
 
+        ( (MessagesErrorHandler) xmlReader.getErrorHandler() 
).setHasDtdAndXsd( hasDtdAndXsd );
+
         return xmlReader;
     }
 
@@ -602,13 +602,27 @@
 
         private static final int TYPE_FATAL = 3;
 
+        /** @see 
org/apache/xerces/impl/msg/XMLMessages.properties#MSG_ELEMENT_NOT_DECLARED */
+        private static final Pattern ELEMENT_TYPE_PATTERN =
+            Pattern.compile( "Element type \".*\" must be declared.", 
Pattern.DOTALL );
+
         private final Log log;
 
+        private boolean hasDtdAndXsd;
+
         public MessagesErrorHandler( Log log )
         {
             this.log = log;
         }
 
+        /**
+         * @param hasDtdAndXsd the hasDtdAndXsd to set
+         */
+        protected void setHasDtdAndXsd( boolean hasDtdAndXsd )
+        {
+            this.hasDtdAndXsd = hasDtdAndXsd;
+        }
+
         /** {...@inheritdoc} */
         public void warning( SAXParseException e )
             throws SAXException
@@ -620,7 +634,20 @@
         public void error( SAXParseException e )
             throws SAXException
         {
-            processException( TYPE_ERROR, e );
+            // Workaround for Xerces complaints when an XML with XSD needs 
also a <!DOCTYPE []> to specify entities
+            // like &nbsp;
+            // See http://xsd.stylusstudio.com/2001Nov/post08021.htm
+            if ( !hasDtdAndXsd )
+            {
+                processException( TYPE_ERROR, e );
+                return;
+            }
+
+            Matcher m = ELEMENT_TYPE_PATTERN.matcher( e.getMessage() );
+            if ( !m.find() )
+            {
+                processException( TYPE_ERROR, e );
+            }
         }
 
         /** {...@inheritdoc} */


Reply via email to