You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2010/08/10 16:12:44 UTC

svn commit: r984018 - in /xerces/c/branches/xerces-3.1: src/xercesc/internal/ src/xercesc/sax2/ tests/src/DOM/DOMTest/ tests/src/XSTSHarness/regression/ tests/src/XSTSHarness/regression/XERCESC-1937/

Author: amassari
Date: Tue Aug 10 14:12:43 2010
New Revision: 984018

URL: http://svn.apache.org/viewvc?rev=984018&view=rev
Log:
Process xsi:type after consuming xsi:schemaLocation, so that the grammar where the type is defined can be found also when the xsi:schemaLocation is placed after xsi:type (XERCESC-1937)

Added:
    xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/
    xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xml
    xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xsd
Modified:
    xerces/c/branches/xerces-3.1/src/xercesc/internal/IGXMLScanner2.cpp
    xerces/c/branches/xerces-3.1/src/xercesc/internal/SGXMLScanner.cpp
    xerces/c/branches/xerces-3.1/src/xercesc/sax2/SAX2XMLReader.hpp
    xerces/c/branches/xerces-3.1/tests/src/DOM/DOMTest/DTest.cpp
    xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/Xerces.testSet

Modified: xerces/c/branches/xerces-3.1/src/xercesc/internal/IGXMLScanner2.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/internal/IGXMLScanner2.cpp?rev=984018&r1=984017&r2=984018&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/internal/IGXMLScanner2.cpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/internal/IGXMLScanner2.cpp Tue Aug 10 14:12:43 2010
@@ -1613,10 +1613,6 @@ void IGXMLScanner::scanRawAttrListforNam
     // walk through the list again to deal with "xsi:...."
     if (fDoSchema && fSeeXsi)
     {
-        //  Schema Xsi Type yyyy (e.g. xsi:type="yyyyy")
-        XMLBufBid bbXsi(&fBufMgr);
-        XMLBuffer& fXsiType = bbXsi.getBuffer();
-
         for (XMLSize_t index = 0; index < attCount; index++)
         {
             // each attribute has the prefix:suffix="value"
@@ -1632,7 +1628,7 @@ void IGXMLScanner::scanRawAttrListforNam
             }
 
             // if schema URI has been seen, scan for the schema location and uri
-            // and resolve the schema grammar; or scan for schema type
+            // and resolve the schema grammar
             if (resolvePrefix(prefPtr, ElemStack::Mode_Attribute) == fSchemaNamespaceId) {
 
                 const XMLCh* valuePtr = curPair->getValue();
@@ -1642,71 +1638,97 @@ void IGXMLScanner::scanRawAttrListforNam
                     parseSchemaLocation(valuePtr);
                 else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION))
                     resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString);
+            }
+        }
 
