You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2001/05/17 20:11:22 UTC
cvs commit: xml-xerces/c/src/validators/schema GeneralAttributeCheck.cpp GeneralAttributeCheck.hpp TraverseSchema.cpp TraverseSchema.hpp
knoaman 01/05/17 11:11:22
Modified: c/src/validators/datatype DatatypeValidatorFactory.cpp
DatatypeValidatorFactory.hpp
c/src/validators/schema GeneralAttributeCheck.cpp
GeneralAttributeCheck.hpp TraverseSchema.cpp
TraverseSchema.hpp
Log:
More constraint and attribute checking.
Revision Changes Path
1.8 +7 -3 xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.cpp
Index: DatatypeValidatorFactory.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DatatypeValidatorFactory.cpp 2001/05/16 15:24:42 1.7
+++ DatatypeValidatorFactory.cpp 2001/05/17 18:11:11 1.8
@@ -56,6 +56,9 @@
/*
* $Log: DatatypeValidatorFactory.cpp,v $
+ * Revision 1.8 2001/05/17 18:11:11 knoaman
+ * More constraint and attribute checking.
+ *
* Revision 1.7 2001/05/16 15:24:42 tng
* Schema: Add Base64 and HexBin. By Pei Yong Zhang.
*
@@ -249,14 +252,13 @@
// DatatypeValidatorFactory: Static member data
// ---------------------------------------------------------------------------
RefHashTableOf<DatatypeValidator>* DatatypeValidatorFactory::fBuiltInRegistry = 0;
-
+int DatatypeValidatorFactory::fRegistryExpanded = 0;
// ---------------------------------------------------------------------------
// DatatypeValidatorFactory: Constructors and Destructor
// ---------------------------------------------------------------------------
DatatypeValidatorFactory::DatatypeValidatorFactory()
- : fRegistryExpanded(0)
- , fUserDefinedRegistry(0)
+ : fUserDefinedRegistry(0)
{
}
@@ -513,6 +515,7 @@
createDatatypeValidator(SchemaSymbols::fgDT_BYTE,
getDatatypeValidator(SchemaSymbols::fgDT_SHORT),
facets, false, 0, false);
+*/
// Create 'nonNegativeInteger' datatype validator
facets = new RefHashTableOf<KVStringPair>(3);
@@ -524,6 +527,7 @@
getDatatypeValidator(SchemaSymbols::fgDT_INTEGER),
facets, false, 0, false);
+/*
// Create 'unsignedLong' datatype validator
facets = new RefHashTableOf<KVStringPair>(3);
1.5 +3 -3 xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.hpp
Index: DatatypeValidatorFactory.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DatatypeValidatorFactory.hpp 2001/05/15 21:59:23 1.4
+++ DatatypeValidatorFactory.hpp 2001/05/17 18:11:12 1.5
@@ -55,7 +55,7 @@
*/
/*
- * $Id: DatatypeValidatorFactory.hpp,v 1.4 2001/05/15 21:59:23 knoaman Exp $
+ * $Id: DatatypeValidatorFactory.hpp,v 1.5 2001/05/17 18:11:12 knoaman Exp $
*/
#if !defined(DATATYPEVALIDATORFACTORY_HPP)
@@ -233,8 +233,8 @@
// fBuiltInRegistry
// This is a hashtable of built-in primitive datatype validators.
// -----------------------------------------------------------------------
- int fRegistryExpanded;
- RefHashTableOf<DatatypeValidator>* fUserDefinedRegistry;
+ RefHashTableOf<DatatypeValidator>* fUserDefinedRegistry;
+ static int fRegistryExpanded;
static RefHashTableOf<DatatypeValidator>* fBuiltInRegistry;
};
1.2 +142 -21 xml-xerces/c/src/validators/schema/GeneralAttributeCheck.cpp
Index: GeneralAttributeCheck.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/schema/GeneralAttributeCheck.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- GeneralAttributeCheck.cpp 2001/05/15 21:59:31 1.1
+++ GeneralAttributeCheck.cpp 2001/05/17 18:11:15 1.2
@@ -56,6 +56,9 @@
/*
* $Log: GeneralAttributeCheck.cpp,v $
+ * Revision 1.2 2001/05/17 18:11:15 knoaman
+ * More constraint and attribute checking.
+ *
* Revision 1.1 2001/05/15 21:59:31 knoaman
* TraverseSchema: add attribute checking + some fixes + more error messages.
* More attribute cheking to come.
@@ -75,16 +78,28 @@
#include <validators/schema/TraverseSchema.hpp>
#include <util/PlatformUtils.hpp>
#include <util/XMLDeleterFor.hpp>
+#include <validators/datatype/DatatypeValidatorFactory.hpp>
// ---------------------------------------------------------------------------
// Local const data
// ---------------------------------------------------------------------------
+const XMLCh fgValueZero[] =
+{
+ chDigit_0, chNull
+};
+
const XMLCh fgValueOne[] =
{
chDigit_1, chNull
};
+const XMLCh fgUnbounded[] =
+{
+ chLatin_u, chLatin_n, chLatin_b, chLatin_o, chLatin_u, chLatin_n, chLatin_d,
+ chLatin_e, chLatin_d, chNull
+};
+
// ---------------------------------------------------------------------------
// Static member data initialization
// ---------------------------------------------------------------------------
@@ -128,6 +143,7 @@
// ---------------------------------------------------------------------------
GeneralAttributeCheck::GeneralAttributeCheck()
: fAttributes(0)
+ , fValidators(0)
, fElementMap(0)
{
try {
@@ -155,7 +171,7 @@
fAttributes[Att_Abstract_D] =
new AttributeInfo(SchemaSymbols::fgATT_ABSTRACT, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_FALSE, 0);
+ SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
fAttributes[Att_Attribute_FD_D] =
new AttributeInfo(SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT, Att_Optional_Default,
@@ -187,7 +203,7 @@
fAttributes[Att_Element_FD_D] =
new AttributeInfo(SchemaSymbols::fgATT_ELEMENTFORMDEFAULT, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_UNQUALIFIED, 0);
+ SchemaSymbols::fgATTVAL_UNQUALIFIED, DT_Form);
fAttributes[Att_Final_N] =
new AttributeInfo(SchemaSymbols::fgATT_FINAL, Att_Optional_NoDefault,
@@ -207,11 +223,11 @@
fAttributes[Att_Fixed_D] =
new AttributeInfo(SchemaSymbols::fgATT_FIXED, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_FALSE, 0);
+ SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
fAttributes[Att_Form_N] =
new AttributeInfo(SchemaSymbols::fgATT_FORM, Att_Optional_NoDefault,
- 0, 0);
+ 0, DT_Form);
fAttributes[Att_ID_N] =
new AttributeInfo(SchemaSymbols::fgATT_ID, Att_Optional_NoDefault,
@@ -223,31 +239,31 @@
fAttributes[Att_MaxOccurs_D] =
new AttributeInfo(SchemaSymbols::fgATT_MAXOCCURS, Att_Optional_Default,
- fgValueOne, 0);
+ fgValueOne, DT_MaxOccurs);
fAttributes[Att_MaxOccurs1_D] =
new AttributeInfo(SchemaSymbols::fgATT_MAXOCCURS, Att_Optional_Default,
- fgValueOne, 0);
+ fgValueOne, DT_MaxOccurs1);
fAttributes[Att_Member_T_N] =
new AttributeInfo(SchemaSymbols::fgATT_MEMBERTYPES, Att_Optional_NoDefault,
- 0, 0);
+ 0, DT_MemberTypes);
fAttributes[Att_MinOccurs_D] =
new AttributeInfo(SchemaSymbols::fgATT_MINOCCURS, Att_Optional_Default,
- fgValueOne, 0);
+ fgValueOne, DT_NonNegInt);
fAttributes[Att_MinOccurs1_D] =
new AttributeInfo(SchemaSymbols::fgATT_MINOCCURS, Att_Optional_Default,
- fgValueOne, 0);
+ fgValueOne, DT_MinOccurs1);
fAttributes[Att_Mixed_D] =
new AttributeInfo(SchemaSymbols::fgATT_MIXED, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_FALSE, 0);
+ SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
fAttributes[Att_Mixed_N] =
new AttributeInfo(SchemaSymbols::fgATT_MIXED, Att_Optional_NoDefault,
- 0, 0);
+ 0, DT_Boolean);
fAttributes[Att_Name_R] =
new AttributeInfo(SchemaSymbols::fgATT_NAME, Att_Required,
@@ -255,7 +271,7 @@
fAttributes[Att_Namespace_D] =
new AttributeInfo(SchemaSymbols::fgATT_NAMESPACE, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_TWOPOUNDANY, 0);
+ SchemaSymbols::fgATTVAL_TWOPOUNDANY, DT_Namespace);
fAttributes[Att_Namespace_N] =
new AttributeInfo(SchemaSymbols::fgATT_NAMESPACE, Att_Optional_NoDefault,
@@ -263,15 +279,15 @@
fAttributes[Att_Nillable_D] =
new AttributeInfo(SchemaSymbols::fgATT_NILLABLE, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_FALSE, 0);
+ SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
fAttributes[Att_Process_C_D] =
new AttributeInfo(SchemaSymbols::fgATT_PROCESSCONTENTS, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_STRICT, 0);
+ SchemaSymbols::fgATTVAL_STRICT, DT_ProcessContents);
fAttributes[Att_Public_R] =
new AttributeInfo(SchemaSymbols::fgATT_PUBLIC, Att_Required,
- 0, 0);
+ 0, DT_Public);
fAttributes[Att_Ref_R] =
new AttributeInfo(SchemaSymbols::fgATT_REF, Att_Required,
@@ -311,11 +327,11 @@
fAttributes[Att_Use_D] =
new AttributeInfo(SchemaSymbols::fgATT_USE, Att_Optional_Default,
- SchemaSymbols::fgATTVAL_OPTIONAL, 0);
+ SchemaSymbols::fgATTVAL_OPTIONAL, DT_Use);
fAttributes[Att_Value_NNI_N] =
new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
- 0, 0);
+ 0, DT_NonNegInt);
fAttributes[Att_Value_STR_N] =
new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
@@ -323,13 +339,30 @@
fAttributes[Att_Value_WS_N] =
new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
- 0, 0);
+ 0, DT_WhiteSpace);
fAttributes[Att_Version_N] =
new AttributeInfo(SchemaSymbols::fgATT_VERSION, Att_Optional_NoDefault,
0, 0);
}
+void GeneralAttributeCheck::setUpValidators() {
+
+ fValidators = new DatatypeValidator*[DT_Count];
+
+ for (int i=0; i< DT_Count; i++) {
+ fValidators[i] = 0;
+ }
+
+ DatatypeValidatorFactory dvFactory;
+
+ dvFactory.expandRegistryToFullSchemaSet();
+ fValidators[DT_NonNegInt] =
+ dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
+
+ // TO DO - add remaining valdiators
+}
+
void GeneralAttributeCheck::mapElements() {
if (fElementMap) {
@@ -337,6 +370,7 @@
}
setUpAttributes();
+ setUpValidators();
RefVectorOf<AttributeInfo>* attList = 0;
int prefixContext = globalPrefix;
@@ -652,6 +686,7 @@
}
delete [] fAttributes;
+ delete [] fValidators;
delete fElementMap;
}
@@ -725,11 +760,15 @@
XMLCh* attName = attInfo->getName();
DOMString attValue = elem.getAttribute(attName);
+ unsigned int attValueLen = attValue.length();
attNameList.put((void*) attName, 0);
- if (attValue.length() > 0) {
- // validate value
+ if (attValueLen > 0) {
+
+ fBuffer.set(attValue.rawBuffer(), attValueLen);
+ validate(attName, fBuffer.getRawBuffer(),
+ attInfo->getValidatorIndex(), schema);
}
else {
if (attInfo->getDefaultOption() == Att_Required) {
@@ -772,6 +811,87 @@
XMLErrs::AttributeDisallowed, fBuffer.getRawBuffer(), elemName);//"Attribute '{0}' cannot appear in '{1}'"
}
}
+}
+
+
+void GeneralAttributeCheck::validate(const XMLCh* const attName,
+ const XMLCh* const attValue,
+ const short dvIndex,
+ TraverseSchema* const schema)
+{
+ bool isInvalid = false;
+ DatatypeValidator* dv = 0;
+
+ switch (dvIndex) {
+ case DT_Form:
+ if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_QUALIFIED) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_UNQUALIFIED) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_MaxOccurs:
+ // maxOccurs = (nonNegativeInteger | unbounded)
+ if (XMLString::compareString(attValue, fgUnbounded) != 0) {
+ dv = fValidators[DT_NonNegInt];
+ }
+ break;
+ case DT_MaxOccurs1:
+ if (XMLString::compareString(attValue, fgValueOne) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_MinOccurs1:
+ if (XMLString::compareString(attValue, fgValueZero) != 0
+ && XMLString::compareString(attValue, fgValueOne) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_ProcessContents:
+ if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_SKIP) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_LAX) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_STRICT) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_Use:
+ if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_OPTIONAL) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_PROHIBITED) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_REQUIRED) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_WhiteSpace:
+ if (XMLString::compareString(attValue, SchemaSymbols::fgWS_PRESERVE) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgWS_REPLACE) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgWS_COLLAPSE) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_Boolean:
+ if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_TRUE) != 0
+ && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_FALSE) != 0) {
+ isInvalid = true;
+ }
+ break;
+ case DT_NonNegInt:
+ dv = fValidators[DT_NonNegInt];
+ break;
+ }
+
+ if (dv) {
+ try {
+ dv->validate(attValue);
+ }
+ catch(...) {
+ isInvalid = true;
+ }
+ }
+
+ if (isInvalid) {
+ schema->reportSchemaError(XMLUni::fgXMLErrDomain,
+ XMLErrs::InvalidAttValue,
+ attValue, attName);
+ }
}
/**
1.2 +25 -3 xml-xerces/c/src/validators/schema/GeneralAttributeCheck.hpp
Index: GeneralAttributeCheck.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/schema/GeneralAttributeCheck.hpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- GeneralAttributeCheck.hpp 2001/05/15 21:59:32 1.1
+++ GeneralAttributeCheck.hpp 2001/05/17 18:11:16 1.2
@@ -55,7 +55,7 @@
*/
/*
- * $Id: GeneralAttributeCheck.hpp,v 1.1 2001/05/15 21:59:32 knoaman Exp $
+ * $Id: GeneralAttributeCheck.hpp,v 1.2 2001/05/17 18:11:16 knoaman Exp $
*/
#if !defined(GENERALATTRIBUTECHECK_HPP)
@@ -80,6 +80,7 @@
// Forward declaration
// ---------------------------------------------------------------------------
class TraverseSchema;
+class DatatypeValidator;
class AttributeInfo {
public:
@@ -145,7 +146,7 @@
// -----------------------------------------------------------------------
void checkAttributes(const DOM_Element& elem,
const unsigned short elemContext,
- TraverseSchema* const scanner);
+ TraverseSchema* const schema);
private:
// -----------------------------------------------------------------------
@@ -163,6 +164,7 @@
// Setup methods
// -----------------------------------------------------------------------
void setUpAttributes();
+ void setUpValidators();
void mapElements();
// -----------------------------------------------------------------------
@@ -171,6 +173,12 @@
void cleanUp();
// -----------------------------------------------------------------------
+ // Validation methods
+ // -----------------------------------------------------------------------
+ void validate(const XMLCh* const attName, const XMLCh* const attValue,
+ const short dvIndex, TraverseSchema* const schema);
+
+ // -----------------------------------------------------------------------
// Private Constants
// -----------------------------------------------------------------------
// attributes
@@ -240,7 +248,20 @@
DT_ProcessContents = -11,
DT_Public = -12,
DT_Use = -13,
- DT_WhiteSpace = -14
+ DT_WhiteSpace = -14,
+ DT_Boolean = -15
+ };
+
+ // datatype validators
+ enum {
+ DT_AnyURI,
+ DT_ID,
+ DT_NonNegInt,
+ DT_QName,
+ DT_Token,
+
+ // add XPath
+ DT_Count
};
// element context prefixes
@@ -261,6 +282,7 @@
// Private data members
// -----------------------------------------------------------------------
AttributeInfo** fAttributes;
+ DatatypeValidator** fValidators;
RefHash2KeysTableOf<RefVectorOfAttributeInfo>* fElementMap;
XMLBuffer fBuffer;
static GeneralAttributeCheck* fInstance;
1.7 +78 -37 xml-xerces/c/src/validators/schema/TraverseSchema.cpp
Index: TraverseSchema.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/schema/TraverseSchema.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- TraverseSchema.cpp 2001/05/15 21:59:39 1.6
+++ TraverseSchema.cpp 2001/05/17 18:11:18 1.7
@@ -56,6 +56,9 @@
/*
* $Log: TraverseSchema.cpp,v $
+ * Revision 1.7 2001/05/17 18:11:18 knoaman
+ * More constraint and attribute checking.
+ *
* Revision 1.6 2001/05/15 21:59:39 knoaman
* TraverseSchema: add attribute checking + some fixes + more error messages.
* More attribute cheking to come.
@@ -876,8 +879,6 @@
: GeneralAttributeCheck::LocalContext;
fAttributeCheck->checkAttributes(elem, scope, this);
-// fCurrentTypeNameStack->push(XMLString::replicate(name));
-
// ------------------------------------------------------------------
// Check if the type has already been registered
// ------------------------------------------------------------------
@@ -982,13 +983,13 @@
if (XMLString::stringLen(lBlock) != 0
&& XMLString::compareString(lBlock,SchemaSymbols::fgATTVAL_POUNDALL) != 0
- && ((blockSet & finalBlockValid) == 0)) {
+ && blockSet != finalBlockValid) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeBlockValue, lBlock);
}
if (XMLString::stringLen(lFinal) != 0
&& XMLString::compareString(lFinal,SchemaSymbols::fgATTVAL_POUNDALL) != 0
- && ((finalSet & finalBlockValid) == 0)) {
+ && finalSet != finalBlockValid) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeFinalValue, lFinal);
}
@@ -1078,9 +1079,6 @@
anyOtherType = ContentSpecNode::Any_Other_Skip;
anyLocalType = ContentSpecNode::Any_Local_Skip;
}
- else {
- reportSchemaError(0, 0, processContents); //"Invalid 'processContents' value: '{0}'
- }
}
// ------------------------------------------------------------------
@@ -1657,14 +1655,17 @@
}
// Create element decl
+ bool isDuplicate = false;
SchemaElementDecl* elemDecl =
- createSchemaElementDecl(elem, topLevel, contentSpecType);
+ createSchemaElementDecl(elem, topLevel, contentSpecType, isDuplicate);
if (elemDecl == 0) {
return 0;
}
- fSchemaGrammar->putElemDecl(elemDecl);
+ if (!isDuplicate) {
+ fSchemaGrammar->putElemDecl(elemDecl);
+ }
// Resolve the type for the element
DOM_Element content = checkContent(elem, XUtil::getFirstChildElement(elem), true);
@@ -1682,14 +1683,13 @@
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::AnonComplexTypeWithName, name);
}
else {
-
typeInfo = checkForComplexTypeInfo(content);
}
if (typeInfo == 0) {
noErrorFound = false;
}
- else {
+ else if (!isDuplicate) {
typeInfo->setElementId(elemDecl->getId());
}
@@ -1780,7 +1780,10 @@
fBuffer.set(uri);
fBuffer.append(chColon);
fBuffer.append(localPart);
- elemDecl->setSubstitutionGroupName(fBuffer.getRawBuffer());
+
+ if (!isDuplicate) {
+ elemDecl->setSubstitutionGroupName(fBuffer.getRawBuffer());
+ }
}
else {
noErrorFound = false;
@@ -1836,10 +1839,12 @@
catch(...) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DatatypeValidationFailure, deflt);
}
+
- if(typeInfo != 0 &&
- (typeInfo->getContentType() != SchemaElementDecl::Mixed &&
- typeInfo->getContentType() != SchemaElementDecl::Simple)) {
+ if(typeInfo != 0 &&
+ typeInfo->getContentType() != SchemaElementDecl::Simple &&
+ (typeInfo->getContentType() != SchemaElementDecl::Mixed ||
+ (contentSpecNode != 0 && contentSpecNode->getType() != ContentSpecNode::Leaf))) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NotSimpleOrMixedElement, name);
}
}
@@ -1848,15 +1853,28 @@
// TO DO
+
+ // set element information, but first check for duplicate elements with
+ // different types.
+ if (isDuplicate) {
+
+ DatatypeValidator* eltDV = elemDecl->getDatatypeValidator();
+ ComplexTypeInfo* eltTypeInfo = elemDecl->getComplexTypeInfo();
+
+ if ( (eltTypeInfo != typeInfo) || (eltDV != validator) ) {
+ reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
+ }
+ }
+ else {
- // set element information
- elemDecl->setDatatypeValidator(validator);
- elemDecl->setComplexTypeInfo(typeInfo);
- elemDecl->setDefaultValue(deflt);
- elemDecl->setDefinedScope(scopeDefined);
- elemDecl->setModelType(contentSpecType);
- elemDecl->setContentSpec(contentSpecNode);
- elemDecl->setTypeFromAnotherSchemaURI(anotherSchemaURI);
+ elemDecl->setDatatypeValidator(validator);
+ elemDecl->setComplexTypeInfo(typeInfo);
+ elemDecl->setDefaultValue(deflt);
+ elemDecl->setDefinedScope(scopeDefined);
+ elemDecl->setModelType(contentSpecType);
+ elemDecl->setContentSpec(contentSpecNode);
+ elemDecl->setTypeFromAnotherSchemaURI(anotherSchemaURI);
+ }
return new QName(elemDecl->getElementName());
}
@@ -2021,7 +2039,7 @@
if (content.getNodeType() == DOM_Node::ELEMENT_NODE) {
- fAttributeCheck->checkAttributes(contentElem, scope, this);
+ fAttributeCheck->checkAttributes(content, scope, this);
facetName = content.getLocalName();
fBuffer.set(facetName.rawBuffer(), facetName.length());
@@ -2725,7 +2743,8 @@
// First, handle any ANNOTATION declaration
// ------------------------------------------------------------------
if (checkContent(elem, XUtil::getFirstChildElement(elem), true) != 0) {
-// reportSchemaError("anyAttribute elements can contain at most one 'annotation' element in their children");
+ reportSchemaError(XMLUni::fgXMLErrDomain,
+ XMLErrs::AnyAttributeContentError);
}
// ------------------------------------------------------------------
@@ -2753,9 +2772,6 @@
SchemaSymbols::fgATTVAL_LAX) == 0) {
attDefType = XMLAttDef::ProcessContents_Lax;
}
- else {
-// reportSchemaError(0, 0, processContents); //"Invalid 'processContents' value: '{0}'
- }
// ------------------------------------------------------------------
// Process 'namespace' attribute
@@ -3496,7 +3512,8 @@
elemDecl = getElementDeclFromNS(nameURI, localPart);
}
else {
- elemDecl = (SchemaElementDecl*)
+
+ elemDecl = (SchemaElementDecl*)
fSchemaGrammar->getElemDecl(fTargetNSURI, localPart,
0, Grammar::TOP_LEVEL_SCOPE);
@@ -3647,7 +3664,8 @@
SchemaElementDecl*
TraverseSchema::createSchemaElementDecl(const DOM_Element& elem,
const bool topLevel,
- const unsigned short elemType)
+ const unsigned short elemType,
+ bool& isDuplicate)
{
const XMLCh* name = getElementAttValue(elem, SchemaSymbols::fgATT_NAME);
const XMLCh* elemForm = getElementAttValue(elem, SchemaSymbols::fgATT_FORM);
@@ -3667,13 +3685,14 @@
}
// Check for duplicate elements
- const SchemaElementDecl* other = (SchemaElementDecl*)
+ SchemaElementDecl* other = (SchemaElementDecl*)
fSchemaGrammar->getElemDecl(uriIndex, name, 0, enclosingScope);
if (other != 0) {
- reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
- return 0;
+ //reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
+ isDuplicate = true;
+ return other;
}
const XMLCh* block = getElementAttValue(elem,SchemaSymbols::fgATT_BLOCK);
@@ -3686,13 +3705,13 @@
if (XMLString::stringLen(block) != 0
&& XMLString::compareString(block,SchemaSymbols::fgATTVAL_POUNDALL) != 0
- && ((blockSet & blockValid) == 0)) {
+ && blockSet != blockValid) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementBlockValue, block);
}
if (XMLString::stringLen(final) != 0
&& XMLString::compareString(final,SchemaSymbols::fgATTVAL_POUNDALL) != 0
- && ((finalSet & finalValid) == 0)) {
+ && finalSet != finalValid) {
reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementFinalValue, final);
}
@@ -3705,7 +3724,7 @@
elementMiscFlags += SchemaSymbols::NILLABLE;
}
else if (XMLString::compareString(nillable, SchemaSymbols::fgATTVAL_FALSE) != 0) {
- reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementNillableValue, nillable);
+// reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue, nillable, SchemaSymbols::fgATT_NILLABLE);
}
}
@@ -3715,7 +3734,7 @@
elementMiscFlags += SchemaSymbols::ABSTRACT;
}
else if (XMLString::compareString(abstract, SchemaSymbols::fgATTVAL_FALSE) != 0) {
- reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementAbstractValue, abstract);
+// reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue, abstract, SchemaSymbols::fgATT_ABSTRACT);
}
}
@@ -3878,6 +3897,27 @@
if (minOccurs == 0 && maxOccurs == 0 && !isMaxUnbounded) {
return 0;
+ }
+
+ // Constraint checking for min/max value
+ if (!isMaxUnbounded) {
+
+ XMLCh tmpMinStr[128];
+ XMLCh tmpMaxStr[128];
+
+ XMLString::binToText(minOccurs, tmpMinStr, 255, 10);
+ XMLString::binToText(maxOccurs, tmpMaxStr, 255, 10);
+
+ if (maxOccurs < 1) {
+ reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue,
+ tmpMaxStr, SchemaSymbols::fgATT_MAXOCCURS);
+ }
+ else if (maxOccurs < minOccurs) {
+
+ fBuffer.set(nOccurs.rawBuffer(), nOccurs.length());
+ reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidMin2MaxOccurs,
+ tmpMinStr, tmpMaxStr);
+ }
}
ContentSpecNode* saveNode = specNode;
1.6 +3 -2 xml-xerces/c/src/validators/schema/TraverseSchema.hpp
Index: TraverseSchema.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/schema/TraverseSchema.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TraverseSchema.hpp 2001/05/15 21:59:42 1.5
+++ TraverseSchema.hpp 2001/05/17 18:11:19 1.6
@@ -55,7 +55,7 @@
*/
/*
- * $Id: TraverseSchema.hpp,v 1.5 2001/05/15 21:59:42 knoaman Exp $
+ * $Id: TraverseSchema.hpp,v 1.6 2001/05/17 18:11:19 knoaman Exp $
*/
#if !defined(TRAVERSESCHEMA_HPP)
@@ -383,7 +383,8 @@
*/
SchemaElementDecl* createSchemaElementDecl(const DOM_Element& elem,
const bool topLevel,
- const unsigned short elemType);
+ const unsigned short elemType,
+ bool& isDuplicate);
/**
* Return the value of a given attribute name from an element node
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org