blob: 22ea3ce4c741ad44171ee27836d28deb24ffac2a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <xercesc/validators/schema/GeneralAttributeCheck.hpp>
#include <xercesc/validators/schema/SchemaSymbols.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/Janitor.hpp>
#include <xercesc/dom/DOMNamedNodeMap.hpp>
#include <xercesc/framework/XMLErrorCodes.hpp>
#include <xercesc/validators/schema/TraverseSchema.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLRegisterCleanup.hpp>
#include <xercesc/util/XMLInitializer.hpp>
#include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
XERCES_CPP_NAMESPACE_BEGIN
// ---------------------------------------------------------------------------
// Local const data
// ---------------------------------------------------------------------------
static const XMLCh fgValueZero[] =
{
chDigit_0, chNull
};
static const XMLCh fgValueOne[] =
{
chDigit_1, chNull
};
static const XMLCh fgUnbounded[] =
{
chLatin_u, chLatin_n, chLatin_b, chLatin_o, chLatin_u, chLatin_n, chLatin_d,
chLatin_e, chLatin_d, chNull
};
static const XMLCh fgLocal[] =
{
chLatin_l, chLatin_o, chLatin_c, chLatin_a, chLatin_l, chNull
};
static const XMLCh fgGlobal[] =
{
chLatin_g, chLatin_l, chLatin_o, chLatin_b, chLatin_a, chLatin_l, chNull
};
// ---------------------------------------------------------------------------
// Static local data
// ---------------------------------------------------------------------------
static bool sGeneralAttCheckMutexRegistered = false;
static XMLMutex* sGeneralAttCheckMutex = 0;
static XMLRegisterCleanup sGeneralAttCheckCleanup;
// ---------------------------------------------------------------------------
// Static member data initialization
// ---------------------------------------------------------------------------
ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fAttMap = 0;
ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fFacetsMap = 0;
DatatypeValidator* GeneralAttributeCheck::fNonNegIntDV = 0;
DatatypeValidator* GeneralAttributeCheck::fBooleanDV = 0;
DatatypeValidator* GeneralAttributeCheck::fAnyURIDV = 0;
void XMLInitializer::initializeGeneralAttrCheckMap()
{
GeneralAttributeCheck *obj = new GeneralAttributeCheck();
delete obj;
}
// ---------------------------------------------------------------------------
// GeneralAttributeCheck: Constructors and Destructor
// ---------------------------------------------------------------------------
GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager)
: fMemoryManager(manager)
, fValidationContext(0)
, fIDValidator(manager)
{
mapElements();
}
GeneralAttributeCheck::~GeneralAttributeCheck()
{
}
// ---------------------------------------------------------------------------
// GeneralAttributeCheck: Setup methods
// ---------------------------------------------------------------------------
void GeneralAttributeCheck::setUpValidators() {
DatatypeValidatorFactory dvFactory(fMemoryManager);
dvFactory.expandRegistryToFullSchemaSet();
fNonNegIntDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
fBooleanDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_BOOLEAN);
fAnyURIDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_ANYURI);
// TO DO - add remaining valdiators
}
void GeneralAttributeCheck::mapElements()
{
if (!sGeneralAttCheckMutexRegistered)
{
if (!sGeneralAttCheckMutex)
{
XMLMutexLock lock(XMLPlatformUtils::fgAtomicMutex);
if (!sGeneralAttCheckMutex)
sGeneralAttCheckMutex = new XMLMutex(XMLPlatformUtils::fgMemoryManager);
}
// Use a faux scope to synchronize while we do this
{
XMLMutexLock lock(sGeneralAttCheckMutex);
// If we got here first, then register it and set the registered flag
if (!sGeneralAttCheckMutexRegistered)
{
// initialize
setUpValidators();
mapAttributes();
// register for cleanup at Termination.
sGeneralAttCheckCleanup.registerCleanup(GeneralAttributeCheck::reinitGeneralAttCheck);
sGeneralAttCheckMutexRegistered = true;
}
}
}
}
void GeneralAttributeCheck::mapAttributes() {
fAttMap = new ValueHashTableOf<unsigned short>(A_Count);
fAttMap->put((void*)SchemaSymbols::fgATT_ABSTRACT, A_Abstract);
fAttMap->put((void*)SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT, A_AttributeFormDefault);
fAttMap->put((void*)SchemaSymbols::fgATT_BASE, A_Base);
fAttMap->put((void*)SchemaSymbols::fgATT_BLOCK, A_Block);
fAttMap->put((void*)SchemaSymbols::fgATT_BLOCKDEFAULT, A_BlockDefault);
fAttMap->put((void*)SchemaSymbols::fgATT_DEFAULT, A_Default);
fAttMap->put((void*)SchemaSymbols::fgATT_ELEMENTFORMDEFAULT, A_ElementFormDefault);
fAttMap->put((void*)SchemaSymbols::fgATT_FINAL, A_Final);
fAttMap->put((void*)SchemaSymbols::fgATT_FINALDEFAULT, A_FinalDefault);
fAttMap->put((void*)SchemaSymbols::fgATT_FIXED, A_Fixed);
fAttMap->put((void*)SchemaSymbols::fgATT_FORM, A_Form);
fAttMap->put((void*)SchemaSymbols::fgATT_ID, A_ID);
fAttMap->put((void*)SchemaSymbols::fgATT_ITEMTYPE, A_ItemType);
fAttMap->put((void*)SchemaSymbols::fgATT_MAXOCCURS, A_MaxOccurs);
fAttMap->put((void*)SchemaSymbols::fgATT_MEMBERTYPES, A_MemberTypes);
fAttMap->put((void*)SchemaSymbols::fgATT_MINOCCURS, A_MinOccurs);
fAttMap->put((void*)SchemaSymbols::fgATT_MIXED, A_Mixed);
fAttMap->put((void*)SchemaSymbols::fgATT_NAME, A_Name);
fAttMap->put((void*)SchemaSymbols::fgATT_NAMESPACE, A_Namespace);
fAttMap->put((void*)SchemaSymbols::fgATT_NILLABLE, A_Nillable);
fAttMap->put((void*)SchemaSymbols::fgATT_PROCESSCONTENTS, A_ProcessContents);
fAttMap->put((void*)SchemaSymbols::fgATT_PUBLIC, A_Public);
fAttMap->put((void*)SchemaSymbols::fgATT_REF, A_Ref);
fAttMap->put((void*)SchemaSymbols::fgATT_REFER, A_Refer);
fAttMap->put((void*)SchemaSymbols::fgATT_SCHEMALOCATION, A_SchemaLocation);
fAttMap->put((void*)SchemaSymbols::fgATT_SOURCE, A_Source);
fAttMap->put((void*)SchemaSymbols::fgATT_SUBSTITUTIONGROUP, A_SubstitutionGroup);
fAttMap->put((void*)SchemaSymbols::fgATT_SYSTEM, A_System);
fAttMap->put((void*)SchemaSymbols::fgATT_TARGETNAMESPACE, A_TargetNamespace);
fAttMap->put((void*)SchemaSymbols::fgATT_TYPE, A_Type);
fAttMap->put((void*)SchemaSymbols::fgATT_USE, A_Use);
fAttMap->put((void*)SchemaSymbols::fgATT_VALUE, A_Value);
fAttMap->put((void*)SchemaSymbols::fgATT_VERSION, A_Version);
fAttMap->put((void*)SchemaSymbols::fgATT_XPATH, A_XPath);
fFacetsMap = new ValueHashTableOf<unsigned short>(13);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MINEXCLUSIVE, E_MinExclusive);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MININCLUSIVE, E_MinInclusive);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXEXCLUSIVE, E_MaxExclusive);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE, E_MaxInclusive);
fFacetsMap->put((void*) SchemaSymbols::fgELT_TOTALDIGITS, E_TotalDigits);
fFacetsMap->put((void*) SchemaSymbols::fgELT_FRACTIONDIGITS, E_FractionDigits);
fFacetsMap->put((void*) SchemaSymbols::fgELT_LENGTH, E_Length);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MINLENGTH, E_MinLength);
fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXLENGTH, E_MaxLength);
fFacetsMap->put((void*) SchemaSymbols::fgELT_ENUMERATION, E_Enumeration);
fFacetsMap->put((void*) SchemaSymbols::fgELT_WHITESPACE, E_WhiteSpace);
fFacetsMap->put((void*) SchemaSymbols::fgELT_PATTERN, E_Pattern);
}
// -----------------------------------------------------------------------
// Notification that lazy data has been deleted
// -----------------------------------------------------------------------
void
GeneralAttributeCheck::reinitGeneralAttCheck() {
delete sGeneralAttCheckMutex;
sGeneralAttCheckMutex = 0;
sGeneralAttCheckMutexRegistered = false;
delete fAttMap;
delete fFacetsMap;
fAttMap = fFacetsMap = 0;
fNonNegIntDV = fBooleanDV = fAnyURIDV = 0;
}
// ---------------------------------------------------------------------------
// GeneralAttributeCheck: Validation methods
// ---------------------------------------------------------------------------
void
GeneralAttributeCheck::checkAttributes(const DOMElement* const elem,
const unsigned short elemContext,
TraverseSchema* const schema,
const bool isTopLevel,
ValueVectorOf<DOMNode*>* const nonXSAttList)
{
if (nonXSAttList)
nonXSAttList->removeAllElements();
if (elem == 0 || !fAttMap || elemContext>=E_Count)
return;
const XMLCh* elemName = elem->getLocalName();
if (!XMLString::equals(SchemaSymbols::fgURI_SCHEMAFORSCHEMA, elem->getNamespaceURI())) {
schema->reportSchemaError
(
elem
, XMLUni::fgXMLErrDomain
, XMLErrs::ELTSchemaNS
, elemName
);
}
const XMLCh* contextStr = (isTopLevel) ? fgGlobal : fgLocal;
DOMNamedNodeMap* eltAttrs = elem->getAttributes();
int attrCount = eltAttrs->getLength();
XMLByte attList[A_Count];
memset(attList, 0, sizeof(attList));
for (int i = 0; i < attrCount; i++) {
DOMNode* attribute = eltAttrs->item(i);
const XMLCh* attName = attribute->getNodeName();
// skip namespace declarations
if (XMLString::equals(attName, XMLUni::fgXMLNSString)
|| XMLString::startsWith(attName, XMLUni::fgXMLNSColonString))
continue;
// Bypass attributes that start with xml
// add this to the list of "non-schema" attributes
if ((*attName == chLatin_X || *attName == chLatin_x)
&& (*(attName+1) == chLatin_M || *(attName+1) == chLatin_m)
&& (*(attName+2) == chLatin_L || *(attName+2) == chLatin_l)) {
if (nonXSAttList)
nonXSAttList->addElement(attribute);
continue;
}
// for attributes with namespace prefix
const XMLCh* attrURI = attribute->getNamespaceURI();
if (attrURI != 0 && *attrURI) {
// attributes with schema namespace are not allowed
// and not allowed on "documentation" and "appInfo"
if (XMLString::equals(attrURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) ||
XMLString::equals(elemName, SchemaSymbols::fgELT_APPINFO) ||
XMLString::equals(elemName, SchemaSymbols::fgELT_DOCUMENTATION)) {
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
}
else if (nonXSAttList)
{
nonXSAttList->addElement(attribute);
}
continue;
}
int attNameId = A_Invalid;
attName = attribute->getLocalName();
bool bContinue=false; // workaround for Borland bug with 'continue' in 'catch'
try {
attNameId= fAttMap->get(attName, fMemoryManager);
}
catch(const OutOfMemoryException&)
{
throw;
}
catch(...) {
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
bContinue=true;
}
if(bContinue)
continue;
if (fgElemAttTable[elemContext][attNameId] & Att_Mask) {
attList[attNameId] = 1;
validate
(
elem
, attName
, attribute->getNodeValue()
, fgElemAttTable[elemContext][attNameId] & DV_Mask
, schema
);
}
else {
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
XMLErrs::AttributeDisallowed, attName, contextStr, elemName);
}
}
// ------------------------------------------------------------------
// Check for required attributes
// ------------------------------------------------------------------
for (unsigned int j=0; j < A_Count; j++) {
if ((fgElemAttTable[elemContext][j] & Att_Required) && attList[j] == 0) {
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::AttributeRequired,
fAttNames[j], contextStr, elemName);
}
}
}
void GeneralAttributeCheck::validate(const DOMElement* const elem,
const XMLCh* const attName,
const XMLCh* const attValue,
const short dvIndex,
TraverseSchema* const schema)
{
bool isInvalid = false;
DatatypeValidator* dv = 0;
fValidationContext = schema->fSchemaInfo->getValidationContext();
switch (dvIndex) {
case DV_Form:
if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_QUALIFIED)
&& !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_UNQUALIFIED)) {
isInvalid = true;
}
break;
case DV_MaxOccurs:
// maxOccurs = (nonNegativeInteger | unbounded)
if (!XMLString::equals(attValue, fgUnbounded)) {
dv = fNonNegIntDV;
}
break;
case DV_MaxOccurs1:
if (!XMLString::equals(attValue, fgValueOne)) {
isInvalid = true;
}
break;
case DV_MinOccurs1:
if (!XMLString::equals(attValue, fgValueZero)
&& !XMLString::equals(attValue, fgValueOne)) {
isInvalid = true;
}
break;
case DV_ProcessContents:
if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_SKIP)
&& !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_LAX)
&& !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_STRICT)) {
isInvalid = true;
}
break;
case DV_Use:
if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_OPTIONAL)
&& !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_PROHIBITED)
&& !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_REQUIRED)) {
isInvalid = true;
}
break;
case DV_WhiteSpace:
if (!XMLString::equals(attValue, SchemaSymbols::fgWS_PRESERVE)
&& !XMLString::equals(attValue, SchemaSymbols::fgWS_REPLACE)
&& !XMLString::equals(attValue, SchemaSymbols::fgWS_COLLAPSE)) {
isInvalid = true;
}
break;
case DV_Boolean:
dv = fBooleanDV;
break;
case DV_NonNegInt:
dv = fNonNegIntDV;
break;
case DV_AnyURI:
dv = fAnyURIDV;
break;
case DV_ID:
if (fValidationContext)
{
dv = &fIDValidator;
}
break;
}
if (dv) {
try {
dv->validate(attValue, fValidationContext, fMemoryManager);
}
catch(const XMLException& excep) {
schema->reportSchemaError(elem, excep);
}
catch(const OutOfMemoryException&)
{
throw;
}
catch(...) {
isInvalid = true;
}
}
if (isInvalid) {
schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue,
attValue, attName);
}
}
// ---------------------------------------------------------------------------
// Conditional methods for building the table
// ---------------------------------------------------------------------------
//
// This code will set up the character flags table. Its defined out since
// this table is now written out and hard coded (at the bottom of this
// file) into the code itself. This code is retained in case there is
// any need to recreate it later.
//
#if defined(NEED_TO_GEN_ELEM_ATT_MAP_TABLE)
#include <stdio.h>
void GeneralAttributeCheck::initCharFlagTable()
{
unsigned short attList[E_Count][A_Count];
for (unsigned int i=0; i < E_Count; i++) {
for (unsigned int j=0; j < A_Count; j++) {
attList[i][j] = 0;
}
}
//
// Write it out to a temp file to be read back into this source later.
//
FILE* outFl = fopen("ea_table.out", "wt+");
fprintf(outFl, "unsigned short GeneralAttributeCheck::fgElemAttTable[GeneralAttributeCheck::E_Count][GeneralAttributeCheck::A_Count] =\n{\n {");
//"all"
attList[E_All][A_ID] = Att_Optional | DV_ID;
attList[E_All][A_MaxOccurs] = Att_Optional | DV_MaxOccurs1;
attList[E_All][A_MinOccurs] = Att_Optional | DV_MinOccurs1;
// "annotation"
attList[E_Annotation][A_ID] = Att_Optional | DV_ID;
// "any"
attList[E_Any][A_ID] = Att_Optional | DV_ID;
attList[E_Any][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_Any][A_MinOccurs] = Att_Optional | DV_NonNegInt;
attList[E_Any][A_Namespace] = Att_Optional;
attList[E_Any][A_ProcessContents] = Att_Optional | DV_ProcessContents;
// "anyAttribute"
attList[E_AnyAttribute][A_ID] = Att_Optional | DV_ID;
attList[E_AnyAttribute][A_Namespace] = Att_Optional;
attList[E_AnyAttribute][A_ProcessContents] = Att_Optional | DV_ProcessContents;
// "appinfo"
attList[E_Appinfo][A_Source]= Att_Optional | DV_AnyURI;
// attribute - global"
attList[E_AttributeGlobal][A_Default] = Att_Optional;
attList[E_AttributeGlobal][A_Fixed] = Att_Optional;
attList[E_AttributeGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_AttributeGlobal][A_Name] = Att_Required;
attList[E_AttributeGlobal][A_Type] = Att_Optional;
// "attribute - local"
attList[E_AttributeLocal][A_Default] = Att_Optional;
attList[E_AttributeLocal][A_Fixed] = Att_Optional;
attList[E_AttributeLocal][A_Form]= Att_Optional | DV_Form;
attList[E_AttributeLocal][A_ID] = Att_Optional | DV_ID;
attList[E_AttributeLocal][A_Name] = Att_Required;
attList[E_AttributeLocal][A_Type] = Att_Optional;
attList[E_AttributeLocal][A_Use] = Att_Optional | DV_Use;
// "attribute - ref"
attList[E_AttributeRef][A_Default] = Att_Optional;
attList[E_AttributeRef][A_Fixed] = Att_Optional;
attList[E_AttributeRef][A_ID] = Att_Optional | DV_ID;
attList[E_AttributeRef][A_Ref]= Att_Required;
attList[E_AttributeRef][A_Use] = Att_Optional | DV_Use;
// "attributeGroup - global"
attList[E_AttributeGroupGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_AttributeGroupGlobal][A_Name] = Att_Required;
// "attributeGroup - ref"
attList[E_AttributeGroupRef][A_ID] = Att_Optional | DV_ID;
attList[E_AttributeGroupRef][A_Ref]= Att_Required;
// "choice"
attList[E_Choice][A_ID] = Att_Optional | DV_ID;
attList[E_Choice][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_Choice][A_MinOccurs] = Att_Optional | DV_NonNegInt;
// "complexContent"
attList[E_ComplexContent][A_ID] = Att_Optional | DV_ID;
attList[E_ComplexContent][A_Mixed] = Att_Optional | DV_Boolean;
// "complexType - global"
attList[E_ComplexTypeGlobal][A_Abstract] = Att_Optional | DV_Boolean;
attList[E_ComplexTypeGlobal][A_Block] = Att_Optional;
attList[E_ComplexTypeGlobal][A_Final] = Att_Optional;
attList[E_ComplexTypeGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_ComplexTypeGlobal][A_Mixed] = Att_Optional | DV_Boolean;
attList[E_ComplexTypeGlobal][A_Name] = Att_Required;
// "complexType - local"
attList[E_ComplexTypeLocal][A_ID] = Att_Optional | DV_ID;
attList[E_ComplexTypeLocal][A_Mixed] = Att_Optional | DV_Boolean;
// "documentation"
attList[E_Documentation][A_Source] = Att_Optional | DV_AnyURI;
// "element - global"
attList[E_ElementGlobal][A_Abstract] = Att_Optional | DV_Boolean;
attList[E_ElementGlobal][A_Block] = Att_Optional;
attList[E_ElementGlobal][A_Default] = Att_Optional;
attList[E_ElementGlobal][A_Final] = Att_Optional;
attList[E_ElementGlobal][A_Fixed] = Att_Optional;
attList[E_ElementGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_ElementGlobal][A_Name] = Att_Required;
attList[E_ElementGlobal][A_Nillable] = Att_Optional | DV_Boolean;
attList[E_ElementGlobal][A_SubstitutionGroup] = Att_Optional;
attList[E_ElementGlobal][A_Type] = Att_Optional;
// "element - local"
attList[E_ElementLocal][A_Block]= Att_Optional;
attList[E_ElementLocal][A_Default] = Att_Optional;
attList[E_ElementLocal][A_Fixed] = Att_Optional;
attList[E_ElementLocal][A_Form] = Att_Optional | DV_Form;
attList[E_ElementLocal][A_ID] = Att_Optional | DV_ID;
attList[E_ElementLocal][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_ElementLocal][A_MinOccurs] = Att_Optional | DV_NonNegInt;
attList[E_ElementLocal][A_Name] = Att_Required;
attList[E_ElementLocal][A_Nillable] = Att_Optional | DV_Boolean;
attList[E_ElementLocal][A_Type] = Att_Optional;
//"element - ref"
attList[E_ElementRef][A_ID] = Att_Optional | DV_ID;
attList[E_ElementRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_ElementRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
attList[E_ElementRef][A_Ref] = Att_Required;
// "enumeration"
attList[E_Enumeration][A_ID] = Att_Optional | DV_ID;
attList[E_Enumeration][A_Value] = Att_Optional;
// "extension"
attList[E_Extension][A_Base] = Att_Required;
attList[E_Extension][A_ID] = Att_Optional | DV_ID;
//"field"
attList[E_Field][A_ID] = Att_Optional | DV_ID;
attList[E_Field][A_XPath] = Att_Required;
// "fractionDigits"
attList[E_FractionDigits][A_ID] = Att_Optional | DV_ID;
attList[E_FractionDigits][A_Value] = Att_Optional | DV_NonNegInt;
attList[E_FractionDigits][A_Fixed] = Att_Optional | DV_Boolean;
// "group - global"
attList[E_GroupGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_GroupGlobal][A_Name] = Att_Required;
// "group - ref"
attList[E_GroupRef][A_ID] = Att_Optional | DV_ID;
attList[E_GroupRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_GroupRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
attList[E_GroupRef][A_Ref] = Att_Required;
// "import"
attList[E_Import][A_ID] = Att_Optional | DV_ID;
attList[E_Import][A_Namespace] = Att_Optional;
attList[E_Import][A_SchemaLocation] = Att_Optional;
// "include"
attList[E_Include][A_ID] = Att_Optional | DV_ID;
attList[E_Include][A_SchemaLocation] = Att_Required;
// "key"
attList[E_Key][A_ID] = Att_Optional | DV_ID;
attList[E_Key][A_Name] = Att_Required;
// "keyref"
attList[E_KeyRef][A_ID] = Att_Optional | DV_ID;
attList[E_KeyRef][A_Name] = Att_Required;
attList[E_KeyRef][A_Refer] = Att_Required;
// "length"
attList[E_Length][A_ID] = Att_Optional | DV_ID;
attList[E_Length][A_Value] = Att_Optional | DV_NonNegInt;
attList[E_Length][A_Fixed] = Att_Optional | DV_Boolean;
// "list"
attList[E_List][A_ID] = Att_Optional | DV_ID;
attList[E_List][A_ItemType] = Att_Optional;
// "maxExclusive"
attList[E_MaxExclusive][A_ID] = Att_Optional | DV_ID;
attList[E_MaxExclusive][A_Value] = Att_Optional;
attList[E_MaxExclusive][A_Fixed] = Att_Optional | DV_Boolean;
// "maxInclusive"
attList[E_MaxInclusive][A_ID] = Att_Optional | DV_ID;
attList[E_MaxInclusive][A_Value] = Att_Optional;
attList[E_MaxInclusive][A_Fixed] = Att_Optional | DV_Boolean;
// "maxLength"
attList[E_MaxLength][A_ID] = Att_Optional | DV_ID;
attList[E_MaxLength][A_Value] = Att_Optional | DV_NonNegInt;
attList[E_MaxLength][A_Fixed] = Att_Optional | DV_Boolean;
// "minExclusive"
attList[E_MinExclusive][A_ID] = Att_Optional | DV_ID;
attList[E_MinExclusive][A_Value] = Att_Optional;
attList[E_MinExclusive][A_Fixed] = Att_Optional | DV_Boolean;
// "minInclusive"
attList[E_MinInclusive][A_ID] = Att_Optional | DV_ID;
attList[E_MinInclusive][A_Value] = Att_Optional;
attList[E_MinInclusive][A_Fixed] = Att_Optional | DV_Boolean;
// "minLength"
attList[E_MinLength][A_ID] = Att_Optional | DV_ID;
attList[E_MinLength][A_Value] = Att_Optional | DV_NonNegInt;
attList[E_MinLength][A_Fixed] = Att_Optional | DV_Boolean;
// "notation"
attList[E_Notation][A_ID] = Att_Optional | DV_ID;
attList[E_Notation][A_Name] = Att_Required;
attList[E_Notation][A_Public] = Att_Optional;
attList[E_Notation][A_System] = Att_Optional | DV_AnyURI;
// "pattern"
attList[E_Pattern][A_ID] = Att_Optional;
attList[E_Pattern][A_Value] = Att_Optional;
// "redefine"
attList[E_Redefine][A_ID] = Att_Optional | DV_ID;
attList[E_Redefine][A_SchemaLocation] = Att_Required;
// "restriction"
attList[E_Restriction][A_Base] = Att_Optional;
attList[E_Restriction][A_ID] = Att_Optional | DV_ID;
// "schema"
attList[E_Schema][A_AttributeFormDefault] = Att_Optional | DV_Form;
attList[E_Schema][A_BlockDefault] = Att_Optional;
attList[E_Schema][A_ElementFormDefault] = Att_Optional | DV_Form;
attList[E_Schema][A_FinalDefault] = Att_Optional;
attList[E_Schema][A_ID] = Att_Optional | DV_ID;
attList[E_Schema][A_TargetNamespace] = Att_Optional;
attList[E_Schema][A_Version] = Att_Optional;
// "selector"
attList[E_Selector][A_ID] = Att_Optional | DV_ID;
attList[E_Selector][A_XPath] = Att_Required;
// "sequence"
attList[E_Sequence][A_ID] = Att_Optional | DV_ID;
attList[E_Sequence][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
attList[E_Sequence][A_MinOccurs] = Att_Optional | DV_NonNegInt;
// "simpleContent"
attList[E_SimpleContent][A_ID] = Att_Optional | DV_ID;
// "simpleType - global"
attList[E_SimpleTypeGlobal][A_Final] = Att_Optional;
attList[E_SimpleTypeGlobal][A_ID] = Att_Optional | DV_ID;
attList[E_SimpleTypeGlobal][A_Name] = Att_Required;
// "simpleType - local"
attList[E_SimpleTypeLocal][A_Final] = Att_Optional;
attList[E_SimpleTypeLocal][A_ID] = Att_Optional | DV_ID;
// "totalDigits"
attList[E_TotalDigits][A_ID] = Att_Optional | DV_ID;
attList[E_TotalDigits][A_Value] = Att_Optional | DV_NonNegInt;
attList[E_TotalDigits][A_Fixed] = Att_Optional | DV_Boolean;
// "union"
attList[E_Union][A_ID] = Att_Optional | DV_ID;
attList[E_Union][A_MemberTypes] = Att_Optional;
// "unique"
attList[E_Unique][A_ID] = Att_Optional | DV_ID;
attList[E_Unique][A_Name] = Att_Required;
// "whitespace"
attList[E_WhiteSpace][A_ID] = Att_Optional | DV_ID;
attList[E_WhiteSpace][A_Value] = Att_Optional | DV_WhiteSpace;
attList[E_WhiteSpace][A_Fixed] = Att_Optional | DV_Boolean;
for (unsigned int j=0; j < E_Count; j++) {
for (unsigned int index = 0; index < A_Count-1; index++)
{
fprintf(outFl, " %d,", attList[j][index]);
}
fprintf(outFl, " %d", attList[j][A_Count - 1]);
if (j + 1 == E_Count)
fprintf(outFl, "}\n};");
else
fprintf(outFl, "},\n {");
}
fclose(outFl);
}
#endif
unsigned short GeneralAttributeCheck::fgElemAttTable[GeneralAttributeCheck::E_Count][GeneralAttributeCheck::A_Count] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 258, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 2, 0, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 2, 0, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 66, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2050, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2050, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 18, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
{ 18, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 34, 0, 0, 0, 0, 0, 1, 0, 18, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
{ 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 66, 34, 0, 130, 0, 10, 0, 1, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 66, 0, 0, 2, 0, 66, 0, 2, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 130, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4098, 0, 0}
};
const XMLCh* GeneralAttributeCheck::fAttNames[GeneralAttributeCheck::A_Count] =
{
SchemaSymbols::fgATT_ABSTRACT,
SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT,
SchemaSymbols::fgATT_BASE,
SchemaSymbols::fgATT_BLOCK,
SchemaSymbols::fgATT_BLOCKDEFAULT,
SchemaSymbols::fgATT_DEFAULT,
SchemaSymbols::fgATT_ELEMENTFORMDEFAULT,
SchemaSymbols::fgATT_FINAL,
SchemaSymbols::fgATT_FINALDEFAULT,
SchemaSymbols::fgATT_FIXED,
SchemaSymbols::fgATT_FORM,
SchemaSymbols::fgATT_ID,
SchemaSymbols::fgATT_ITEMTYPE,
SchemaSymbols::fgATT_MAXOCCURS,
SchemaSymbols::fgATT_MEMBERTYPES,
SchemaSymbols::fgATT_MINOCCURS,
SchemaSymbols::fgATT_MIXED,
SchemaSymbols::fgATT_NAME,
SchemaSymbols::fgATT_NAMESPACE,
SchemaSymbols::fgATT_NILLABLE,
SchemaSymbols::fgATT_PROCESSCONTENTS,
SchemaSymbols::fgATT_PUBLIC,
SchemaSymbols::fgATT_REF,
SchemaSymbols::fgATT_REFER,
SchemaSymbols::fgATT_SCHEMALOCATION,
SchemaSymbols::fgATT_SOURCE,
SchemaSymbols::fgATT_SUBSTITUTIONGROUP,
SchemaSymbols::fgATT_SYSTEM,
SchemaSymbols::fgATT_TARGETNAMESPACE,
SchemaSymbols::fgATT_TYPE,
SchemaSymbols::fgATT_USE,
SchemaSymbols::fgATT_VALUE,
SchemaSymbols::fgATT_VERSION,
SchemaSymbols::fgATT_XPATH,
};
XERCES_CPP_NAMESPACE_END
/**
* End of file GeneralAttributeCheck.cpp
*/