source: icXML/icXML-devel/src/xercesc/validators/schema/GeneralAttributeCheck.cpp @ 2734

Last change on this file since 2734 was 2732, checked in by cameron, 7 years ago

icXML version of SchemaSymbols?

File size: 33.1 KB
Line 
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18// ---------------------------------------------------------------------------
19//  Includes
20// ---------------------------------------------------------------------------
21#include <xercesc/validators/schema/GeneralAttributeCheck.hpp>
22#include <icxercesc/validators/schema/SchemaSymbols.hpp>
23#include <xercesc/validators/schema/TraverseSchema.hpp>
24#include <icxercesc/validators/datatype/DatatypeValidatorFactory.hpp>
25#include <xercesc/dom/DOMNamedNodeMap.hpp>
26#include <xercesc/framework/XMLErrorCodes.hpp>
27#include <xercesc/framework/psvi/XSAnnotation.hpp>
28#include <icxercesc/util/XMLString.hpp>
29#include <xercesc/util/XMLUniDefs.hpp>
30#include <xercesc/util/Janitor.hpp>
31#include <icxercesc/util/PlatformUtils.hpp>
32#include <xercesc/util/XMLInitializer.hpp>
33#include <xercesc/util/OutOfMemoryException.hpp>
34
35XERCES_CPP_NAMESPACE_BEGIN
36
37// ---------------------------------------------------------------------------
38//  Local const data
39// ---------------------------------------------------------------------------
40static const XMLCh fgValueZero[] =
41{
42    chDigit_0, chNull
43};
44
45static const XMLCh fgValueOne[] =
46{
47    chDigit_1, chNull
48};
49
50static const XMLCh fgUnbounded[] =
51{
52    chLatin_u, chLatin_n, chLatin_b, chLatin_o, chLatin_u, chLatin_n, chLatin_d,
53    chLatin_e, chLatin_d, chNull
54};
55
56// ---------------------------------------------------------------------------
57//  Static member data initialization
58// ---------------------------------------------------------------------------
59ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fAttMap = 0;
60ValueHashTableOf<unsigned short>* GeneralAttributeCheck::fFacetsMap = 0;
61DatatypeValidator*                GeneralAttributeCheck::fNonNegIntDV = 0;
62DatatypeValidator*                GeneralAttributeCheck::fBooleanDV = 0;
63DatatypeValidator*                GeneralAttributeCheck::fAnyURIDV = 0;
64
65void XMLInitializer::initializeGeneralAttributeCheck()
66{
67    GeneralAttributeCheck::initialize ();
68}
69
70void XMLInitializer::terminateGeneralAttributeCheck()
71{
72    delete GeneralAttributeCheck::fFacetsMap;
73    delete GeneralAttributeCheck::fAttMap;
74
75    GeneralAttributeCheck::fAttMap = 0;
76    GeneralAttributeCheck::fFacetsMap = 0;
77
78    GeneralAttributeCheck::fNonNegIntDV = 0;
79    GeneralAttributeCheck::fBooleanDV = 0;
80    GeneralAttributeCheck::fAnyURIDV = 0;
81}
82
83void GeneralAttributeCheck::initialize()
84{
85    // Set up validators.
86    //
87    DatatypeValidatorFactory dvFactory;
88
89    fNonNegIntDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
90    fBooleanDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_BOOLEAN);
91    fAnyURIDV = dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_ANYURI);
92
93    // TODO - add remaining valdiators
94
95    // Map attributes.
96    //
97    fAttMap = new ValueHashTableOf<unsigned short>(A_Count);
98
99    fAttMap->put((void*)SchemaSymbols::fgATT_ABSTRACT, A_Abstract);
100    fAttMap->put((void*)SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT, A_AttributeFormDefault);
101    fAttMap->put((void*)SchemaSymbols::fgATT_BASE, A_Base);
102    fAttMap->put((void*)SchemaSymbols::fgATT_BLOCK, A_Block);
103    fAttMap->put((void*)SchemaSymbols::fgATT_BLOCKDEFAULT, A_BlockDefault);
104    fAttMap->put((void*)SchemaSymbols::fgATT_DEFAULT, A_Default);
105    fAttMap->put((void*)SchemaSymbols::fgATT_ELEMENTFORMDEFAULT, A_ElementFormDefault);
106    fAttMap->put((void*)SchemaSymbols::fgATT_FINAL, A_Final);
107    fAttMap->put((void*)SchemaSymbols::fgATT_FINALDEFAULT, A_FinalDefault);
108    fAttMap->put((void*)SchemaSymbols::fgATT_FIXED, A_Fixed);
109    fAttMap->put((void*)SchemaSymbols::fgATT_FORM, A_Form);
110    fAttMap->put((void*)SchemaSymbols::fgATT_ID, A_ID);
111    fAttMap->put((void*)SchemaSymbols::fgATT_ITEMTYPE, A_ItemType);
112    fAttMap->put((void*)SchemaSymbols::fgATT_MAXOCCURS, A_MaxOccurs);
113    fAttMap->put((void*)SchemaSymbols::fgATT_MEMBERTYPES, A_MemberTypes);
114    fAttMap->put((void*)SchemaSymbols::fgATT_MINOCCURS, A_MinOccurs);
115    fAttMap->put((void*)SchemaSymbols::fgATT_MIXED, A_Mixed);
116    fAttMap->put((void*)SchemaSymbols::fgATT_NAME, A_Name);
117    fAttMap->put((void*)SchemaSymbols::fgATT_NAMESPACE, A_Namespace);
118    fAttMap->put((void*)SchemaSymbols::fgATT_NILLABLE, A_Nillable);
119    fAttMap->put((void*)SchemaSymbols::fgATT_PROCESSCONTENTS, A_ProcessContents);
120    fAttMap->put((void*)SchemaSymbols::fgATT_PUBLIC, A_Public);
121    fAttMap->put((void*)SchemaSymbols::fgATT_REF, A_Ref);
122    fAttMap->put((void*)SchemaSymbols::fgATT_REFER, A_Refer);
123    fAttMap->put((void*)SchemaSymbols::fgATT_SCHEMALOCATION, A_SchemaLocation);
124    fAttMap->put((void*)SchemaSymbols::fgATT_SOURCE, A_Source);
125    fAttMap->put((void*)SchemaSymbols::fgATT_SUBSTITUTIONGROUP, A_SubstitutionGroup);
126    fAttMap->put((void*)SchemaSymbols::fgATT_SYSTEM, A_System);
127    fAttMap->put((void*)SchemaSymbols::fgATT_TARGETNAMESPACE, A_TargetNamespace);
128    fAttMap->put((void*)SchemaSymbols::fgATT_TYPE, A_Type);
129    fAttMap->put((void*)SchemaSymbols::fgATT_USE, A_Use);
130    fAttMap->put((void*)SchemaSymbols::fgATT_VALUE, A_Value);
131    fAttMap->put((void*)SchemaSymbols::fgATT_VERSION, A_Version);
132    fAttMap->put((void*)SchemaSymbols::fgATT_XPATH, A_XPath);
133
134    fFacetsMap = new ValueHashTableOf<unsigned short>(13);
135
136    fFacetsMap->put((void*) SchemaSymbols::fgELT_MINEXCLUSIVE, E_MinExclusive);
137    fFacetsMap->put((void*) SchemaSymbols::fgELT_MININCLUSIVE, E_MinInclusive);
138    fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXEXCLUSIVE, E_MaxExclusive);
139    fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE, E_MaxInclusive);
140    fFacetsMap->put((void*) SchemaSymbols::fgELT_TOTALDIGITS, E_TotalDigits);
141    fFacetsMap->put((void*) SchemaSymbols::fgELT_FRACTIONDIGITS, E_FractionDigits);
142    fFacetsMap->put((void*) SchemaSymbols::fgELT_LENGTH, E_Length);
143    fFacetsMap->put((void*) SchemaSymbols::fgELT_MINLENGTH, E_MinLength);
144    fFacetsMap->put((void*) SchemaSymbols::fgELT_MAXLENGTH, E_MaxLength);
145    fFacetsMap->put((void*) SchemaSymbols::fgELT_ENUMERATION, E_Enumeration);
146    fFacetsMap->put((void*) SchemaSymbols::fgELT_WHITESPACE, E_WhiteSpace);
147    fFacetsMap->put((void*) SchemaSymbols::fgELT_PATTERN, E_Pattern);
148}
149
150// ---------------------------------------------------------------------------
151//  GeneralAttributeCheck: Constructors and Destructor
152// ---------------------------------------------------------------------------
153GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager)
154    : fMemoryManager(manager)
155    , fIDValidator(manager)
156{
157}
158
159GeneralAttributeCheck::~GeneralAttributeCheck()
160{
161}
162
163// ---------------------------------------------------------------------------
164//  GeneralAttributeCheck: Validation methods
165// ---------------------------------------------------------------------------
166void
167GeneralAttributeCheck::checkAttributes(const DOMElement* const elem,
168                                       const unsigned short elemContext,
169                                       TraverseSchema* const schema,
170                                       const bool isTopLevel,
171                                       ValueVectorOf<DOMNode*>* const nonXSAttList)
172{
173    if (nonXSAttList)
174        nonXSAttList->removeAllElements();
175
176    if (elem == 0 || !fAttMap || elemContext>=E_Count)
177        return;
178
179    const XMLCh* elemName = elem->getLocalName();
180    if (!XMLString::equals(SchemaSymbols::fgURI_SCHEMAFORSCHEMA, elem->getNamespaceURI())) {
181        schema->reportSchemaError
182        (
183            elem
184            , XMLUni::fgXMLErrDomain
185            , XMLErrs::ELTSchemaNS
186            , elemName
187        );
188    }
189
190    DOMNamedNodeMap* eltAttrs = elem->getAttributes();
191    const XMLSize_t  attrCount = eltAttrs->getLength();
192    XMLByte          attList[A_Count];
193
194    memset(attList, 0, sizeof(attList));
195
196    for (XMLSize_t i = 0; i < attrCount; i++) {
197
198        DOMNode*     attribute = eltAttrs->item(i);
199        const XMLCh* attName = attribute->getNodeName();
200
201        // skip namespace declarations
202        if (XMLString::equals(attName, XMLUni::fgXMLNSString)
203            || XMLString::startsWith(attName, XMLUni::fgXMLNSColonString))
204            continue;
205
206        // Bypass attributes that start with xml
207        // add this to the list of "non-schema" attributes
208        if ((*attName == chLatin_X || *attName == chLatin_x)
209           && (*(attName+1) == chLatin_M || *(attName+1) == chLatin_m)
210           && (*(attName+2) == chLatin_L || *(attName+2) == chLatin_l)) {
211
212           if (nonXSAttList)
213                nonXSAttList->addElement(attribute);
214
215            continue;
216        }
217
218        // for attributes with namespace prefix
219        const XMLCh* attrURI = attribute->getNamespaceURI();
220
221        if (attrURI != 0 && *attrURI) {
222
223            // attributes with schema namespace are not allowed
224            // and not allowed on "documentation" and "appInfo"
225            if (XMLString::equals(attrURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) ||
226                XMLString::equals(elemName, SchemaSymbols::fgELT_APPINFO) ||
227                XMLString::equals(elemName, SchemaSymbols::fgELT_DOCUMENTATION)) {
228
229                schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
230                                          isTopLevel?XMLErrs::AttributeDisallowedGlobal:XMLErrs::AttributeDisallowedLocal, 
231                                          attName, elemName);
232            }
233            else if (nonXSAttList)
234            {
235                nonXSAttList->addElement(attribute);
236            }
237
238            continue;
239        }
240
241        int attNameId = A_Invalid;
242        attName = attribute->getLocalName();
243
244        bool bContinue=false;   // workaround for Borland bug with 'continue' in 'catch'
245        try {
246            attNameId= fAttMap->get(attName, fMemoryManager);
247        }
248        catch(const OutOfMemoryException&)
249        {
250            throw;
251        }
252        catch(...) {
253
254            schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
255                                      isTopLevel?XMLErrs::AttributeDisallowedGlobal:XMLErrs::AttributeDisallowedLocal, 
256                                      attName, elemName);
257            bContinue=true;
258        }
259        if(bContinue)
260            continue;
261
262        if (fgElemAttTable[elemContext][attNameId] & Att_Mask) {
263
264            attList[attNameId] = 1;
265            validate
266            (
267                elem
268                , attName
269                , attribute->getNodeValue()
270                , fgElemAttTable[elemContext][attNameId] & DV_Mask
271                , schema
272            );
273        }
274        else {
275            schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain,
276                                      isTopLevel?XMLErrs::AttributeDisallowedGlobal:XMLErrs::AttributeDisallowedLocal, 
277                                      attName, elemName);
278        }
279    }
280
281    // ------------------------------------------------------------------
282    // Check for required attributes
283    // ------------------------------------------------------------------
284    for (unsigned int j=0; j < A_Count; j++) {
285
286        if ((fgElemAttTable[elemContext][j] & Att_Required) && attList[j] == 0) {
287            schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, 
288                                      isTopLevel?XMLErrs::AttributeRequiredGlobal:XMLErrs::AttributeRequiredLocal, 
289                                      fAttNames[j], elemName);
290        }
291    }
292}
293
294
295void GeneralAttributeCheck::validate(const DOMElement* const elem,
296                                     const XMLCh* const attName,
297                                     const XMLCh* const attValue,
298                                     const short dvIndex,
299                                     TraverseSchema* const schema)
300{
301    bool isInvalid = false;
302    DatatypeValidator* dv = 0;
303
304    ValidationContext* fValidationContext = schema->fSchemaInfo->getValidationContext();
305    switch (dvIndex) {
306    case DV_Form:
307        if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_QUALIFIED)
308            && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_UNQUALIFIED)) {
309            isInvalid = true;
310        }
311        break;
312    case DV_MaxOccurs:
313            // maxOccurs = (nonNegativeInteger | unbounded)
314        if (!XMLString::equals(attValue, fgUnbounded)) {
315            dv = fNonNegIntDV;
316        }
317        break;
318    case DV_MaxOccurs1:
319        if (!XMLString::equals(attValue, fgValueOne)) {
320            isInvalid = true;
321        }
322        break;
323    case DV_MinOccurs1:
324        if (!XMLString::equals(attValue, fgValueZero)
325            && !XMLString::equals(attValue, fgValueOne)) {
326            isInvalid = true;
327        }
328        break;
329    case DV_ProcessContents:
330        if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_SKIP)
331            && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_LAX)
332            && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_STRICT)) {
333            isInvalid = true;
334        }
335        break;
336    case DV_Use:
337        if (!XMLString::equals(attValue, SchemaSymbols::fgATTVAL_OPTIONAL)
338            && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_PROHIBITED)
339            && !XMLString::equals(attValue, SchemaSymbols::fgATTVAL_REQUIRED)) {
340            isInvalid = true;
341        }
342        break;
343    case DV_WhiteSpace:
344        if (!XMLString::equals(attValue, SchemaSymbols::fgWS_PRESERVE)
345            && !XMLString::equals(attValue, SchemaSymbols::fgWS_REPLACE)
346            && !XMLString::equals(attValue, SchemaSymbols::fgWS_COLLAPSE)) {
347            isInvalid = true;
348        }
349        break;
350    case DV_Boolean:
351        dv = fBooleanDV;
352        break;
353    case DV_NonNegInt:
354        dv = fNonNegIntDV;
355        break;
356    case DV_AnyURI:
357        dv = fAnyURIDV;
358        break;
359    case DV_ID:
360        if (fValidationContext)
361        {
362            dv = &fIDValidator;
363        }
364        break;
365    }
366
367    if (dv) {
368        try {
369            dv->validate(attValue, fValidationContext, fMemoryManager);
370        }
371        catch(const XMLException& excep) {
372            schema->reportSchemaError(elem, excep);
373        }
374        catch(const OutOfMemoryException&)
375        {
376            throw;
377        }
378        catch(...) {
379            isInvalid = true;
380        }
381    }
382
383    if (isInvalid) {
384        schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue,
385                                  attValue, attName);
386    }
387}
388
389
390// ---------------------------------------------------------------------------
391//  Conditional methods for building the table
392// ---------------------------------------------------------------------------
393
394//
395//  This code will set up the character flags table. Its defined out since
396//  this table is now written out and hard coded (at the bottom of this
397//  file) into the code itself. This code is retained in case there is
398//  any need to recreate it later.
399//
400
401#if defined(NEED_TO_GEN_ELEM_ATT_MAP_TABLE)
402
403#include <stdio.h>
404
405void GeneralAttributeCheck::initCharFlagTable()
406{
407    unsigned short attList[E_Count][A_Count];
408
409    for (unsigned int i=0; i < E_Count; i++) {
410        for (unsigned int j=0; j < A_Count; j++) {
411            attList[i][j] = 0;
412        }
413    }
414
415    //
416    //  Write it out to a temp file to be read back into this source later.
417    //
418    FILE* outFl = fopen("ea_table.out", "wt+");
419    fprintf(outFl, "unsigned short GeneralAttributeCheck::fgElemAttTable[GeneralAttributeCheck::E_Count][GeneralAttributeCheck::A_Count] =\n{\n    {");
420
421    //"all"
422    attList[E_All][A_ID] = Att_Optional | DV_ID;
423    attList[E_All][A_MaxOccurs] = Att_Optional | DV_MaxOccurs1;
424    attList[E_All][A_MinOccurs] = Att_Optional | DV_MinOccurs1;
425
426    // "annotation"
427    attList[E_Annotation][A_ID] = Att_Optional | DV_ID;
428
429    // "any"
430    attList[E_Any][A_ID] = Att_Optional | DV_ID;
431    attList[E_Any][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
432    attList[E_Any][A_MinOccurs] = Att_Optional | DV_NonNegInt;
433    attList[E_Any][A_Namespace] = Att_Optional;
434    attList[E_Any][A_ProcessContents] = Att_Optional | DV_ProcessContents;
435
436    // "anyAttribute"
437    attList[E_AnyAttribute][A_ID] = Att_Optional | DV_ID;
438    attList[E_AnyAttribute][A_Namespace] = Att_Optional;
439    attList[E_AnyAttribute][A_ProcessContents] = Att_Optional | DV_ProcessContents;
440
441    // "appinfo"
442    attList[E_Appinfo][A_Source]= Att_Optional | DV_AnyURI;
443
444    // attribute - global"
445    attList[E_AttributeGlobal][A_Default] = Att_Optional;
446    attList[E_AttributeGlobal][A_Fixed] = Att_Optional;
447    attList[E_AttributeGlobal][A_ID] = Att_Optional | DV_ID;
448    attList[E_AttributeGlobal][A_Name] = Att_Required;
449    attList[E_AttributeGlobal][A_Type] = Att_Optional;
450
451    // "attribute - local"
452    attList[E_AttributeLocal][A_Default] = Att_Optional;
453    attList[E_AttributeLocal][A_Fixed] = Att_Optional;
454    attList[E_AttributeLocal][A_Form]= Att_Optional | DV_Form;
455    attList[E_AttributeLocal][A_ID] = Att_Optional | DV_ID;
456    attList[E_AttributeLocal][A_Name] = Att_Required;
457    attList[E_AttributeLocal][A_Type] = Att_Optional;
458    attList[E_AttributeLocal][A_Use] = Att_Optional | DV_Use;
459
460    // "attribute - ref"
461    attList[E_AttributeRef][A_Default] = Att_Optional;
462    attList[E_AttributeRef][A_Fixed] = Att_Optional;
463    attList[E_AttributeRef][A_ID] = Att_Optional | DV_ID;
464    attList[E_AttributeRef][A_Ref]= Att_Required;
465    attList[E_AttributeRef][A_Use] = Att_Optional | DV_Use;
466
467    // "attributeGroup - global"
468    attList[E_AttributeGroupGlobal][A_ID] = Att_Optional | DV_ID;
469    attList[E_AttributeGroupGlobal][A_Name] = Att_Required;
470
471    // "attributeGroup - ref"
472    attList[E_AttributeGroupRef][A_ID] = Att_Optional | DV_ID;
473    attList[E_AttributeGroupRef][A_Ref]= Att_Required;
474
475    // "choice"
476    attList[E_Choice][A_ID] = Att_Optional | DV_ID;
477    attList[E_Choice][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
478    attList[E_Choice][A_MinOccurs] = Att_Optional | DV_NonNegInt;
479
480    // "complexContent"
481    attList[E_ComplexContent][A_ID] = Att_Optional | DV_ID;
482    attList[E_ComplexContent][A_Mixed] = Att_Optional | DV_Boolean;
483
484    // "complexType - global"
485    attList[E_ComplexTypeGlobal][A_Abstract] = Att_Optional | DV_Boolean;
486    attList[E_ComplexTypeGlobal][A_Block] = Att_Optional;
487    attList[E_ComplexTypeGlobal][A_Final] = Att_Optional;
488    attList[E_ComplexTypeGlobal][A_ID] = Att_Optional | DV_ID;
489    attList[E_ComplexTypeGlobal][A_Mixed] = Att_Optional | DV_Boolean;
490    attList[E_ComplexTypeGlobal][A_Name] = Att_Required;
491
492    // "complexType - local"
493    attList[E_ComplexTypeLocal][A_ID] = Att_Optional | DV_ID;
494    attList[E_ComplexTypeLocal][A_Mixed] = Att_Optional | DV_Boolean;
495
496    // "documentation"
497    attList[E_Documentation][A_Source] = Att_Optional | DV_AnyURI;
498
499    // "element - global"
500    attList[E_ElementGlobal][A_Abstract] = Att_Optional | DV_Boolean;
501    attList[E_ElementGlobal][A_Block] = Att_Optional;
502    attList[E_ElementGlobal][A_Default] = Att_Optional;
503    attList[E_ElementGlobal][A_Final] = Att_Optional;
504    attList[E_ElementGlobal][A_Fixed] = Att_Optional;
505    attList[E_ElementGlobal][A_ID] = Att_Optional | DV_ID;
506    attList[E_ElementGlobal][A_Name] = Att_Required;
507    attList[E_ElementGlobal][A_Nillable] = Att_Optional | DV_Boolean;
508    attList[E_ElementGlobal][A_SubstitutionGroup] = Att_Optional;
509    attList[E_ElementGlobal][A_Type] = Att_Optional;
510
511    // "element - local"
512    attList[E_ElementLocal][A_Block]= Att_Optional;
513    attList[E_ElementLocal][A_Default] = Att_Optional;
514    attList[E_ElementLocal][A_Fixed] = Att_Optional;
515    attList[E_ElementLocal][A_Form] = Att_Optional | DV_Form;
516    attList[E_ElementLocal][A_ID] = Att_Optional | DV_ID;
517    attList[E_ElementLocal][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
518    attList[E_ElementLocal][A_MinOccurs] = Att_Optional | DV_NonNegInt;
519    attList[E_ElementLocal][A_Name] = Att_Required;
520    attList[E_ElementLocal][A_Nillable] = Att_Optional | DV_Boolean;
521    attList[E_ElementLocal][A_Type] = Att_Optional;
522
523    //"element - ref"
524    attList[E_ElementRef][A_ID] = Att_Optional | DV_ID;
525    attList[E_ElementRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
526    attList[E_ElementRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
527    attList[E_ElementRef][A_Ref] = Att_Required;
528
529    // "enumeration"
530    attList[E_Enumeration][A_ID] = Att_Optional | DV_ID;
531    attList[E_Enumeration][A_Value] = Att_Optional;
532
533    // "extension"
534    attList[E_Extension][A_Base] = Att_Required;
535    attList[E_Extension][A_ID] = Att_Optional | DV_ID;
536
537    //"field"
538    attList[E_Field][A_ID] = Att_Optional | DV_ID;
539    attList[E_Field][A_XPath] = Att_Required;
540
541    // "fractionDigits"
542    attList[E_FractionDigits][A_ID] = Att_Optional | DV_ID;
543    attList[E_FractionDigits][A_Value] = Att_Optional | DV_NonNegInt;
544    attList[E_FractionDigits][A_Fixed] = Att_Optional | DV_Boolean;
545
546    // "group - global"
547    attList[E_GroupGlobal][A_ID] = Att_Optional | DV_ID;
548    attList[E_GroupGlobal][A_Name] = Att_Required;
549
550    // "group - ref"
551    attList[E_GroupRef][A_ID] = Att_Optional | DV_ID;
552    attList[E_GroupRef][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
553    attList[E_GroupRef][A_MinOccurs] = Att_Optional | DV_NonNegInt;
554    attList[E_GroupRef][A_Ref] = Att_Required;
555
556    // "import"
557    attList[E_Import][A_ID] = Att_Optional | DV_ID;
558    attList[E_Import][A_Namespace] = Att_Optional;
559    attList[E_Import][A_SchemaLocation] = Att_Optional;
560
561    // "include"
562    attList[E_Include][A_ID] = Att_Optional | DV_ID;
563    attList[E_Include][A_SchemaLocation] = Att_Required;
564
565    // "key"
566    attList[E_Key][A_ID] = Att_Optional | DV_ID;
567    attList[E_Key][A_Name] = Att_Required;
568
569    // "keyref"
570    attList[E_KeyRef][A_ID] = Att_Optional | DV_ID;
571    attList[E_KeyRef][A_Name] = Att_Required;
572    attList[E_KeyRef][A_Refer] = Att_Required;
573
574    // "length"
575    attList[E_Length][A_ID] = Att_Optional | DV_ID;
576    attList[E_Length][A_Value] = Att_Optional | DV_NonNegInt;
577    attList[E_Length][A_Fixed] = Att_Optional | DV_Boolean;
578
579    // "list"
580    attList[E_List][A_ID] = Att_Optional | DV_ID;
581    attList[E_List][A_ItemType] = Att_Optional;
582
583    // "maxExclusive"
584    attList[E_MaxExclusive][A_ID] = Att_Optional | DV_ID;
585    attList[E_MaxExclusive][A_Value] = Att_Optional;
586    attList[E_MaxExclusive][A_Fixed] = Att_Optional | DV_Boolean;
587
588    // "maxInclusive"
589    attList[E_MaxInclusive][A_ID] = Att_Optional | DV_ID;
590    attList[E_MaxInclusive][A_Value] = Att_Optional;
591    attList[E_MaxInclusive][A_Fixed] = Att_Optional | DV_Boolean;
592
593    // "maxLength"
594    attList[E_MaxLength][A_ID] = Att_Optional | DV_ID;
595    attList[E_MaxLength][A_Value] = Att_Optional | DV_NonNegInt;
596    attList[E_MaxLength][A_Fixed] = Att_Optional | DV_Boolean;
597
598    // "minExclusive"
599    attList[E_MinExclusive][A_ID] = Att_Optional | DV_ID;
600    attList[E_MinExclusive][A_Value] = Att_Optional;
601    attList[E_MinExclusive][A_Fixed] = Att_Optional | DV_Boolean;
602
603    // "minInclusive"
604    attList[E_MinInclusive][A_ID] = Att_Optional | DV_ID;
605    attList[E_MinInclusive][A_Value] = Att_Optional;
606    attList[E_MinInclusive][A_Fixed] = Att_Optional | DV_Boolean;
607
608    // "minLength"
609    attList[E_MinLength][A_ID] = Att_Optional | DV_ID;
610    attList[E_MinLength][A_Value] = Att_Optional | DV_NonNegInt;
611    attList[E_MinLength][A_Fixed] = Att_Optional | DV_Boolean;
612
613    // "notation"
614    attList[E_Notation][A_ID] = Att_Optional | DV_ID;
615    attList[E_Notation][A_Name] = Att_Required;
616    attList[E_Notation][A_Public] = Att_Optional;
617    attList[E_Notation][A_System] = Att_Optional | DV_AnyURI;
618
619    // "pattern"
620    attList[E_Pattern][A_ID] = Att_Optional;
621    attList[E_Pattern][A_Value] = Att_Optional;
622
623    // "redefine"
624    attList[E_Redefine][A_ID] = Att_Optional | DV_ID;
625    attList[E_Redefine][A_SchemaLocation] = Att_Required;
626
627    // "restriction"
628    attList[E_Restriction][A_Base] = Att_Optional;
629    attList[E_Restriction][A_ID] = Att_Optional | DV_ID;
630
631    // "schema"
632    attList[E_Schema][A_AttributeFormDefault] = Att_Optional | DV_Form;
633    attList[E_Schema][A_BlockDefault] = Att_Optional;
634    attList[E_Schema][A_ElementFormDefault] = Att_Optional | DV_Form;
635    attList[E_Schema][A_FinalDefault] = Att_Optional;
636    attList[E_Schema][A_ID] = Att_Optional | DV_ID;
637    attList[E_Schema][A_TargetNamespace] = Att_Optional;
638    attList[E_Schema][A_Version] = Att_Optional;
639
640    // "selector"
641    attList[E_Selector][A_ID] = Att_Optional | DV_ID;
642    attList[E_Selector][A_XPath] = Att_Required;
643
644    // "sequence"
645    attList[E_Sequence][A_ID] = Att_Optional | DV_ID;
646    attList[E_Sequence][A_MaxOccurs] = Att_Optional | DV_MaxOccurs;
647    attList[E_Sequence][A_MinOccurs] = Att_Optional | DV_NonNegInt;
648
649    // "simpleContent"
650    attList[E_SimpleContent][A_ID] = Att_Optional | DV_ID;
651
652    // "simpleType - global"
653    attList[E_SimpleTypeGlobal][A_Final] = Att_Optional;
654    attList[E_SimpleTypeGlobal][A_ID] = Att_Optional | DV_ID;
655    attList[E_SimpleTypeGlobal][A_Name] = Att_Required;
656
657    // "simpleType - local"
658    attList[E_SimpleTypeLocal][A_Final] = Att_Optional;
659    attList[E_SimpleTypeLocal][A_ID] = Att_Optional | DV_ID;
660
661    // "totalDigits"
662    attList[E_TotalDigits][A_ID] = Att_Optional | DV_ID;
663    attList[E_TotalDigits][A_Value] = Att_Optional | DV_NonNegInt;
664    attList[E_TotalDigits][A_Fixed] = Att_Optional | DV_Boolean;
665
666    // "union"
667    attList[E_Union][A_ID] = Att_Optional | DV_ID;
668    attList[E_Union][A_MemberTypes] = Att_Optional;
669
670    // "unique"
671    attList[E_Unique][A_ID] = Att_Optional | DV_ID;
672    attList[E_Unique][A_Name] = Att_Required;
673
674    // "whitespace"
675    attList[E_WhiteSpace][A_ID] = Att_Optional | DV_ID;
676    attList[E_WhiteSpace][A_Value] = Att_Optional | DV_WhiteSpace;
677    attList[E_WhiteSpace][A_Fixed] = Att_Optional | DV_Boolean;
678
679    for (unsigned int j=0; j < E_Count; j++) {
680
681        for (unsigned int index = 0; index < A_Count-1; index++)
682        {
683            fprintf(outFl, " %d,", attList[j][index]);
684        }
685
686        fprintf(outFl, " %d", attList[j][A_Count - 1]);
687
688        if (j + 1 == E_Count)
689            fprintf(outFl, "}\n};");
690        else
691            fprintf(outFl, "},\n    {");
692    }
693
694    fclose(outFl);
695}
696
697#endif
698
699
700unsigned short GeneralAttributeCheck::fgElemAttTable[GeneralAttributeCheck::E_Count][GeneralAttributeCheck::A_Count] =
701{
702  { 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},
703  { 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},
704  { 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},
705  { 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},
706  { 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},
707  { 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},
708  { 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},
709  { 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},
710  { 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},
711  { 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},
712  { 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},
713  { 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},
714  { 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},
715  { 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},
716  { 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},
717  { 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},
718  { 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},
719  { 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},
720  { 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},
721  { 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},
722  { 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},
723  { 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},
724  { 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},
725  { 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},
726  { 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},
727  { 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},
728  { 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},
729  { 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},
730  { 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},
731  { 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},
732  { 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},
733  { 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},
734  { 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},
735  { 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},
736  { 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},
737  { 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},
738  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0},
739  { 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},
740  { 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},
741  { 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},
742  { 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},
743  { 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},
744  { 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},
745  { 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},
746  { 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},
747  { 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},
748  { 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},
749  { 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},
750  { 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},
751  { 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}
752};
753
754const XMLCh* GeneralAttributeCheck::fAttNames[GeneralAttributeCheck::A_Count] =
755{
756    SchemaSymbols::fgATT_ABSTRACT,
757    SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT,
758    SchemaSymbols::fgATT_BASE,
759    SchemaSymbols::fgATT_BLOCK,
760    SchemaSymbols::fgATT_BLOCKDEFAULT,
761    SchemaSymbols::fgATT_DEFAULT,
762    SchemaSymbols::fgATT_ELEMENTFORMDEFAULT,
763    SchemaSymbols::fgATT_FINAL,
764    SchemaSymbols::fgATT_FINALDEFAULT,
765    SchemaSymbols::fgATT_FIXED,
766    SchemaSymbols::fgATT_FORM,
767    SchemaSymbols::fgATT_ID,
768    SchemaSymbols::fgATT_ITEMTYPE,
769    SchemaSymbols::fgATT_MAXOCCURS,
770    SchemaSymbols::fgATT_MEMBERTYPES,
771    SchemaSymbols::fgATT_MINOCCURS,
772    SchemaSymbols::fgATT_MIXED,
773    SchemaSymbols::fgATT_NAME,
774    SchemaSymbols::fgATT_NAMESPACE,
775    SchemaSymbols::fgATT_NILLABLE,
776    SchemaSymbols::fgATT_PROCESSCONTENTS,
777    SchemaSymbols::fgATT_PUBLIC,
778    SchemaSymbols::fgATT_REF,
779    SchemaSymbols::fgATT_REFER,
780    SchemaSymbols::fgATT_SCHEMALOCATION,
781    SchemaSymbols::fgATT_SOURCE,
782    SchemaSymbols::fgATT_SUBSTITUTIONGROUP,
783    SchemaSymbols::fgATT_SYSTEM,
784    SchemaSymbols::fgATT_TARGETNAMESPACE,
785    SchemaSymbols::fgATT_TYPE,
786    SchemaSymbols::fgATT_USE,
787    SchemaSymbols::fgATT_VALUE,
788    SchemaSymbols::fgATT_VERSION,
789    SchemaSymbols::fgATT_XPATH,
790};
791
792XERCES_CPP_NAMESPACE_END
793
794/**
795  * End of file GeneralAttributeCheck.cpp
796  */
797
798
Note: See TracBrowser for help on using the repository browser.