-                if ((!fValidator || !fValidator->handlesSchema()) &&
-                    (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE) ||
-                     XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL)))
-                {
-                  // If we are in the DTD mode, try to switch to the Schema
-                  // mode. For that we need to find any XML Schema grammar
-                  // that we can switch to. Such a grammar can only come
-                  // from the cache (if it came from the schemaLocation
-                  // attribute, we would be in the Schema mode already).
-                  //
-                  XMLGrammarPool* pool = fGrammarResolver->getGrammarPool ();
-                  RefHashTableOfEnumerator<Grammar> i = pool->getGrammarEnumerator ();
+        // do it another time, as xsi:type and xsi:nill only work if the schema grammar has been already
+        // loaded (JIRA XERCESC-1937)
+        for (XMLSize_t index = 0; index < attCount; index++)
+        {
+            const KVStringPair* curPair = fRawAttrList->elementAt(index);
+            const XMLCh* rawPtr = curPair->getKey();
+            const XMLCh* prefPtr = XMLUni::fgZeroLenString;
+            int   colonInd = fRawAttrColonList[index];
 
-                  while (i.hasMoreElements ())
-                  {
-                    Grammar& gr (i.nextElement ());
+            if (colonInd != -1) {
 
-                    if (gr.getGrammarType () == Grammar::SchemaGrammarType)
-                    {
-                      switchGrammar (gr.getTargetNamespace ());
-                      break;
-                    }
-                  }
-                }
+                fURIBuf.set(rawPtr, colonInd);
+                prefPtr = fURIBuf.getRawBuffer();
+            }
+
+            // scan for schema type
+            if (resolvePrefix(prefPtr, ElemStack::Mode_Attribute) == fSchemaNamespaceId) {
+
+                const XMLCh* valuePtr = curPair->getValue();
+                const XMLCh*  suffPtr = &rawPtr[colonInd + 1];
 
-                if( fValidator && fValidator->handlesSchema() )
+                if(XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE) ||
+                   XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
                 {
-                    if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE))
+                    if (!fValidator || !fValidator->handlesSchema())
                     {
-                        // normalize the attribute according to schema whitespace facet
-                        DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME);
-                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true);
+                        // If we are in the DTD mode, try to switch to the Schema
+                        // mode. For that we need to find any XML Schema grammar
+                        // that we can switch to. Such a grammar can only come
+                        // from the cache (if it came from the schemaLocation
+                        // attribute, we would be in the Schema mode already).
+                        //
+                        XMLGrammarPool* pool = fGrammarResolver->getGrammarPool ();
+                        RefHashTableOfEnumerator<Grammar> i = pool->getGrammarEnumerator ();
+
+                        while (i.hasMoreElements ())
+                        {
+                            Grammar& gr (i.nextElement ());
+
+                            if (gr.getGrammarType () == Grammar::SchemaGrammarType)
+                            {
+                                switchGrammar (gr.getTargetNamespace ());
+                                break;
+                            }
+                        }
                     }
-                    else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
+
+                    if( fValidator && fValidator->handlesSchema() )
                     {
-                        // normalize the attribute according to schema whitespace facet
-                        XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer();
-                        DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN);
-                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true);
-                        if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE))
-                            ((SchemaValidator*)fValidator)->setNillable(true);
-                        else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE))
-                            ((SchemaValidator*)fValidator)->setNillable(false);
-                        else
-                            emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr);
-                        fBufMgr.releaseBuffer(fXsiNil);
+                        if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE))
+                        {
+                            XMLBufBid bbXsi(&fBufMgr);
+                            XMLBuffer& fXsiType = bbXsi.getBuffer();
+
+                            // normalize the attribute according to schema whitespace facet
+                            DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME);
+                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true);
+                            if (!fXsiType.isEmpty()) {
+                                int colonPos = -1;
+                                unsigned int uriId = resolveQName (
+                                      fXsiType.getRawBuffer()
+                                    , fPrefixBuf
+                                    , ElemStack::Mode_Element
+                                    , colonPos
+                                );
+                                ((SchemaValidator*)fValidator)->setXsiType(fPrefixBuf.getRawBuffer(), fXsiType.getRawBuffer() + colonPos + 1, uriId);
+                            }
+                        }
+                        else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
+                        {
+                            // normalize the attribute according to schema whitespace facet
+                            XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer();
+                            DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN);
+                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true);
+                            if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE))
+                                ((SchemaValidator*)fValidator)->setNillable(true);
+                            else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE))
+                                ((SchemaValidator*)fValidator)->setNillable(false);
+                            else
+                                emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr);
+                            fBufMgr.releaseBuffer(fXsiNil);
+                        }
                     }
                 }
             }
         }
-
-        if (fValidator && fValidator->handlesSchema()) {
-            if (!fXsiType.isEmpty()) {
-                int colonPos = -1;
-                unsigned int uriId = resolveQName (
-                      fXsiType.getRawBuffer()
-                    , fPrefixBuf
-                    , ElemStack::Mode_Element
-                    , colonPos
-                );
-                ((SchemaValidator*)fValidator)->setXsiType(fPrefixBuf.getRawBuffer(), fXsiType.getRawBuffer() + colonPos + 1, uriId);
-            }
-        }
     }
+
 }
 
 void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr, bool ignoreLoadSchema)

