You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2007/09/19 16:09:13 UTC

svn commit: r577310 - in /xerces/c/branches/xerces-2/src/xercesc: framework/ internal/ validators/datatype/ validators/schema/

Author: cargilld
Date: Wed Sep 19 07:09:12 2007
New Revision: 577310

URL: http://svn.apache.org/viewvc?rev=577310&view=rev
Log:
qname enumeration fix to allow different prefix in schema and instance

Modified:
    xerces/c/branches/xerces-2/src/xercesc/framework/ValidationContext.hpp
    xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.cpp
    xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.hpp
    xerces/c/branches/xerces-2/src/xercesc/internal/XMLScanner.cpp
    xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp
    xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp
    xerces/c/branches/xerces-2/src/xercesc/validators/schema/TraverseSchema.cpp

Modified: xerces/c/branches/xerces-2/src/xercesc/framework/ValidationContext.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/framework/ValidationContext.hpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/framework/ValidationContext.hpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/framework/ValidationContext.hpp Wed Sep 19 07:09:12 2007
@@ -33,6 +33,7 @@
 class DTDEntityDecl;
 class DatatypeValidator;
 class ElemStack;
+class XMLScanner;
 
 class XMLPARSER_EXPORT ValidationContext : public XMemory
 {
@@ -94,6 +95,9 @@
       */
     virtual bool isPrefixUnknown(XMLCh* /* prefix */) { return true; };
     virtual void setElemStack(ElemStack* /* elemStack */) {};
+    virtual const XMLCh* getURIForPrefix(XMLCh* /*prefix */) { return 0; };
+    virtual void setScanner(XMLScanner* /* scanner */) { };
+
     //@}
 
    

Modified: xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.cpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.cpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.cpp Wed Sep 19 07:09:12 2007
@@ -28,6 +28,7 @@
 #include <xercesc/validators/DTD/DTDEntityDecl.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
 #include <xercesc/internal/ElemStack.hpp>
+#include <xercesc/internal/XMLScanner.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -48,6 +49,7 @@
 ,fToCheckIdRefList(true)
 ,fValidatingMemberType(0)
 ,fElemStack(0)
+,fScanner(0)
 {
     fIdRefList = new (fMemoryManager) RefHashTableOf<XMLRefInfo>(109, fMemoryManager);
 }
@@ -189,6 +191,16 @@
         unsigned int uriId = fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown);                
     }                
     return unknown;
+}
+
+const XMLCh* ValidationContextImpl::getURIForPrefix(XMLCh* prefix) { 
+    bool unknown = false;
+    unsigned int uriId = fElemStack->mapPrefixToURI(prefix, (ElemStack::MapModes) ElemStack::Mode_Element, unknown);
+    if (!unknown) {
+        return fScanner->getURIText(uriId);
+    }
+    
+    return XMLUni::fgZeroLenString; 
 }
 
 XERCES_CPP_NAMESPACE_END

Modified: xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.hpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.hpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/internal/ValidationContextImpl.hpp Wed Sep 19 07:09:12 2007
@@ -91,6 +91,9 @@
       */
     virtual bool isPrefixUnknown(XMLCh* prefix);
     virtual void setElemStack(ElemStack* elemStack);
+    virtual const XMLCh* getURIForPrefix(XMLCh* prefix);
+    virtual void setScanner(XMLScanner* scanner);   
+
 
     //@}
   
@@ -131,6 +134,8 @@
     bool                                fToCheckIdRefList;
     DatatypeValidator *                 fValidatingMemberType;    
     ElemStack*      fElemStack;
+    XMLScanner*     fScanner;
+
 
 };
 
@@ -148,6 +153,10 @@
 
 inline void ValidationContextImpl::setElemStack(ElemStack* elemStack) {
     fElemStack = elemStack;
+}
+
+inline void ValidationContextImpl::setScanner(XMLScanner* scanner) {
+    fScanner = scanner;
 }
 
 XERCES_CPP_NAMESPACE_END

