1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2015 The Qt Company Ltd. 4 ** Contact: http://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 http://www.qt.io/terms-conditions. For further 15 ** information use the contact form at http://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 2.1 or version 3 as published by the Free 20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and 21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the 22 ** following information to ensure the GNU Lesser General Public License 23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and 24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 25 ** 26 ** As a special exception, The Qt Company gives you certain additional 27 ** rights. These rights are described in The Qt Company LGPL Exception 28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 29 ** 30 ** GNU General Public License Usage 31 ** Alternatively, this file may be used under the terms of the GNU 32 ** General Public License version 3.0 as published by the Free Software 33 ** Foundation and appearing in the file LICENSE.GPL included in the 34 ** packaging of this file. Please review the following information to 35 ** ensure the GNU General Public License version 3.0 requirements will be 36 ** met: http://www.gnu.org/copyleft/gpl.html. 37 ** 38 ** $QT_END_LICENSE$ 39 ** 40 ****************************************************************************/ 41 42 // 43 // W A R N I N G 44 // ------------- 45 // 46 // This file is not part of the Qt API. It exists purely as an 47 // implementation detail. This header file may change from version to 48 // version without notice, or even be removed. 49 // 50 // We mean it. 51 52 #ifndef Patternist_XsdSchema_H 53 #define Patternist_XsdSchema_H 54 55 #include "qschematype_p.h" 56 #include "qxsdannotated_p.h" 57 #include "qxsdattribute_p.h" 58 #include "qxsdattributegroup_p.h" 59 #include "qxsdcomplextype_p.h" 60 #include "qxsdelement_p.h" 61 #include "qxsdidentityconstraint_p.h" 62 #include "qxsdmodelgroup_p.h" 63 #include "qxsdnotation_p.h" 64 #include "qxsdsimpletype_p.h" 65 66 #include <QtCore/QHash> 67 #include <QtCore/QReadWriteLock> 68 69 /** 70 * @defgroup Patternist_schema XML Schema Processing 71 */ 72 73 QT_BEGIN_HEADER 74 75 QT_BEGIN_NAMESPACE 76 77 namespace QPatternist 78 { 79 /** 80 * @short Represents a XSD schema object. 81 * 82 * The class provides access to all components of a parsed XSD. 83 * 84 * @note In the documentation of this class objects, which are direct 85 * children of the <em>schema</em> object, are called top-level objects. 86 * 87 * @see <a href="http://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/xml-schema-api.html#Interface-XSModel">XML Schema API reference</a> 88 * @ingroup Patternist_schema 89 * @author Tobias Koenig <tobias.koenig@nokia.com> 90 */ 91 class XsdSchema : public QSharedData, public XsdAnnotated 92 { 93 public: 94 typedef QExplicitlySharedDataPointer<XsdSchema> Ptr; 95 typedef QList<XsdSchema::Ptr> List; 96 97 /** 98 * Creates a new schema object. 99 * 100 * @param namePool The namepool that should be used for names of 101 * all schema components. 102 */ 103 XsdSchema(const NamePool::Ptr &namePool); 104 105 /** 106 * Destroys the schema object. 107 */ 108 ~XsdSchema(); 109 110 /** 111 * Returns the namepool that is used for names of 112 * all schema components. 113 */ 114 NamePool::Ptr namePool() const; 115 116 /** 117 * Sets the @p targetNamespace of the schema. 118 */ 119 void setTargetNamespace(const QString &targetNamespace); 120 121 /** 122 * Returns the target namespace of the schema. 123 */ 124 QString targetNamespace() const; 125 126 /** 127 * Adds a new top-level @p element to the schema. 128 * 129 * @param element The new element. 130 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-element">Element Declaration</a> 131 */ 132 void addElement(const XsdElement::Ptr &element); 133 134 /** 135 * Returns the top-level element of the schema with 136 * the given @p name or an empty pointer if none exist. 137 */ 138 XsdElement::Ptr element(const QXmlName &name) const; 139 140 /** 141 * Returns the list of all top-level elements. 142 */ 143 XsdElement::List elements() const; 144 145 /** 146 * Adds a new top-level @p attribute to the schema. 147 * 148 * @param attribute The new attribute. 149 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-attribute">Attribute Declaration</a> 150 */ 151 void addAttribute(const XsdAttribute::Ptr &attribute); 152 153 /** 154 * Returns the top-level attribute of the schema with 155 * the given @p name or an empty pointer if none exist. 156 */ 157 XsdAttribute::Ptr attribute(const QXmlName &name) const; 158 159 /** 160 * Returns the list of all top-level attributes. 161 */ 162 XsdAttribute::List attributes() const; 163 164 /** 165 * Adds a new top-level @p type to the schema. 166 * That can be a simple or a complex type. 167 * 168 * @param type The new type. 169 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-datatype">Simple Type Declaration</a> 170 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-type">Complex Type Declaration</a> 171 */ 172 void addType(const SchemaType::Ptr &type); 173 174 /** 175 * Returns the top-level type of the schema with 176 * the given @p name or an empty pointer if none exist. 177 */ 178 SchemaType::Ptr type(const QXmlName &name) const; 179 180 /** 181 * Returns the list of all top-level types. 182 */ 183 SchemaType::List types() const; 184 185 /** 186 * Returns the list of all top-level simple types. 187 */ 188 XsdSimpleType::List simpleTypes() const; 189 190 /** 191 * Returns the list of all top-level complex types. 192 */ 193 XsdComplexType::List complexTypes() const; 194 195 /** 196 * Adds an anonymous @p type to the schema. 197 * Anonymous types have no name and are declared 198 * locally inside an element object. 199 * 200 * @param type The new anonymous type. 201 */ 202 void addAnonymousType(const SchemaType::Ptr &type); 203 204 /** 205 * Returns the list of all anonymous types. 206 */ 207 SchemaType::List anonymousTypes() const; 208 209 /** 210 * Adds a new top-level attribute @p group to the schema. 211 * 212 * @param group The new attribute group. 213 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-attributeGroup">Attribute Group Declaration</a> 214 */ 215 void addAttributeGroup(const XsdAttributeGroup::Ptr &group); 216 217 /** 218 * Returns the top-level attribute group of the schema with 219 * the given @p name or an empty pointer if none exist. 220 */ 221 XsdAttributeGroup::Ptr attributeGroup(const QXmlName name) const; 222 223 /** 224 * Returns the list of all top-level attribute groups. 225 */ 226 XsdAttributeGroup::List attributeGroups() const; 227 228 /** 229 * Adds a new top-level element @p group to the schema. 230 * 231 * @param group The new element group. 232 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-namedModelGroup">Element Group Declaration</a> 233 */ 234 void addElementGroup(const XsdModelGroup::Ptr &group); 235 236 /** 237 * Returns the top-level element group of the schema with 238 * the given @p name or an empty pointer if none exist. 239 */ 240 XsdModelGroup::Ptr elementGroup(const QXmlName &name) const; 241 242 /** 243 * Returns the list of all top-level element groups. 244 */ 245 XsdModelGroup::List elementGroups() const; 246 247 /** 248 * Adds a new top-level @p notation to the schema. 249 * 250 * @param notation The new notation. 251 * @see <a href="http://www.w3.org/TR/xmlschema11-1/#declare-notation">Notation Declaration</a> 252 */ 253 void addNotation(const XsdNotation::Ptr ¬ation); 254 255 /** 256 * Returns the top-level notation of the schema with 257 * the given @p name or an empty pointer if none exist. 258 */ 259 XsdNotation::Ptr notation(const QXmlName &name) const; 260 261 /** 262 * Returns the list of all top-level notations. 263 */ 264 XsdNotation::List notations() const; 265 266 /** 267 * Adds a new identity @p constraint to the schema. 268 */ 269 void addIdentityConstraint(const XsdIdentityConstraint::Ptr &constraint); 270 271 /** 272 * Returns the identity constraint with the given @p name 273 * or an empty pointer if none exist. 274 */ 275 XsdIdentityConstraint::Ptr identityConstraint(const QXmlName &name) const; 276 277 /** 278 * Returns the list of all identity constraints in this schema. 279 */ 280 XsdIdentityConstraint::List identityConstraints() const; 281 282 private: 283 NamePool::Ptr m_namePool; 284 QString m_targetNamespace; 285 QHash<QXmlName, XsdElement::Ptr> m_elements; 286 QHash<QXmlName, XsdAttribute::Ptr> m_attributes; 287 QHash<QXmlName, SchemaType::Ptr> m_types; 288 QHash<QXmlName, SchemaType::Ptr> m_anonymousTypes; 289 QHash<QXmlName, XsdAttributeGroup::Ptr> m_attributeGroups; 290 QHash<QXmlName, XsdModelGroup::Ptr> m_elementGroups; 291 QHash<QXmlName, XsdNotation::Ptr> m_notations; 292 QHash<QXmlName, XsdIdentityConstraint::Ptr> m_identityConstraints; 293 mutable QReadWriteLock m_lock; 294 }; 295 } 296 297 QT_END_NAMESPACE 298 299 QT_END_HEADER 300 301 #endif 302