Modified: xerces/c/branches/xerces-3.1/src/xercesc/internal/SGXMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/internal/SGXMLScanner.cpp?rev=984018&r1=984017&r2=984018&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/internal/SGXMLScanner.cpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/internal/SGXMLScanner.cpp Tue Aug 10 14:12:43 2010
@@ -3459,10 +3459,6 @@ void SGXMLScanner::scanRawAttrListforNam
     // walk through the list again to deal with "xsi:...."
     if (fSeeXsi)
     {
-        //  Schema Xsi Type yyyy (e.g. xsi:type="yyyyy")
-        XMLBufBid bbXsi(&fBufMgr);
-        XMLBuffer& fXsiType = bbXsi.getBuffer();
-
         for (XMLSize_t index = 0; index < attCount; index++)
         {
             // each attribute has the prefix:suffix="value"
@@ -3481,7 +3477,7 @@ void SGXMLScanner::scanRawAttrListforNam
             }
 
             // if schema URI has been seen, scan for the schema location and uri
-            // and resolve the schema grammar; or scan for schema type
+            // and resolve the schema grammar
             if (resolvePrefix(prefPtr, ElemStack::Mode_Attribute) == fSchemaNamespaceId) {
 
                 const XMLCh* valuePtr = curPair->getValue();
@@ -3491,14 +3487,54 @@ void SGXMLScanner::scanRawAttrListforNam
                     parseSchemaLocation(valuePtr);
                 else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION))
                     resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString);
+            }
+        }
+
+        // do it another time, as xsi:type and xsi:nill only work if the schema grammar has been already
+        // loaded (JIRA XERCESC-1937)
+        if (fValidator && fValidator->handlesSchema())
+        {
+            for (XMLSize_t index = 0; index < attCount; index++)
+            {
+                // each attribute has the prefix:suffix="value"
+                const KVStringPair* curPair = fRawAttrList->elementAt(index);
+                const XMLCh* rawPtr = curPair->getKey();
+                const XMLCh* prefPtr;
+
+                int   colonInd = fRawAttrColonList[index];
+
+                if (colonInd != -1) {
+                    fURIBuf.set(rawPtr, colonInd);
+                    prefPtr = fURIBuf.getRawBuffer();
+                }
+                else {
+                    prefPtr = XMLUni::fgZeroLenString;
+                }
+
+                // scan for schema type
+                if (resolvePrefix(prefPtr, ElemStack::Mode_Attribute) == fSchemaNamespaceId) {
+
+                    const XMLCh* valuePtr = curPair->getValue();
+                    const XMLCh*  suffPtr = &rawPtr[colonInd + 1];
 
-                if( fValidator && fValidator->handlesSchema() )
-                {
                     if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE))
                     {
+                        XMLBufBid bbXsi(&fBufMgr);
+                        XMLBuffer& fXsiType = bbXsi.getBuffer();
+
                         // normalize the attribute according to schema whitespace facet
                         DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME);
                         ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true);
+                        if (!fXsiType.isEmpty()) {
+                            int colonPos = -1;
+                            unsigned int uriId = resolveQName (
+                                  fXsiType.getRawBuffer()
+                                , fPrefixBuf
+                                , ElemStack::Mode_Element
+                                , colonPos
+                            );
+                            ((SchemaValidator*)fValidator)->setXsiType(fPrefixBuf.getRawBuffer(), fXsiType.getRawBuffer() + colonPos + 1, uriId);
+                        }
                     }
                     else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
                     {
@@ -3517,19 +3553,6 @@ void SGXMLScanner::scanRawAttrListforNam
                 }
             }
         }
-
-        if (fValidator && fValidator->handlesSchema()) {
-            if (!fXsiType.isEmpty()) {
-                int colonPos = -1;
-                unsigned int uriId = resolveQName (
-                      fXsiType.getRawBuffer()
-                    , fPrefixBuf
-                    , ElemStack::Mode_Element
-                    , colonPos
-                );
-                ((SchemaValidator*)fValidator)->setXsiType(fPrefixBuf.getRawBuffer(), fXsiType.getRawBuffer() + colonPos + 1, uriId);
-            }
-        }
     }
 }
 

Modified: xerces/c/branches/xerces-3.1/src/xercesc/sax2/SAX2XMLReader.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/sax2/SAX2XMLReader.hpp?rev=984018&r1=984017&r2=984018&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/sax2/SAX2XMLReader.hpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/sax2/SAX2XMLReader.hpp Tue Aug 10 14:12:43 2010
@@ -257,7 +257,10 @@ public:
     * <br>(See the SAX2 Programming Guide for detail description).
     *
     * <br>http://apache.org/xml/properties/schema/external-schemaLocation
