/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtXmlPatterns module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qxsdschemaparsercontext_p.h" QT_BEGIN_NAMESPACE using namespace QPatternist; XsdSchemaParserContext::XsdSchemaParserContext(const NamePool::Ptr &namePool, const XsdSchemaContext::Ptr &context) : m_namePool(namePool) , m_schema(new XsdSchema(m_namePool)) , m_checker(new XsdSchemaChecker(context, this)) , m_resolver(new XsdSchemaResolver(context, this)) , m_elementDescriptions(setupElementDescriptions()) { } NamePool::Ptr XsdSchemaParserContext::namePool() const { return m_namePool; } XsdSchemaResolver::Ptr XsdSchemaParserContext::resolver() const { return m_resolver; } XsdSchemaChecker::Ptr XsdSchemaParserContext::checker() const { return m_checker; } XsdSchema::Ptr XsdSchemaParserContext::schema() const { return m_schema; } ElementDescription::Hash XsdSchemaParserContext::elementDescriptions() const { return m_elementDescriptions; } QXmlName XsdSchemaParserContext::createAnonymousName(const QString &targetNamespace) const { m_anonymousNameCounter.ref(); const QString name = QString::fromLatin1("__AnonymousClass_%1").arg(m_anonymousNameCounter.load()); return m_namePool->allocateQName(targetNamespace, name); } ElementDescription::Hash XsdSchemaParserContext::setupElementDescriptions() { enum { ReservedForElements = 60 }; ElementDescription::Hash elementDescriptions; elementDescriptions.reserve(ReservedForElements); { ElementDescription &description = elementDescriptions[XsdTagScope::Schema]; description.optionalAttributes.reserve(10); //description.tagToken = XsdSchemaToken::Schema; description.optionalAttributes.insert(XsdSchemaToken::AttributeFormDefault); description.optionalAttributes.insert(XsdSchemaToken::BlockDefault); description.optionalAttributes.insert(XsdSchemaToken::DefaultAttributes); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); description.optionalAttributes.insert(XsdSchemaToken::ElementFormDefault); description.optionalAttributes.insert(XsdSchemaToken::FinalDefault); description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::TargetNamespace); description.optionalAttributes.insert(XsdSchemaToken::Version); description.optionalAttributes.insert(XsdSchemaToken::XmlLanguage); } { ElementDescription &description = elementDescriptions[XsdTagScope::Include]; //description.tagToken = XsdSchemaToken::Include; description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::Import]; //description.tagToken = XsdSchemaToken::Import; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Namespace); description.optionalAttributes.insert(XsdSchemaToken::SchemaLocation); } { ElementDescription &description = elementDescriptions[XsdTagScope::Redefine]; //description.tagToken = XsdSchemaToken::Redefine; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation); } { ElementDescription &description = elementDescriptions[XsdTagScope::Override]; //description.tagToken = XsdSchemaToken::Override; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::SchemaLocation); } { ElementDescription &description = elementDescriptions[XsdTagScope::Annotation]; //description.tagToken = XsdSchemaToken::Annotation; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::AppInfo]; //description.tagToken = XsdSchemaToken::Appinfo; description.optionalAttributes.insert(XsdSchemaToken::Source); } { ElementDescription &description = elementDescriptions[XsdTagScope::Documentation]; //description.tagToken = XsdSchemaToken::Documentation; description.optionalAttributes.insert(XsdSchemaToken::Source); } { ElementDescription &description = elementDescriptions[XsdTagScope::GlobalSimpleType]; //description.tagToken = XsdSchemaToken::SimpleType; description.optionalAttributes.insert(XsdSchemaToken::Final); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalSimpleType]; //description.tagToken = XsdSchemaToken::SimpleType; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::SimpleRestriction]; //description.tagToken = XsdSchemaToken::Restriction; description.optionalAttributes.insert(XsdSchemaToken::Base); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::List]; //description.tagToken = XsdSchemaToken::List; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::ItemType); } { ElementDescription &description = elementDescriptions[XsdTagScope::Union]; //description.tagToken = XsdSchemaToken::Union; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MemberTypes); } { ElementDescription &description = elementDescriptions[XsdTagScope::MinExclusiveFacet]; //description.tagToken = XsdSchemaToken::MinExclusive; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::MinInclusiveFacet]; //description.tagToken = XsdSchemaToken::MinInclusive; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::MaxExclusiveFacet]; //description.tagToken = XsdSchemaToken::MaxExclusive; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::MaxInclusiveFacet]; //description.tagToken = XsdSchemaToken::MaxInclusive; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::TotalDigitsFacet]; //description.tagToken = XsdSchemaToken::TotalDigits; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::FractionDigitsFacet]; //description.tagToken = XsdSchemaToken::FractionDigits; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::LengthFacet]; //description.tagToken = XsdSchemaToken::Length; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::MinLengthFacet]; //description.tagToken = XsdSchemaToken::MinLength; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::MaxLengthFacet]; //description.tagToken = XsdSchemaToken::MaxLength; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::EnumerationFacet]; //description.tagToken = XsdSchemaToken::Enumeration; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::WhiteSpaceFacet]; //description.tagToken = XsdSchemaToken::WhiteSpace; description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::PatternFacet]; //description.tagToken = XsdSchemaToken::Pattern; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Value); } { ElementDescription &description = elementDescriptions[XsdTagScope::GlobalComplexType]; description.optionalAttributes.reserve(7); //description.tagToken = XsdSchemaToken::ComplexType; description.optionalAttributes.insert(XsdSchemaToken::Abstract); description.optionalAttributes.insert(XsdSchemaToken::Block); description.optionalAttributes.insert(XsdSchemaToken::DefaultAttributesApply); description.optionalAttributes.insert(XsdSchemaToken::Final); description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Mixed); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalComplexType]; //description.tagToken = XsdSchemaToken::ComplexType; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Mixed); } { ElementDescription &description = elementDescriptions[XsdTagScope::SimpleContent]; //description.tagToken = XsdSchemaToken::SimpleContent; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::SimpleContentRestriction]; //description.tagToken = XsdSchemaToken::Restriction; description.requiredAttributes.insert(XsdSchemaToken::Base); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::SimpleContentExtension]; //description.tagToken = XsdSchemaToken::Extension; description.requiredAttributes.insert(XsdSchemaToken::Base); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::ComplexContent]; //description.tagToken = XsdSchemaToken::ComplexContent; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Mixed); } { ElementDescription &description = elementDescriptions[XsdTagScope::ComplexContentRestriction]; //description.tagToken = XsdSchemaToken::Restriction; description.requiredAttributes.insert(XsdSchemaToken::Base); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::ComplexContentExtension]; //description.tagToken = XsdSchemaToken::Extension; description.requiredAttributes.insert(XsdSchemaToken::Base); description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::NamedGroup]; //description.tagToken = XsdSchemaToken::Group; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::ReferredGroup]; description.optionalAttributes.reserve(4); //description.tagToken = XsdSchemaToken::Group; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); description.requiredAttributes.insert(XsdSchemaToken::Ref); } { ElementDescription &description = elementDescriptions[XsdTagScope::All]; //description.tagToken = XsdSchemaToken::All; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalAll]; //description.tagToken = XsdSchemaToken::All; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); } { ElementDescription &description = elementDescriptions[XsdTagScope::Choice]; //description.tagToken = XsdSchemaToken::Choice; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalChoice]; //description.tagToken = XsdSchemaToken::Choice; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); } { ElementDescription &description = elementDescriptions[XsdTagScope::Sequence]; //description.tagToken = XsdSchemaToken::Sequence; description.optionalAttributes.insert(XsdSchemaToken::Id); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalSequence]; //description.tagToken = XsdSchemaToken::Sequence; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); } { ElementDescription &description = elementDescriptions[XsdTagScope::GlobalAttribute]; description.optionalAttributes.reserve(5); //description.tagToken = XsdSchemaToken::Attribute; description.optionalAttributes.insert(XsdSchemaToken::Default); description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); description.optionalAttributes.insert(XsdSchemaToken::Type); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalAttribute]; description.optionalAttributes.reserve(8); //description.tagToken = XsdSchemaToken::Attribute; description.optionalAttributes.insert(XsdSchemaToken::Default); description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Form); description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Name); description.optionalAttributes.insert(XsdSchemaToken::Ref); description.optionalAttributes.insert(XsdSchemaToken::Type); description.optionalAttributes.insert(XsdSchemaToken::Use); } { ElementDescription &description = elementDescriptions[XsdTagScope::NamedAttributeGroup]; //description.tagToken = XsdSchemaToken::AttributeGroup; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::ReferredAttributeGroup]; //description.tagToken = XsdSchemaToken::AttributeGroup; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Ref); } { ElementDescription &description = elementDescriptions[XsdTagScope::LocalElement]; description.optionalAttributes.reserve(11); //description.tagToken = XsdSchemaToken::Element; description.optionalAttributes.insert(XsdSchemaToken::Block); description.optionalAttributes.insert(XsdSchemaToken::Default); description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Form); description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::Name); description.optionalAttributes.insert(XsdSchemaToken::Nillable); description.optionalAttributes.insert(XsdSchemaToken::Ref); description.optionalAttributes.insert(XsdSchemaToken::Type); } { ElementDescription &description = elementDescriptions[XsdTagScope::GlobalElement]; description.optionalAttributes.reserve(10); //description.tagToken = XsdSchemaToken::Element; description.optionalAttributes.insert(XsdSchemaToken::Abstract); description.optionalAttributes.insert(XsdSchemaToken::Block); description.optionalAttributes.insert(XsdSchemaToken::Default); description.optionalAttributes.insert(XsdSchemaToken::Final); description.optionalAttributes.insert(XsdSchemaToken::Fixed); description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); description.optionalAttributes.insert(XsdSchemaToken::Nillable); description.optionalAttributes.insert(XsdSchemaToken::SubstitutionGroup); description.optionalAttributes.insert(XsdSchemaToken::Type); } { ElementDescription &description = elementDescriptions[XsdTagScope::Unique]; //description.tagToken = XsdSchemaToken::Unique; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::Key]; //description.tagToken = XsdSchemaToken::Key; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); } { ElementDescription &description = elementDescriptions[XsdTagScope::KeyRef]; //description.tagToken = XsdSchemaToken::Keyref; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); description.requiredAttributes.insert(XsdSchemaToken::Refer); } { ElementDescription &description = elementDescriptions[XsdTagScope::Selector]; //description.tagToken = XsdSchemaToken::Selector; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Xpath); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); } { ElementDescription &description = elementDescriptions[XsdTagScope::Field]; //description.tagToken = XsdSchemaToken::Field; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Xpath); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); } { ElementDescription &description = elementDescriptions[XsdTagScope::Notation]; description.optionalAttributes.reserve(4); //description.tagToken = XsdSchemaToken::Notation; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Name); description.optionalAttributes.insert(XsdSchemaToken::Public); description.optionalAttributes.insert(XsdSchemaToken::System); } { ElementDescription &description = elementDescriptions[XsdTagScope::Any]; description.optionalAttributes.reserve(7); //description.tagToken = XsdSchemaToken::Any; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::MaxOccurs); description.optionalAttributes.insert(XsdSchemaToken::MinOccurs); description.optionalAttributes.insert(XsdSchemaToken::Namespace); description.optionalAttributes.insert(XsdSchemaToken::NotNamespace); description.optionalAttributes.insert(XsdSchemaToken::NotQName); description.optionalAttributes.insert(XsdSchemaToken::ProcessContents); } { ElementDescription &description = elementDescriptions[XsdTagScope::AnyAttribute]; description.optionalAttributes.reserve(5); //description.tagToken = XsdSchemaToken::AnyAttribute; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Namespace); description.optionalAttributes.insert(XsdSchemaToken::NotNamespace); description.optionalAttributes.insert(XsdSchemaToken::NotQName); description.optionalAttributes.insert(XsdSchemaToken::ProcessContents); } { ElementDescription &description = elementDescriptions[XsdTagScope::Alternative]; //description.tagToken = XsdSchemaToken::Alternative; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Test); description.optionalAttributes.insert(XsdSchemaToken::Type); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); } { ElementDescription &description = elementDescriptions[XsdTagScope::OpenContent]; //description.tagToken = XsdSchemaToken::OpenContent; description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Mode); } { ElementDescription &description = elementDescriptions[XsdTagScope::DefaultOpenContent]; //description.tagToken = XsdSchemaToken::DefaultOpenContent; description.optionalAttributes.insert(XsdSchemaToken::AppliesToEmpty); description.optionalAttributes.insert(XsdSchemaToken::Id); description.optionalAttributes.insert(XsdSchemaToken::Mode); } { ElementDescription &description = elementDescriptions[XsdTagScope::Assert]; //description.tagToken = XsdSchemaToken::Assert; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Test); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); } { ElementDescription &description = elementDescriptions[XsdTagScope::Assertion]; //description.tagToken = XsdSchemaToken::Assertion; description.optionalAttributes.insert(XsdSchemaToken::Id); description.requiredAttributes.insert(XsdSchemaToken::Test); description.optionalAttributes.insert(XsdSchemaToken::XPathDefaultNamespace); } Q_ASSERT_X(elementDescriptions.count() == ReservedForElements, Q_FUNC_INFO, qPrintable(QString::fromLatin1("Expected is %1, actual is %2.").arg(ReservedForElements).arg(elementDescriptions.count()))); return elementDescriptions; } QT_END_NAMESPACE