Modified: xerces/c/branches/xerces-2/src/xercesc/internal/XMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/internal/XMLScanner.cpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/internal/XMLScanner.cpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/internal/XMLScanner.cpp Wed Sep 19 07:09:12 2007
@@ -767,6 +767,7 @@
     //  semantics, i.e. all id refs must refer to elements that exist
     fValidationContext = new (fMemoryManager) ValidationContextImpl(fMemoryManager);
     fValidationContext->setElemStack(&fElemStack);
+    fValidationContext->setScanner(this);
 
     //  Create the GrammarResolver
     //fGrammarResolver = new GrammarResolver();

Modified: xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.cpp Wed Sep 19 07:09:12 2007
@@ -26,6 +26,7 @@
 #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
 #include <xercesc/internal/ValidationContextImpl.hpp>
+#include <xercesc/util/XMLChar.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -71,7 +72,7 @@
     //
     // check 3.2.18.c0 must: QName
     //
-    if ( !XMLString::isValidQName(content))
+    if ( !XMLChar1_0::isValidQName(content, XMLString::stringLen(content)))
     {
         ThrowXMLwithMemMgr1(InvalidDatatypeValueException
                 , XMLExcepts::VALUE_QName_Invalid
@@ -114,14 +115,18 @@
 
     checkValueSpace(content, manager);
 
+    int colonPos;
+    XMLCh* prefix = 0;    
+    ArrayJanitor<XMLCh>  jan(prefix, manager);
+
     if (context) {
-        int colonPos = XMLString::indexOf(content, chColon);
-        if (colonPos > 0) {
-            XMLCh* prefix = XMLString::replicate(content, manager);
-            ArrayJanitor<XMLCh>  jan(prefix, manager);
-            normalizeContent(prefix, manager);
-            prefix[colonPos] = chNull;
-                     
+        prefix = XMLString::replicate(content, manager);
+        jan.reset(prefix, manager);
+        normalizeContent(prefix, manager);
+
+        colonPos = XMLString::indexOf(content, chColon);
+        if (colonPos > 0) {                        
+            prefix[colonPos] = chNull;                     
             if (context->isPrefixUnknown(prefix)) {
                 ThrowXMLwithMemMgr1(InvalidDatatypeValueException
                     , XMLExcepts::VALUE_QName_Invalid2
@@ -131,6 +136,7 @@
         }
     }
 
+#if 0
     if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 &&
         (getEnumeration() != 0))
     {
@@ -150,8 +156,102 @@
             ThrowXMLwithMemMgr1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content, manager);
     }
 
+
+#else
+    if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 &&
+        (getEnumeration() != 0) && context)
+    {
+        XMLCh* localName;
+        if (colonPos > 0) {
+            localName = prefix + colonPos + 1;
+        }
+        else {
+            localName = prefix;
+        }
+
+        XMLCh* enumPrefix;
+        XMLCh* enumLocalName;
+        int i=0;
+        int enumLength = getEnumeration()->size();
+        bool foundURIId = false;
+        const XMLCh* normURI;
+		// The +=2 is because the enumeration has prefix:localname as one entry followed
+		// by the URI string for the prefix as the next entry.
+        for ( ; i < enumLength; i+=2)
+        {            
+            enumPrefix = XMLString::replicate(getEnumeration()->elementAt(i), manager);
+            ArrayJanitor<XMLCh>  janEnum(enumPrefix, manager);
+            colonPos = XMLString::indexOf(enumPrefix, chColon, 0, manager);
+            
+            if (colonPos != -1) {
+                enumLocalName = enumPrefix + colonPos + 1;
+                enumPrefix[colonPos] = chNull;
+            }
+            else {
+                enumLocalName = enumPrefix;
+            }
+            
+            if (XMLString::equals(localName, enumLocalName)) {               
+				if (colonPos < 0)
+					break;
+
+                // now need to see if the prefix URI's are the same                
+                if (!foundURIId) {                    
+                    normURI = context->getURIForPrefix(prefix);                                       
+                    foundURIId = true;
+                }
+				if (XMLString::equals(normURI, getEnumeration()->elementAt(i+1)))
+					break;
+            }        
+        }
+
+        if (i == enumLength)
+            ThrowXMLwithMemMgr1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content, manager);
+    }
+#endif
+
     checkAdditionalFacet(content, manager);
 }