-    * <br>http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation.
+    * <br>http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation
+    * <br>http://apache.org/xml/properties/security-manager
+    * <br>http://apache.org/xml/properties/low-water-mark
+    * <br>http://apache.org/xml/properties/scannerName
     *
     * It takes a void pointer as the property value.  Application is required to initialize this void
     * pointer to a correct type.  See the SAX2 Programming Guide

Modified: xerces/c/branches/xerces-3.1/tests/src/DOM/DOMTest/DTest.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/tests/src/DOM/DOMTest/DTest.cpp?rev=984018&r1=984017&r2=984018&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/tests/src/DOM/DOMTest/DTest.cpp (original)
+++ xerces/c/branches/xerces-3.1/tests/src/DOM/DOMTest/DTest.cpp Tue Aug 10 14:12:43 2010
@@ -40,6 +40,7 @@
 #include <xercesc/util/OutOfMemoryException.hpp>
 #include <xercesc/framework/MemBufInputSource.hpp>
 #include <xercesc/validators/common/CMStateSet.hpp>
+#include <xercesc/util/regx/Match.hpp>
 
 #define UNUSED(x) { if(x!=0){} }
 
@@ -5498,6 +5499,22 @@ bool DOMTest::testRegex() {
 
     TEST_VALID_SCHEMA_REGEX("-0 +3989 -90.76754,+9E77, -0.3e+9", "(((\\+|\\-)?(0|[1-9][0-9]*)?(\\.[0-9]*)?((E|e)(\\+|\\-)?[0-9]+)?)?( )?(,)?( )?)*", __LINE__);
 
+    try
+    {
+        Match match;
+        RegularExpression p("([\\-\\(]?\\d{1,3}([, ]\\d{3})+\\.\\d+[\\)]?|[\\-\\(]?\\d+\\.\\d+[\\)]?).*");
+        if(!p.matches("13.13", &match) || match.getStartPos(0)!=0 || match.getEndPos(0)!=5)
+        {
+            fprintf(stderr, "Regular expression test failed at line %i\n", __LINE__);
+            OK = false;
+        }
+    }
+    catch(XMLException& )
+    {
+        fprintf(stderr, "Regular expression test failed at line %i\n", __LINE__);
+        OK = false;
+    }
+
     delete hugeString;
 
     return OK;

Added: xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xml
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xml?rev=984018&view=auto
==============================================================================
--- xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xml (added)
+++ xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xml Tue Aug 10 14:12:43 2010
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<p xsi:type="Person"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:noNamespaceSchemaLocation="test.xsd">
+   <name>John Doe</name>
+</p>
+

Added: xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xsd
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xsd?rev=984018&view=auto
==============================================================================
--- xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xsd (added)
+++ xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/XERCESC-1937/test.xsd Tue Aug 10 14:12:43 2010
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+       <xsd:complexType name="Person">
+               <xsd:sequence>
+                       <xsd:element name="name"/>
+               </xsd:sequence>
+       </xsd:complexType>
+</xsd:schema>
+

Modified: xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/Xerces.testSet
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/Xerces.testSet?rev=984018&r1=984017&r2=984018&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/Xerces.testSet (original)
+++ xerces/c/branches/xerces-3.1/tests/src/XSTSHarness/regression/Xerces.testSet Tue Aug 10 14:12:43 2010
@@ -810,4 +810,20 @@
       <current status="accepted" date="2009-10-28"/>
     </schemaTest>
   </testGroup>
+  <testGroup name="XERCESC-1937">
+    <annotation>
+      <documentation>xsi:type is not applied to root element</documentation>
+    </annotation>
+    <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1937"/>
+    <schemaTest name="XERCESC-1937-1">
+      <schemaDocument xlink:href="./XERCESC-1937/test.xsd"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2010-08-09"/>
+    </schemaTest>
+    <instanceTest name="XERCESC-1937-2">
+      <instanceDocument xlink:href="./XERCESC-1937/test.xml"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2010-08-09"/>
+    </instanceTest>
+  </testGroup>
 </testSet>



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