You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2007/01/12 22:48:01 UTC

svn commit: r495747 - in /xerces/java/trunk/src/org/apache/xerces/impl: XML11NSDocumentScannerImpl.java XMLDTDScannerImpl.java XMLDocumentFragmentScannerImpl.java XMLDocumentScannerImpl.java XMLEntityManager.java XMLNSDocumentScannerImpl.java

Author: mrglavas
Date: Fri Jan 12 13:48:00 2007
New Revision: 495747

URL: http://svn.apache.org/viewvc?view=rev&rev=495747
Log:
Fixing JIRA Issue #1221:
http://issues.apache.org/jira/browse/XERCESJ-1221

E13 [1] of the XML 1.0 3rd edition errata clarifies that even internal parameter entity references 
are enough to make undeclared entities into mere validity errors rather than well-formedness errors. 
Xerces was reporting a fatal error for undeclared entities in a document containing any parameter
entities (not just internal ones). This should be fixed now.

[1] http://www.w3.org/XML/xml-V10-3e-errata#E13

Modified:
    xerces/java/trunk/src/org/apache/xerces/impl/XML11NSDocumentScannerImpl.java
    xerces/java/trunk/src/org/apache/xerces/impl/XMLDTDScannerImpl.java
    xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java
    xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java
    xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
    xerces/java/trunk/src/org/apache/xerces/impl/XMLNSDocumentScannerImpl.java

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XML11NSDocumentScannerImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XML11NSDocumentScannerImpl.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XML11NSDocumentScannerImpl.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XML11NSDocumentScannerImpl.java Fri Jan 12 13:48:00 2007
@@ -591,12 +591,9 @@
             }
         }
 
-        //REVISIT: one more case needs to be included: external PE and standalone is no
-        boolean isVC = fHasExternalDTD && !fStandalone;
-
         // Scan attribute value and return true if the non-normalized and normalized value are the same
         boolean isSameNormalizedAttr = scanAttributeValue(this.fTempString, fTempString2, 
-                fAttributeQName.rawname,isVC,fCurrentElement.rawname);
+                fAttributeQName.rawname, fIsEntityDeclaredVC, fCurrentElement.rawname);
         
         String value = fTempString.toString();
         attributes.setValue(attrIndex, value);

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLDTDScannerImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLDTDScannerImpl.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLDTDScannerImpl.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLDTDScannerImpl.java Fri Jan 12 13:48:00 2007
@@ -136,8 +136,8 @@
     /** Seen external DTD. */
     protected boolean fSeenExternalDTD;
 
-    /** Seen external parameter entity. */
-    protected boolean fSeenExternalPE;
+    /** Seen a parameter entity reference. */
+    protected boolean fSeenPEReferences;
 
     // private data
 
@@ -635,6 +635,10 @@
         throws IOException, XNIException {
         int depth = fPEDepth;
         String pName = "%"+name;
+        if (!fSeenPEReferences) {
+            fSeenPEReferences = true;
+            fEntityManager.notifyHasPEReferences();
+        }
         if (fValidation && !fEntityManager.isDeclaredEntity(pName)) {
             fErrorReporter.reportError( XMLMessageFormatter.XML_DOMAIN,"EntityNotDeclared", 
                                         new Object[]{name}, XMLErrorReporter.SEVERITY_ERROR);
@@ -1359,7 +1363,7 @@
                 }
             }
             // AttValue 
-            boolean isVC = !fStandalone  &&  (fSeenExternalDTD || fSeenExternalPE) ;
+            boolean isVC = !fStandalone  &&  (fSeenExternalDTD || fSeenPEReferences);
             scanAttributeValue(defaultVal, nonNormalizedDefaultVal, atName, isVC, elName);
         }
         return defaultType;
@@ -1485,10 +1489,6 @@
         String systemId = fStrings[0];
         String publicId = fStrings[1];
 
-        if (isPEDecl && systemId != null) {
-            fSeenExternalPE = true;
-        }
-
         String notation = null;
         // NDATA
         boolean sawSpace = skipSeparator(true, !scanningInternalSubset());
@@ -2107,7 +2107,7 @@
 
         fStandalone = false;
         fSeenExternalDTD = false;
-        fSeenExternalPE = false;
+        fSeenPEReferences = false;
 
         // set starting state
         setScannerState(SCANNER_STATE_TEXT_DECL);

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java Fri Jan 12 13:48:00 2007
@@ -197,6 +197,9 @@
     /** Standalone. */
     protected boolean fStandalone;
     
+    /** True if [Entity Declared] is a VC; false if it is a WFC. */
+    protected boolean fIsEntityDeclaredVC;
+    
     /** External subset resolver. **/
     protected ExternalSubsetResolver fExternalSubsetResolver;
 
@@ -366,6 +369,7 @@
         fElementStack.clear();
         fHasExternalDTD = false;
         fStandalone = false;
+        fIsEntityDeclaredVC = false;
         fInScanContent = false;
 
 		// setup dispatcher
@@ -975,13 +979,11 @@
             reportFatalError("AttributeNotUnique",
                              new Object[]{fCurrentElement.rawname,
                                           fAttributeQName.rawname});
