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_XsdComplexType_H
51#define Patternist_XsdComplexType_H
52
53#include <private/qanytype_p.h>
54#include <private/qxsdassertion_p.h>
55#include <private/qxsdattributeuse_p.h>
56#include <private/qxsdparticle_p.h>
57#include <private/qxsdsimpletype_p.h>
58#include <private/qxsduserschematype_p.h>
59#include <private/qxsdwildcard_p.h>
60
61#include <QtCore/QSet>
62
63QT_BEGIN_NAMESPACE
64
65namespace QPatternist
66{
67 /**
68 * @short Represents a XSD complexType object.
69 *
70 * This class represents the <em>complexType</em> object of a XML schema as described
71 * <a href="http://www.w3.org/TR/xmlschema11-1/#Complex_Type_Definitions">here</a>.
72 *
73 * It contains information from either a top-level complex type declaration (as child of a <em>schema</em> object)
74 * or a local complex type declaration (as descendant of an <em>element</em> object).
75 *
76 * @see <a href="http://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/xml-schema-api.html#Interface-XSComplexType">XML Schema API reference</a>
77 * @ingroup Patternist_schema
78 * @author Tobias Koenig <tobias.koenig@nokia.com>
79 */
80 class XsdComplexType : public XsdUserSchemaType<AnyType>
81 {
82 public:
83 typedef QExplicitlySharedDataPointer<XsdComplexType> Ptr;
84
85 /**
86 * @short Describes the open content object of a complex type.
87 *
88 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ct-open_content">Open Content Definition</a>
89 */
90 class OpenContent : public QSharedData, public XsdAnnotated
91 {
92 public:
93 typedef QExplicitlySharedDataPointer<OpenContent> Ptr;
94
95 /**
96 * Describes the mode of the open content.
97 *
98 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#oc-mode">Mode Definition</a>
99 */
100 enum Mode
101 {
102 None,
103 Interleave,
104 Suffix
105 };
106
107 /**
108 * Sets the @p mode of the open content.
109 *
110 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#oc-mode">Mode Definition</a>
111 */
112 void setMode(Mode mode);
113
114 /**
115 * Returns the mode of the open content.
116 */
117 Mode mode() const;
118
119 /**
120 * Sets the @p wildcard of the open content.
121 *
122 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#oc-wildcard">Wildcard Definition</a>
123 */
124 void setWildcard(const XsdWildcard::Ptr &wildcard);
125
126 /**
127 * Returns the wildcard of the open content.
128 */
129 XsdWildcard::Ptr wildcard() const;
130
131 private:
132 Mode m_mode;
133 XsdWildcard::Ptr m_wildcard;
134 };
135
136 /**
137 * @short Describes the content type of a complex type.
138 */
139 class ContentType : public QSharedData
140 {
141 public:
142 typedef QExplicitlySharedDataPointer<ContentType> Ptr;
143
144 /**
145 * Describes the variety of the content type.
146 */
147 enum Variety
148 {
149 Empty = 0, ///< The complex type has no further content.
150 Simple, ///< The complex type has only simple type content (e.g. text, number etc.)
151 ElementOnly, ///< The complex type has further elements or attributes but no text as content.
152 Mixed ///< The complex type has further elements or attributes and text as content.
153 };
154
155 /**
156 * Sets the @p variety of the content type.
157 *
158 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ct-variety">Variety Definition</a>
159 */
160 void setVariety(Variety variety);
161
162 /**
163 * Returns the variety of the content type.
164 */
165 Variety variety() const;
166
167 /**
168 * Sets the @p particle object of the content type.
169 *
170 * The content type has only a particle object if
171 * its variety is ElementOnly or Mixed.
172 *
173 * @see XsdParticle
174 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ct-particle">Particle Declaration</a>
175 */
176 void setParticle(const XsdParticle::Ptr &particle);
177
178 /**
179 * Returns the particle object of the content type,
180 * or an empty pointer if its variety is neither
181 * ElementOnly nor Mixed.
182 */
183 XsdParticle::Ptr particle() const;
184
185 /**
186 * Sets the open @p content object of the content type.
187 *
188 * The content type has only an open content object if
189 * its variety is ElementOnly or Mixed.
190 *
191 * @see OpenContent
192 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ct-open_content">Open Content Declaration</a>
193 */
194 void setOpenContent(const OpenContent::Ptr &content);
195
196 /**
197 * Returns the open content object of the content type,
198 * or an empty pointer if its variety is neither
199 * ElementOnly nor Mixed.
200 */
201 OpenContent::Ptr openContent() const;
202
203 /**
204 * Sets the simple @p type object of the content type.
205 *
206 * The content type has only a simple type object if
207 * its variety is Simple.
208 *
209 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ct-simple_type_definition">Simple Type Definition</a>
210 */
211 void setSimpleType(const AnySimpleType::Ptr &type);
212
213 /**
214 * Returns the simple type object of the content type,
215 * or an empty pointer if its variety is not Simple.
216 */
217 AnySimpleType::Ptr simpleType() const;
218
219 private:
220 Variety m_variety;
221 XsdParticle::Ptr m_particle;
222 OpenContent::Ptr m_openContent;
223 XsdSimpleType::Ptr m_simpleType;
224 };
225
226
227 /**
228 * Creates a complex type object with empty content.
229 */
230 XsdComplexType();
231
232 /**
233 * Destroys the complex type object.
234 */
235 ~XsdComplexType() {};
236
237 /**
238 * Returns the display name of the complex type.
239 *
240 * The display name can be used to show the type name
241 * to the user.
242 *
243 * @param namePool The name pool where the type name is stored in.
244 */
245 virtual QString displayName(const NamePool::Ptr &namePool) const;
246
247 /**
248 * Sets the base type of the complex type.
249 *
250 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-base_type_definition">Base Type Definition</a>
251 */
252 void setWxsSuperType(const SchemaType::Ptr &type);
253
254 /**
255 * Returns the base type of the complex type.
256 */
257 virtual SchemaType::Ptr wxsSuperType() const;
258
259 /**
260 * Sets the context @p component of the complex type.
261 *
262 * The component is either an element declaration or a complex type definition.
263 */
264 void setContext(const NamedSchemaComponent::Ptr &component);
265
266 /**
267 * Returns the context component of the complex type.
268 */
269 NamedSchemaComponent::Ptr context() const;
270
271 /**
272 * Sets the derivation @p method of the complex type.
273 *
274 * The derivation method depends on whether the complex
275 * type object has an extension or restriction object as child.
276 *
277 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-derivation_method">Derivation Method Definition</a>
278 * @see DerivationMethod
279 */
280 void setDerivationMethod(DerivationMethod method);
281
282 /**
283 * Returns the derivation method of the complex type.
284 */
285 virtual DerivationMethod derivationMethod() const;
286
287 /**
288 * Sets whether the complex type is @p abstract.
289 *
290 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-abstract">Abstract Definition</a>
291 */
292 void setIsAbstract(bool abstract);
293
294 /**
295 * Returns whether the complex type is abstract.
296 */
297 virtual bool isAbstract() const;
298
299 /**
300 * Sets the list of all attribute @p uses of the complex type.
301 *
302 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-attribute_uses">Attribute Uses Declaration</a>
303 */
304 void setAttributeUses(const XsdAttributeUse::List &uses);
305
306 /**
307 * Adds a new attribute @p use to the complex type.
308 */
309 void addAttributeUse(const XsdAttributeUse::Ptr &use);
310
311 /**
312 * Returns the list of all attribute uses of the complex type.
313 */
314 XsdAttributeUse::List attributeUses() const;
315
316 /**
317 * Sets the attribute @p wildcard of the complex type.
318 *
319 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-attribute_wildcard">Attribute Wildcard Declaration</a>
320 */
321 void setAttributeWildcard(const XsdWildcard::Ptr &wildcard);
322
323 /**
324 * Returns the attribute wildcard of the complex type.
325 */
326 XsdWildcard::Ptr attributeWildcard() const;
327
328 /**
329 * Always returns SchemaType::ComplexType
330 */
331 virtual TypeCategory category() const;
332
333 /**
334 * Sets the content @p type of the complex type.
335 *
336 * @see ContentType
337 */
338 void setContentType(const ContentType::Ptr &type);
339
340 /**
341 * Returns the content type of the complex type.
342 */
343 ContentType::Ptr contentType() const;
344
345 /**
346 * Sets the prohibited @p substitutions of the complex type.
347 *
348 * Only ExtensionConstraint and RestrictionConstraint are allowed.
349 *
350 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-prohibited_substitutions">Prohibited Substitutions Definition</a>
351 */
352 void setProhibitedSubstitutions(const BlockingConstraints &substitutions);
353
354 /**
355 * Returns the prohibited substitutions of the complex type.
356 */
357 BlockingConstraints prohibitedSubstitutions() const;
358
359 /**
360 * Sets the @p assertions of the complex type.
361 *
362 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-assertions">Assertions Definition</a>
363 */
364 void setAssertions(const XsdAssertion::List &assertions);
365
366 /**
367 * Adds an @p assertion to the complex type.
368 *
369 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#ctd-assertions">Assertions Definition</a>
370 */
371 void addAssertion(const XsdAssertion::Ptr &assertion);
372
373 /**
374 * Returns the assertions of the complex type.
375 */
376 XsdAssertion::List assertions() const;
377
378 /**
379 * Always returns @c true.
380 */
381 virtual bool isDefinedBySchema() const;
382
383 private:
384 SchemaType::Ptr m_superType;
385 NamedSchemaComponent::Ptr m_context;
386 DerivationMethod m_derivationMethod;
387 bool m_isAbstract;
388 XsdAttributeUse::List m_attributeUses;
389 XsdWildcard::Ptr m_attributeWildcard;
390 ContentType::Ptr m_contentType;
391 BlockingConstraints m_prohibitedSubstitutions;
392 XsdAssertion::List m_assertions;
393 };
394}
395
396QT_END_NAMESPACE
397
398#endif
399

source code of qtxmlpatterns/src/xmlpatterns/schema/qxsdcomplextype_p.h