+
+//
+//  Check vs base
+//         check common facets
+//         check enumeration
+//         check Additional Facet Constraint
+//
+void QNameDatatypeValidator::inspectFacetBase(MemoryManager* const manager)
+{
+
+    QNameDatatypeValidator *pBaseValidator = (QNameDatatypeValidator*) getBaseValidator();
+    int thisFacetsDefined = getFacetsDefined();
+
+    if ( (!thisFacetsDefined && !getEnumeration()) ||
+         (!pBaseValidator)                      )
+        return;
+
+    // check 4.3.5.c0 must: enumeration values from the value space of base
+    if ( ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0) &&
+        (getEnumeration() !=0))
+    {
+        int i = 0;
+        int enumLength = getEnumeration()->size();
+		// The +=2 is because the enumeration has prefix:localname as one entry followed
+		// by the URI string for the prefix as the next entry.
+        for ( ; i < enumLength; i+=2)
+        {
+            // ask parent do a complete check
+            pBaseValidator->checkContent(getEnumeration()->elementAt(i), (ValidationContext*)0, false, manager);
+#if 0
+// spec says that only base has to checkContent          
+            // enum shall pass this->checkContent() as well.
+            checkContent(getEnumeration()->elementAt(i), (ValidationContext*)0, false, manager);
+#endif
+        }
+    }
+
+    checkAdditionalFacetConstraints(manager);
+
+} //end of inspectFacetBase
 
 /***
  * Support for Serialization/De-serialization

Modified: xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/validators/datatype/QNameDatatypeValidator.hpp Wed Sep 19 07:09:12 2007
@@ -79,6 +79,8 @@
                             , bool                           asBase
                             , MemoryManager* const manager);
 
+    virtual void inspectFacetBase(MemoryManager* const manager);
+
 private:
     // -----------------------------------------------------------------------
     //  Unimplemented constructors and operators

Modified: xerces/c/branches/xerces-2/src/xercesc/validators/schema/TraverseSchema.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2/src/xercesc/validators/schema/TraverseSchema.cpp?rev=577310&r1=577309&r2=577310&view=diff
==============================================================================
--- xerces/c/branches/xerces-2/src/xercesc/validators/schema/TraverseSchema.cpp (original)
+++ xerces/c/branches/xerces-2/src/xercesc/validators/schema/TraverseSchema.cpp Wed Sep 19 07:09:12 2007
@@ -3235,6 +3235,19 @@
                         fBuffer.append(localPart);
                         enums.get()->addElement(XMLString::replicate(fBuffer.getRawBuffer(), fGrammarPoolMemoryManager));
                     }
+					else if (baseValidator->getType() == DatatypeValidator::QName) {
+						// We need the URI string for the prefix to determine
+						// if that matches the value in the instance document.
+						// Code was just comparing the string of prefix:localname
+						// and if the schema and instance document had different
+						// prefixes with the same URI string then we were giving an error.
+                        const XMLCh* localPart = getLocalPart(attValue);
+                        const XMLCh* prefix = getPrefix(attValue);
+                        const XMLCh* uriStr = (prefix && *prefix) ? resolvePrefixToURI(content, prefix) : fTargetNSURIString;                      
+                       
+						enums.get()->addElement(XMLString::replicate(attValue, fGrammarPoolMemoryManager));
+						enums.get()->addElement(XMLString::replicate(uriStr, fGrammarPoolMemoryManager));        
+                    }
                     else {
                         enums.get()->addElement(XMLString::replicate(attValue, fGrammarPoolMemoryManager));
                     }



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