-        }
-        //REVISIT: one more case needs to be included: external PE and standalone is no
-        boolean isVC =  fHasExternalDTD && !fStandalone;        
+        }      
         
         // Scan attribute value and return true if the un-normalized and normalized value are the same
         boolean isSameNormalizedAttr =  scanAttributeValue(fTempString, fTempString2,
-                fAttributeQName.rawname, isVC, fCurrentElement.rawname);
+                fAttributeQName.rawname, fIsEntityDeclaredVC, fCurrentElement.rawname);
         
         attributes.setValue(attrIndex, fTempString.toString());
         // If the non-normalized and normalized value are the same, avoid creating a new string.
@@ -1281,14 +1283,14 @@
         }
         else {
             if (!fEntityManager.isDeclaredEntity(name)) {
-                //REVISIT: one more case needs to be included: external PE and standalone is no
-                if ( fHasExternalDTD && !fStandalone) {
+                if (fIsEntityDeclaredVC) {
                     if (fValidation)
                         fErrorReporter.reportError( XMLMessageFormatter.XML_DOMAIN,"EntityNotDeclared", 
                                                     new Object[]{name}, XMLErrorReporter.SEVERITY_ERROR);
                 }
-                else 
+                else {
                     reportFatalError("EntityNotDeclared", new Object[]{name});
+                }
             }
             fEntityManager.startEntity(name, false);
         }

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java Fri Jan 12 13:48:00 2007
@@ -829,6 +829,7 @@
                             
                             // handle external subset
                             if (fDoctypeSystemId != null) {
+                                fIsEntityDeclaredVC = !fStandalone;
                                 if (((fValidation || fLoadExternalDTD) 
                                     && (fValidationManager == null || !fValidationManager.isCachedDTD()))) {
                                     setScannerState(SCANNER_STATE_DTD_EXTERNAL);
@@ -837,6 +838,7 @@
                                 }
                             }
                             else if (fExternalSubsetSource != null) {
+                                fIsEntityDeclaredVC = !fStandalone;
                                 if (((fValidation || fLoadExternalDTD) 
                                     && (fValidationManager == null || !fValidationManager.isCachedDTD()))) {
                                     // This handles the case of a DOCTYPE that had neither an internal subset or an external subset.
@@ -952,12 +954,14 @@
 
                                 // scan external subset next
                                 if (fDoctypeSystemId != null) {
+                                    fIsEntityDeclaredVC = !fStandalone;
                                     if (readExternalSubset) {
                                         setScannerState(SCANNER_STATE_DTD_EXTERNAL);
                                         break;
                                     }
                                 }
                                 else if (fExternalSubsetSource != null) {
+                                    fIsEntityDeclaredVC = !fStandalone;
                                     if (readExternalSubset) {
                                         // This handles the case of a DOCTYPE that only had an internal subset.
                                         fDTDScanner.setInputSource(fExternalSubsetSource);
@@ -965,6 +969,11 @@
                                         setScannerState(SCANNER_STATE_DTD_EXTERNAL_DECLS);
                                         break;
                                     }
+                                }
+                                // This document only has an internal subset. If it contains parameter entity
+                                // references and standalone="no" then [Entity Declared] is a validity constraint.
+                                else {
+                                    fIsEntityDeclaredVC = fEntityManager.hasPEReferences() && !fStandalone;
                                 }
                                 
                                 // break out of this dispatcher.

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java Fri Jan 12 13:48:00 2007
@@ -306,6 +306,11 @@
      * only be set by the document source (e.g. XMLDocumentScanner).
      */
     protected boolean fStandalone;
+    
+    /**
+     * True if the current document contains parameter entity references.
+     */
+    protected boolean fHasPEReferences;
 
     // are the entities being parsed in the external subset?
     // NOTE:  this *is not* the same as whether they're external entities!
@@ -409,6 +414,21 @@
     public boolean isStandalone() {
         return fStandalone;
     } // isStandalone():boolean
+    
+    /** 
+     * Notifies the entity manager that the current document 
+     * being processed contains parameter entity references.
+     */
+    final void notifyHasPEReferences() {
+        fHasPEReferences = true;
+    } // notifyHasPEReferences
+    
+    /** 
+     * Returns true if the document contains parameter entity references.
+     */
+    final boolean hasPEReferences() {
+        return fHasPEReferences;
+    } // hasPEReferences():boolean
 
     /**
      * Sets the entity handler. When an entity starts and ends, the
@@ -1325,6 +1345,7 @@
 
         // initialize state
         fStandalone = false;
+        fHasPEReferences = false;
         fEntities.clear();
         fEntityStack.removeAllElements();
         fEntityExpansionCount = 0;

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLNSDocumentScannerImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLNSDocumentScannerImpl.java?view=diff&rev=495747&r1=495746&r2=495747
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLNSDocumentScannerImpl.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLNSDocumentScannerImpl.java Fri Jan 12 13:48:00 2007
@@ -525,12 +525,9 @@
             }
         }
 
-        //REVISIT: one more case needs to be included: external PE and standalone is no
-        boolean isVC =  fHasExternalDTD && !fStandalone;
-
         // Scan attribute value and return true if the non-normalized and normalized value are the same
         boolean isSameNormalizedAttr = scanAttributeValue(this.fTempString, fTempString2,
-                fAttributeQName.rawname, isVC, fCurrentElement.rawname);
+                fAttributeQName.rawname, fIsEntityDeclaredVC, fCurrentElement.rawname);
         
         String value = fTempString.toString();
         attributes.setValue(attrIndex, value);



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org