1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the QtXmlPatterns module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or (at your option) the GNU General |
28 | ** Public license version 3 or any later version approved by the KDE Free |
29 | ** Qt Foundation. The licenses are as published by the Free Software |
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
31 | ** included in the packaging of this file. Please review the following |
32 | ** information to ensure the GNU General Public License requirements will |
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
35 | ** |
36 | ** $QT_END_LICENSE$ |
37 | ** |
38 | ****************************************************************************/ |
39 | |
40 | // |
41 | // W A R N I N G |
42 | // ------------- |
43 | // |
44 | // This file is not part of the Qt API. It exists purely as an |
45 | // implementation detail. This header file may change from version to |
46 | // version without notice, or even be removed. |
47 | // |
48 | // We mean it. |
49 | |
50 | #ifndef Patternist_XsdSchemaParser_H |
51 | #define Patternist_XsdSchemaParser_H |
52 | |
53 | #include <private/qnamespacesupport_p.h> |
54 | #include <private/qxsdalternative_p.h> |
55 | #include <private/qxsdattribute_p.h> |
56 | #include <private/qxsdattributegroup_p.h> |
57 | #include <private/qxsdattributeterm_p.h> |
58 | #include <private/qxsdcomplextype_p.h> |
59 | #include <private/qxsdelement_p.h> |
60 | #include <private/qxsdidcache_p.h> |
61 | #include <private/qxsdmodelgroup_p.h> |
62 | #include <private/qxsdnotation_p.h> |
63 | #include <private/qxsdsimpletype_p.h> |
64 | #include <private/qxsdschemacontext_p.h> |
65 | #include <private/qxsdschemaparsercontext_p.h> |
66 | #include <private/qxsdstatemachine_p.h> |
67 | |
68 | #include <QtCore/QHash> |
69 | #include <QtCore/QSet> |
70 | #include <QtCore/QUrl> |
71 | #include <QtCore/QXmlStreamReader> |
72 | #include <QtXmlPatterns/QXmlNamePool> |
73 | |
74 | QT_BEGIN_NAMESPACE |
75 | |
76 | namespace QPatternist |
77 | { |
78 | /** |
79 | * @short Implements the parsing of XML schema file. |
80 | * |
81 | * This class parses a XML schema in XML presentation from an QIODevice |
82 | * and returns object representation as XsdSchema. |
83 | * |
84 | * @ingroup Patternist_schema |
85 | * @author Tobias Koenig <tobias.koenig@nokia.com> |
86 | */ |
87 | class XsdSchemaParser : public MaintainingReader<XsdSchemaToken, XsdTagScope::Type> |
88 | { |
89 | friend class ElementNamespaceHandler; |
90 | friend class TagValidationHandler; |
91 | |
92 | public: |
93 | enum ParserType |
94 | { |
95 | TopLevelParser, |
96 | IncludeParser, |
97 | ImportParser, |
98 | RedefineParser |
99 | }; |
100 | |
101 | /** |
102 | * Creates a new schema parser object. |
103 | */ |
104 | XsdSchemaParser(const XsdSchemaContext::Ptr &context, const XsdSchemaParserContext::Ptr &parserContext, QIODevice *device); |
105 | |
106 | /** |
107 | * Parses the XML schema file. |
108 | * |
109 | * @return @c true on success, @c false if the schema is somehow invalid. |
110 | */ |
111 | bool parse(ParserType parserType = TopLevelParser); |
112 | |
113 | /** |
114 | * Describes a set of namespace URIs |
115 | */ |
116 | typedef QSet<QUrl> NamespaceSet; |
117 | |
118 | /** |
119 | * Adds @p schemas to the list of already included schemas, so the parser |
120 | * can detect multiple includes of the same schema. |
121 | */ |
122 | void addIncludedSchemas(const NamespaceSet &schemas); |
123 | |
124 | /** |
125 | * Sets which @p schemas have been included already, so the parser |
126 | * can detect multiple includes of the same schema. |
127 | */ |
128 | void setIncludedSchemas(const NamespaceSet &schemas); |
129 | |
130 | /** |
131 | * Adds @p schemas to the list of already imported schemas, so the parser |
132 | * can detect multiple imports of the same schema. |
133 | */ |
134 | void addImportedSchemas(const NamespaceSet &schemas); |
135 | |
136 | /** |
137 | * Sets which @p schemas have been imported already, so the parser |
138 | * can detect circular imports. |
139 | */ |
140 | void setImportedSchemas(const NamespaceSet &schemas); |
141 | |
142 | /** |
143 | * Adds @p schemas to the list of already redefined schemas, so the parser |
144 | * can detect multiple redefines of the same schema. |
145 | */ |
146 | void addRedefinedSchemas(const NamespaceSet &schemas); |
147 | |
148 | /** |
149 | * Sets which @p schemas have been redefined already, so the parser |
150 | * can detect multiple redefines of the same schema. |
151 | */ |
152 | void setRedefinedSchemas(const NamespaceSet &schemas); |
153 | |
154 | /** |
155 | * Sets the target namespace of the schema to parse. |
156 | */ |
157 | void setTargetNamespace(const QString &targetNamespace); |
158 | |
159 | /** |
160 | * Sets the document URI of the schema to parse. |
161 | */ |
162 | void setDocumentURI(const QUrl &uri); |
163 | |
164 | /** |
165 | * Returns the document URI of the schema to parse. |
166 | */ |
167 | QUrl documentURI() const; |
168 | |
169 | /** |
170 | * Reimplemented from MaintainingReader, always returns @c false. |
171 | */ |
172 | bool isAnyAttributeAllowed() const; |
173 | |
174 | private: |
175 | /** |
176 | * Used internally to report any kind of parsing error or |
177 | * schema inconsistency. |
178 | */ |
179 | virtual void error(const QString &msg); |
180 | |
181 | void attributeContentError(const char *attributeName, const char *elementName, const QString &value, const SchemaType::Ptr &type = SchemaType::Ptr()); |
182 | |
183 | /** |
184 | * Sets the target namespace of the schema to parse. |
185 | */ |
186 | void setTargetNamespaceExtended(const QString &targetNamespace); |
187 | |
188 | /** |
189 | * This method is called for parsing the top-level <em>schema</em> object. |
190 | */ |
191 | void parseSchema(ParserType parserType); |
192 | |
193 | /** |
194 | * This method is called for parsing any top-level <em>include</em> object. |
195 | */ |
196 | void parseInclude(); |
197 | |
198 | /** |
199 | * This method is called for parsing any top-level <em>import</em> object. |
200 | */ |
201 | void parseImport(); |
202 | |
203 | /** |
204 | * This method is called for parsing any top-level <em>redefine</em> object. |
205 | */ |
206 | void parseRedefine(); |
207 | |
208 | /** |
209 | * This method is called for parsing any <em>annotation</em> object everywhere |
210 | * in the schema. |
211 | */ |
212 | XsdAnnotation::Ptr parseAnnotation(); |
213 | |
214 | /** |
215 | * This method is called for parsing an <em>appinfo</em> object as child of |
216 | * an <em>annotation</em> object. |
217 | */ |
218 | XsdApplicationInformation::Ptr parseAppInfo(); |
219 | |
220 | /** |
221 | * This method is called for parsing a <em>documentation</em> object as child of |
222 | * an <em>annotation</em> object. |
223 | */ |
224 | XsdDocumentation::Ptr parseDocumentation(); |
225 | |
226 | /** |
227 | * This method is called for parsing a <em>defaultOpenContent</em> object. |
228 | */ |
229 | void parseDefaultOpenContent(); |
230 | |
231 | /** |
232 | * This method is called for parsing any top-level <em>simpleType</em> object. |
233 | */ |
234 | XsdSimpleType::Ptr parseGlobalSimpleType(); |
235 | |
236 | /** |
237 | * This method is called for parsing any <em>simpleType</em> object as descendant |
238 | * of an <em>element</em> or <em>complexType</em> object. |
239 | */ |
240 | XsdSimpleType::Ptr parseLocalSimpleType(); |
241 | |
242 | /** |
243 | * This method is called for parsing a <em>restriction</em> object as child |
244 | * of a <em>simpleType</em> object. |
245 | */ |
246 | void parseSimpleRestriction(const XsdSimpleType::Ptr &ptr); |
247 | |
248 | /** |
249 | * This method is called for parsing a <em>list</em> object as child |
250 | * of a <em>simpleType</em> object. |
251 | */ |
252 | void parseList(const XsdSimpleType::Ptr &ptr); |
253 | |
254 | /** |
255 | * This method is called for parsing a <em>union</em> object as child |
256 | * of a <em>simpleType</em> object. |
257 | */ |
258 | void parseUnion(const XsdSimpleType::Ptr &ptr); |
259 | |
260 | /** |
261 | * This method is called for parsing a <em>minExclusive</em> object as child |
262 | * of a <em>restriction</em> object. |
263 | */ |
264 | XsdFacet::Ptr parseMinExclusiveFacet(); |
265 | |
266 | /** |
267 | * This method is called for parsing a <em>minInclusive</em> object as child |
268 | * of a <em>restriction</em> object. |
269 | */ |
270 | XsdFacet::Ptr parseMinInclusiveFacet(); |
271 | |
272 | /** |
273 | * This method is called for parsing a <em>maxExclusive</em> object as child |
274 | * of a <em>restriction</em> object. |
275 | */ |
276 | XsdFacet::Ptr parseMaxExclusiveFacet(); |
277 | |
278 | /** |
279 | * This method is called for parsing a <em>maxInclusive</em> object as child |
280 | * of a <em>restriction</em> object. |
281 | */ |
282 | XsdFacet::Ptr parseMaxInclusiveFacet(); |
283 | |
284 | /** |
285 | * This method is called for parsing a <em>totalDigits</em> object as child |
286 | * of a <em>restriction</em> object. |
287 | */ |
288 | XsdFacet::Ptr parseTotalDigitsFacet(); |
289 | |
290 | /** |
291 | * This method is called for parsing a <em>fractionDigits</em> object as child |
292 | * of a <em>restriction</em> object. |
293 | */ |
294 | XsdFacet::Ptr parseFractionDigitsFacet(); |
295 | |
296 | /** |
297 | * This method is called for parsing a <em>length</em> object as child |
298 | * of a <em>restriction</em> object. |
299 | */ |
300 | XsdFacet::Ptr parseLengthFacet(); |
301 | |
302 | /** |
303 | * This method is called for parsing a <em>minLength</em> object as child |
304 | * of a <em>restriction</em> object. |
305 | */ |
306 | XsdFacet::Ptr parseMinLengthFacet(); |
307 | |
308 | /** |
309 | * This method is called for parsing a <em>maxLength</em> object as child |
310 | * of a <em>restriction</em> object. |
311 | */ |
312 | XsdFacet::Ptr parseMaxLengthFacet(); |
313 | |
314 | /** |
315 | * This method is called for parsing an <em>enumeration</em> object as child |
316 | * of a <em>restriction</em> object. |
317 | */ |
318 | XsdFacet::Ptr parseEnumerationFacet(); |
319 | |
320 | /** |
321 | * This method is called for parsing a <em>whiteSpace</em> object as child |
322 | * of a <em>restriction</em> object. |
323 | */ |
324 | XsdFacet::Ptr parseWhiteSpaceFacet(); |
325 | |
326 | /** |
327 | * This method is called for parsing a <em>pattern</em> object as child |
328 | * of a <em>restriction</em> object. |
329 | */ |
330 | XsdFacet::Ptr parsePatternFacet(); |
331 | |
332 | /** |
333 | * This method is called for parsing an <em>assertion</em> object as child |
334 | * of a <em>restriction</em> object. |
335 | */ |
336 | XsdFacet::Ptr parseAssertionFacet(); |
337 | |
338 | /** |
339 | * This method is called for parsing any top-level <em>complexType</em> object. |
340 | */ |
341 | XsdComplexType::Ptr parseGlobalComplexType(); |
342 | |
343 | /** |
344 | * This method is called for parsing any <em>complexType</em> object as descendant |
345 | * of an <em>element</em> object. |
346 | */ |
347 | XsdComplexType::Ptr parseLocalComplexType(); |
348 | |
349 | /** |
350 | * This method resolves the content type of the @p complexType for the given |
351 | * @p effectiveMixed value. |
352 | */ |
353 | void resolveComplexContentType(const XsdComplexType::Ptr &complexType, bool effectiveMixed); |
354 | |
355 | /** |
356 | * This method is called for parsing a <em>simpleContent</em> object as child |
357 | * of a <em>complexType</em> object. |
358 | */ |
359 | void parseSimpleContent(const XsdComplexType::Ptr &complexType); |
360 | |
361 | /** |
362 | * This method is called for parsing a <em>restriction</em> object as child |
363 | * of a <em>simpleContent</em> object. |
364 | */ |
365 | void parseSimpleContentRestriction(const XsdComplexType::Ptr &complexType); |
366 | |
367 | /** |
368 | * This method is called for parsing an <em>extension</em> object as child |
369 | * of a <em>simpleContent</em> object. |
370 | */ |
371 | void parseSimpleContentExtension(const XsdComplexType::Ptr &complexType); |
372 | |
373 | /** |
374 | * This method is called for parsing a <em>complexContent</em> object as child |
375 | * of a <em>complexType</em> object. |
376 | * |
377 | * @param complexType The complex type the complex content belongs to. |
378 | * @param mixed The output parameter for the mixed value. |
379 | */ |
380 | void parseComplexContent(const XsdComplexType::Ptr &complexType, bool *mixed); |
381 | |
382 | /** |
383 | * This method is called for parsing a <em>restriction</em> object as child |
384 | * of a <em>complexContent</em> object. |
385 | */ |
386 | void parseComplexContentRestriction(const XsdComplexType::Ptr &complexType); |
387 | |
388 | /** |
389 | * This method is called for parsing an <em>extension</em> object as child |
390 | * of a <em>complexContent</em> object. |
391 | */ |
392 | void parseComplexContentExtension(const XsdComplexType::Ptr &complexType); |
393 | |
394 | /** |
395 | * This method is called for parsing an <em>assert</em> object as child |
396 | * of a <em>complexType</em> or parsing a <em>assertion</em> facet object as |
397 | * child of a <em>simpleType</em>. |
398 | * |
399 | * @param nodeName Either XsdSchemaToken::Assert or XsdSchemaToken::Assertion. |
400 | * @param tag Either XsdTagScope::Assert or XsdTagScope::Assertion. |
401 | */ |
402 | XsdAssertion::Ptr parseAssertion(const XsdSchemaToken::NodeName &nodeName, const XsdTagScope::Type &tag); |
403 | |
404 | /** |
405 | * This method is called for parsing an <em>openContent</em> object. |
406 | */ |
407 | XsdComplexType::OpenContent::Ptr parseOpenContent(); |
408 | |
409 | /** |
410 | * This method is called for parsing a top-level <em>group</em> object. |
411 | */ |
412 | XsdModelGroup::Ptr parseNamedGroup(); |
413 | |
414 | /** |
415 | * This method is called for parsing a non-top-level <em>group</em> object |
416 | * that contains a <em>ref</em> attribute. |
417 | */ |
418 | XsdTerm::Ptr parseReferredGroup(const XsdParticle::Ptr &particle); |
419 | |
420 | /** |
421 | * This method is called for parsing an <em>all</em> object as child |
422 | * of a top-level <em>group</em> object. |
423 | * |
424 | * @param parent The schema component the <em>all</em> object is part of. |
425 | */ |
426 | XsdModelGroup::Ptr parseAll(const NamedSchemaComponent::Ptr &parent); |
427 | |
428 | /** |
429 | * This method is called for parsing an <em>all</em> object as descendant |
430 | * of a <em>complexType</em> object. |
431 | * |
432 | * @param particle The particle the <em>all</em> object belongs to. |
433 | * @param parent The schema component the <em>all</em> object is part of. |
434 | */ |
435 | XsdModelGroup::Ptr parseLocalAll(const XsdParticle::Ptr &particle, const NamedSchemaComponent::Ptr &parent); |
436 | |
437 | /** |
438 | * This method is called for parsing a <em>choice</em> object as child |
439 | * of a top-level <em>group</em> object. |
440 | * |
441 | * @param parent The schema component the <em>choice</em> object is part of. |
442 | */ |
443 | XsdModelGroup::Ptr parseChoice(const NamedSchemaComponent::Ptr &parent); |
444 | |
445 | /** |
446 | * This method is called for parsing a <em>choice</em> object as descendant |
447 | * of a <em>complexType</em> object or a <em>choice</em> object. |
448 | * |
449 | * @param particle The particle the <em>choice</em> object belongs to. |
450 | * @param parent The schema component the <em>choice</em> object is part of. |
451 | */ |
452 | XsdModelGroup::Ptr parseLocalChoice(const XsdParticle::Ptr &particle, const NamedSchemaComponent::Ptr &parent); |
453 | |
454 | /** |
455 | * This method is called for parsing a <em>sequence</em> object as child |
456 | * of a top-level <em>group</em> object. |
457 | * |
458 | * @param parent The schema component the <em>sequence</em> object is part of. |
459 | */ |
460 | XsdModelGroup::Ptr parseSequence(const NamedSchemaComponent::Ptr &parent); |
461 | |
462 | /** |
463 | * This method is called for parsing a <em>sequence</em> object as descendant |
464 | * of a <em>complexType</em> object or a <em>sequence</em> object. |
465 | * |
466 | * @param particle The particle the <em>sequence</em> object belongs to. |
467 | * @param parent The schema component the <em>sequence</em> object is part of. |
468 | */ |
469 | XsdModelGroup::Ptr parseLocalSequence(const XsdParticle::Ptr &particle, const NamedSchemaComponent::Ptr &parent); |
470 | |
471 | /** |
472 | * A helper method that parses the minOccurs and maxOccurs constraints for |
473 | * the given @p particle that has the given @p tagName. |
474 | */ |
475 | bool parseMinMaxConstraint(const XsdParticle::Ptr &particle, const char* tagName); |
476 | |
477 | /** |
478 | * This method is called for parsing any top-level <em>attribute</em> object. |
479 | */ |
480 | XsdAttribute::Ptr parseGlobalAttribute(); |
481 | |
482 | /** |
483 | * This method is called for parsing any non-top-level <em>attribute</em> object as a |
484 | * descendant of a <em>complexType</em> object or an <em>attributeGroup</em> object. |
485 | * |
486 | * @param parent The parent component the <em>attribute</em> object is part of. |
487 | */ |
488 | XsdAttributeUse::Ptr parseLocalAttribute(const NamedSchemaComponent::Ptr &parent); |
489 | |
490 | /** |
491 | * This method is called for parsing a top-level <em>attributeGroup</em> object. |
492 | */ |
493 | XsdAttributeGroup::Ptr parseNamedAttributeGroup(); |
494 | |
495 | /** |
496 | * This method is called for parsing a non-top-level <em>attributeGroup</em> object |
497 | * that contains a <em>ref</em> attribute. |
498 | */ |
499 | XsdAttributeUse::Ptr parseReferredAttributeGroup(); |
500 | |
501 | /** |
502 | * This method is called for parsing any top-level <em>element</em> object. |
503 | */ |
504 | XsdElement::Ptr parseGlobalElement(); |
505 | |
506 | /** |
507 | * This method is called for parsing any non-top-level <em>element</em> object as a |
508 | * descendant of a <em>complexType</em> object or a <em>group</em> object. |
509 | * |
510 | * @param particle The particle the <em>element</em> object belongs to. |
511 | * @param parent The parent component the <em>element</em> object is part of. |
512 | */ |
513 | XsdTerm::Ptr parseLocalElement(const XsdParticle::Ptr &particle, const NamedSchemaComponent::Ptr &parent); |
514 | |
515 | /** |
516 | * This method is called for parsing a <em>unique</em> object as child of an <em>element</em> object. |
517 | */ |
518 | XsdIdentityConstraint::Ptr parseUnique(); |
519 | |
520 | /** |
521 | * This method is called for parsing a <em>key</em> object as child of an <em>element</em> object. |
522 | */ |
523 | XsdIdentityConstraint::Ptr parseKey(); |
524 | |
525 | /** |
526 | * This method is called for parsing a <em>keyref</em> object as child of an <em>element</em> object. |
527 | */ |
528 | XsdIdentityConstraint::Ptr parseKeyRef(const XsdElement::Ptr &element); |
529 | |
530 | /** |
531 | * This method is called for parsing a <em>selector</em> object as child of an <em>unique</em> object, |
532 | * <em>key</em> object or <em>keyref</em> object, |
533 | * |
534 | * @param ptr The identity constraint it belongs to. |
535 | */ |
536 | void parseSelector(const XsdIdentityConstraint::Ptr &ptr); |
537 | |
538 | /** |
539 | * This method is called for parsing a <em>field</em> object as child of an <em>unique</em> object, |
540 | * <em>key</em> object or <em>keyref</em> object, |
541 | * |
542 | * @param ptr The identity constraint it belongs to. |
543 | */ |
544 | void parseField(const XsdIdentityConstraint::Ptr &ptr); |
545 | |
546 | /** |
547 | * This method is called for parsing an <em>alternative</em> object inside an <em>element</em> object. |
548 | */ |
549 | XsdAlternative::Ptr parseAlternative(); |
550 | |
551 | /** |
552 | * This method is called for parsing a top-level <em>notation</em> object. |
553 | */ |
554 | XsdNotation::Ptr parseNotation(); |
555 | |
556 | /** |
557 | * This method is called for parsing an <em>any</em> object somewhere in |
558 | * the schema. |
559 | * |
560 | * @param particle The particle the <em>any</em> object belongs to. |
561 | */ |
562 | XsdWildcard::Ptr parseAny(const XsdParticle::Ptr &particle); |
563 | |
564 | /** |
565 | * This method is called for parsing an <em>anyAttribute</em> object somewhere in |
566 | * the schema. |
567 | */ |
568 | XsdWildcard::Ptr parseAnyAttribute(); |
569 | |
570 | /** |
571 | * This method is called for parsing unknown object as descendant of the <em>annotation</em> object. |
572 | */ |
573 | void parseUnknownDocumentation(); |
574 | |
575 | /** |
576 | * This method is called for parsing unknown object in the schema. |
577 | */ |
578 | void parseUnknown(); |
579 | |
580 | /** |
581 | * Returnes an source location for the current position. |
582 | */ |
583 | QSourceLocation currentSourceLocation() const; |
584 | |
585 | /** |
586 | * Converts a @p qualified name into a QXmlName @p name and does some error handling. |
587 | */ |
588 | void convertName(const QString &qualified, NamespaceSupport::NameType type, QXmlName &name); |
589 | |
590 | /** |
591 | * A helper method that reads in a 'name' attribute and checks it for syntactic errors. |
592 | */ |
593 | inline QString readNameAttribute(const char *elementName); |
594 | |
595 | /** |
596 | * A helper method that reads in an attribute that contains an QName and |
597 | * checks it for syntactic errors. |
598 | */ |
599 | inline QString readQNameAttribute(const QString &typeAttribute, const char *elementName); |
600 | |
601 | /** |
602 | * A helper method that reads in a namespace attribute and checks for syntactic errors. |
603 | */ |
604 | inline QString readNamespaceAttribute(const QString &attributeName, const char *elementName); |
605 | |
606 | /** |
607 | * A helper method that reads the final attribute and does correct handling of schema default definitions. |
608 | */ |
609 | inline SchemaType::DerivationConstraints readDerivationConstraintAttribute(const SchemaType::DerivationConstraints &allowedConstraints, const char *elementName); |
610 | |
611 | /** |
612 | * A helper method that reads the block attribute and does correct handling of schema default definitions. |
613 | */ |
614 | inline NamedSchemaComponent::BlockingConstraints readBlockingConstraintAttribute(const NamedSchemaComponent::BlockingConstraints &allowedConstraints, const char *elementName); |
615 | |
616 | /** |
617 | * A helper method that reads all components for a xpath expression for the current scope. |
618 | */ |
619 | XsdXPathExpression::Ptr readXPathExpression(const char *elementName); |
620 | |
621 | /** |
622 | * Describes the type of XPath that is allowed by the readXPathAttribute method. |
623 | */ |
624 | enum XPathType { |
625 | XPath20, |
626 | XPathSelector, |
627 | XPathField |
628 | }; |
629 | |
630 | /** |
631 | * A helper method that reads an attribute that represents a xpath query and does basic |
632 | * validation. |
633 | */ |
634 | QString readXPathAttribute(const QString &attributeName, XPathType type, const char *elementName); |
635 | |
636 | /** |
637 | * A helper method that reads in an "id" attribute, checks it for syntactic errors |
638 | * and tests whether a component with the same id has already been parsed. |
639 | */ |
640 | inline void validateIdAttribute(const char *elementName); |
641 | |
642 | /** |
643 | * Adds an @p element to the schema and checks for duplicated entries. |
644 | */ |
645 | void addElement(const XsdElement::Ptr &element); |
646 | |
647 | /** |
648 | * Adds an @p attribute to the schema and checks for duplicated entries. |
649 | */ |
650 | void addAttribute(const XsdAttribute::Ptr &attribute); |
651 | |
652 | /** |
653 | * Adds a @p type to the schema and checks for duplicated entries. |
654 | */ |
655 | void addType(const SchemaType::Ptr &type); |
656 | |
657 | /** |
658 | * Adds an anonymous @p type to the schema and checks for duplicated entries. |
659 | */ |
660 | void addAnonymousType(const SchemaType::Ptr &type); |
661 | |
662 | /** |
663 | * Adds an attribute @p group to the schema and checks for duplicated entries. |
664 | */ |
665 | void addAttributeGroup(const XsdAttributeGroup::Ptr &group); |
666 | |
667 | /** |
668 | * Adds an element @p group to the schema and checks for duplicated entries. |
669 | */ |
670 | void addElementGroup(const XsdModelGroup::Ptr &group); |
671 | |
672 | /** |
673 | * Adds a @p notation to the schema and checks for duplicated entries. |
674 | */ |
675 | void addNotation(const XsdNotation::Ptr ¬ation); |
676 | |
677 | /** |
678 | * Adds an identity @p constraint to the schema and checks for duplicated entries. |
679 | */ |
680 | void addIdentityConstraint(const XsdIdentityConstraint::Ptr &constraint); |
681 | |
682 | /** |
683 | * Adds the @p facet to the list of @p facets for @p type and checks for duplicates. |
684 | */ |
685 | void addFacet(const XsdFacet::Ptr &facet, XsdFacet::Hash &facets, const SchemaType::Ptr &type); |
686 | |
687 | /** |
688 | * Sets up the state machines for validating the right occurrence of xml elements. |
689 | */ |
690 | void setupStateMachines(); |
691 | |
692 | /** |
693 | * Sets up a list of names of known builtin types. |
694 | */ |
695 | void setupBuiltinTypeNames(); |
696 | |
697 | /** |
698 | * Checks whether the given @p tag is equal to the given @p token and |
699 | * the given @p namespaceToken is the XML Schema namespace. |
700 | */ |
701 | inline bool isSchemaTag(XsdSchemaToken::NodeName tag, XsdSchemaToken::NodeName token, XsdSchemaToken::NodeName namespaceToken) const; |
702 | |
703 | XsdSchemaContext::Ptr m_context; |
704 | XsdSchemaParserContext::Ptr m_parserContext; |
705 | NamePool::Ptr m_namePool; |
706 | NamespaceSupport m_namespaceSupport; |
707 | XsdSchemaResolver::Ptr m_schemaResolver; |
708 | XsdSchema::Ptr m_schema; |
709 | |
710 | QString m_targetNamespace; |
711 | QString m_attributeFormDefault; |
712 | QString m_elementFormDefault; |
713 | QString m_blockDefault; |
714 | QString m_finalDefault; |
715 | QString m_xpathDefaultNamespace; |
716 | QXmlName m_defaultAttributes; |
717 | XsdComplexType::OpenContent::Ptr m_defaultOpenContent; |
718 | bool m_defaultOpenContentAppliesToEmpty; |
719 | |
720 | NamespaceSet m_includedSchemas; |
721 | NamespaceSet m_importedSchemas; |
722 | NamespaceSet m_redefinedSchemas; |
723 | QUrl m_documentURI; |
724 | XsdIdCache::Ptr m_idCache; |
725 | QHash<XsdTagScope::Type, XsdStateMachine<XsdSchemaToken::NodeName> > m_stateMachines; |
726 | ComponentLocationHash m_componentLocationHash; |
727 | QSet<QXmlName> m_builtinTypeNames; |
728 | }; |
729 | } |
730 | |
731 | QT_END_NAMESPACE |
732 | |
733 | #endif |
734 | |