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