From da2c5f0abfe5eb59d4e507f5da2485e78ee030b9 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 25 Feb 2021 19:56:29 +0100 Subject: [PATCH] TypeStatement takes a QName argument YANG 'type' statement has effective semantics attached to the namespace where it is defined. These need to be captured into a correct QName, so that users trying to infere on top of TypeEffectiveStatement do not need to deal with interpreting the value. We even make it exceedingly difficult, as the statements have an 'exact replica' policy, hence the argument namespace is no way related to parent namespace. Change argument mapping of 'type' from String to QName. Introduce the corresponding EffectiveStatementNamespace as well. This changes the behavior of nested union typedefinitions, where we would be confused as to the nested base type's namespace: since it is a plain reference, it has to point to the YANG namespace, not the model's. JIRA: YANGTOOLS-1117 Change-Id: Ib44cb2796ba11de4a20d86c382d25e753c61279e Signed-off-by: Robert Varga --- .../yang/model/api/TypeDefinition.java | 3 + .../api/stmt/TypeEffectiveStatement.java | 11 +- .../yang/model/api/stmt/TypeStatement.java | 3 +- .../api/stmt/TypedefEffectiveStatement.java | 7 +- .../yang/model/api/stmt/TypedefNamespace.java | 34 +++++ .../model/api/type/BinaryTypeDefinition.java | 7 - .../model/api/type/BitsTypeDefinition.java | 7 - .../model/api/type/BooleanTypeDefinition.java | 7 - .../model/api/type/DecimalTypeDefinition.java | 7 - .../model/api/type/EmptyTypeDefinition.java | 7 - .../model/api/type/EnumTypeDefinition.java | 7 - .../api/type/IdentityrefTypeDefinition.java | 7 - .../InstanceIdentifierTypeDefinition.java | 7 - .../model/api/type/Int16TypeDefinition.java | 7 - .../model/api/type/Int32TypeDefinition.java | 7 - .../model/api/type/Int64TypeDefinition.java | 7 - .../model/api/type/Int8TypeDefinition.java | 7 - .../model/api/type/LeafrefTypeDefinition.java | 10 +- .../model/api/type/StringTypeDefinition.java | 7 - .../yang/model/api/type/TypeDefinitions.java | 103 ++++++++++++++- .../model/api/type/Uint16TypeDefinition.java | 7 - .../model/api/type/Uint32TypeDefinition.java | 7 - .../model/api/type/Uint64TypeDefinition.java | 7 - .../model/api/type/Uint8TypeDefinition.java | 7 - .../model/api/type/UnionTypeDefinition.java | 7 - .../src/main/java/module-info.java | 3 +- .../model/ri/stmt/DeclaredStatements.java | 6 +- .../ri/stmt/impl/decl/EmptyTypeStatement.java | 9 +- .../stmt/impl/decl/RegularTypeStatement.java | 9 +- .../eff/TypedefEffectiveStatementImpl.java | 4 +- .../yang/model/ri/type/BaseBinaryType.java | 3 +- .../yang/model/ri/type/BaseBooleanType.java | 3 +- .../yang/model/ri/type/BaseEmptyType.java | 3 +- .../ri/type/BaseInstanceIdentifierType.java | 3 +- .../yang/model/ri/type/BaseInt16Type.java | 3 +- .../yang/model/ri/type/BaseInt32Type.java | 3 +- .../yang/model/ri/type/BaseInt64Type.java | 3 +- .../yang/model/ri/type/BaseInt8Type.java | 3 +- .../yang/model/ri/type/BaseStringType.java | 3 +- .../yang/model/ri/type/BaseUint16Type.java | 3 +- .../yang/model/ri/type/BaseUint32Type.java | 3 +- .../yang/model/ri/type/BaseUint64Type.java | 3 +- .../yang/model/ri/type/BaseUint8Type.java | 3 +- .../yang/model/ri/type/BinaryTypeTest.java | 3 +- .../yang/model/ri/type/BooleanTypeTest.java | 3 +- .../yang/model/ri/type/EmptyTypeTest.java | 3 +- .../parser/stmt/reactor/ReactorStmtCtx.java | 4 +- ...stractIdentityRefSpecificationSupport.java | 21 +-- .../AbstractLeafrefSpecificationSupport.java | 18 +-- .../type/AbstractTypeStatementSupport.java | 122 ++++++------------ .../stmt/type/AbstractTypeSupport.java | 71 ++++++++++ .../stmt/type/BitsSpecificationImpl.java | 10 +- .../stmt/type/BitsSpecificationSupport.java | 17 +-- .../stmt/type/BuiltinEffectiveStatement.java | 5 +- .../stmt/type/BuiltinTypeStatement.java | 47 ++++--- .../stmt/type/Decimal64SpecificationImpl.java | 9 +- .../type/Decimal64SpecificationSupport.java | 17 +-- .../type/EmptyIdentifierSpecification.java | 9 +- .../stmt/type/EnumSpecificationImpl.java | 10 +- .../stmt/type/EnumSpecificationSupport.java | 17 +-- .../type/IdentityRefSpecificationImpl.java | 9 +- ...entityRefSpecificationRFC7950Support.java} | 2 +- ...nstanceIdentifierSpecificationSupport.java | 19 +-- .../stmt/type/LeafrefSpecificationImpl.java | 9 +- ...egularInstanceIdentifierSpecification.java | 9 +- .../stmt/type/TypeEffectiveStatementImpl.java | 3 +- .../type/TypeStatementRFC7950Support.java | 5 +- .../stmt/type/UnionSpecificationImpl.java | 9 +- .../stmt/type/UnionSpecificationSupport.java | 21 ++- .../yangtools/yang/stmt/AugmentTest.java | 4 +- .../yang/stmt/DeclaredStatementsTest.java | 2 +- .../yang/stmt/TypedefConstraintsTest.java | 5 +- .../yangtools/yang/stmt/YangParserTest.java | 3 +- 73 files changed, 446 insertions(+), 407 deletions(-) create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefNamespace.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeSupport.java rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/{IdentityrefSpecificationRFC7950Support.java => IdentityRefSpecificationRFC7950Support.java} (93%) diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeDefinition.java index 341f78a120..a972c423b4 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/TypeDefinition.java @@ -27,6 +27,9 @@ import java.util.Optional; * type of the base type (YANG type substatement) which * is included in the instance of this type */ +// FIXME: 8.0.0: it seems this construct is mostly used in yang-data-api/codec view of the world. Introduce a dead +// ringer interface at that layer, which will not have a SchemaNode implication but (perhaps) is backed +// by a TypedefEffectiveStatement (or TypeEffectiveStatement?) public interface TypeDefinition> extends SchemaNode { /** * Returns the base type from which this type is derived. If this is yang built-in type, returns null. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeEffectiveStatement.java index 847d982e50..7536a843e3 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeEffectiveStatement.java @@ -7,12 +7,19 @@ */ package org.opendaylight.yangtools.yang.model.api.stmt; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; -public interface TypeEffectiveStatement extends EffectiveStatement, - TypeDefinitionAware { +/** + * Effective view of a {@code type} statement. It's {@link #argument()} points to a {@link TypedefNamespace}'s namespace + * of this statements ancestor hierarchy. + * + * @param {@link TypeStatement} specialization + */ +public interface TypeEffectiveStatement + extends EffectiveStatement, TypeDefinitionAware { @Override default StatementDefinition statementDefinition() { return YangStmtMapping.TYPE; diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeStatement.java index 73559549f2..78d6d3d970 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypeStatement.java @@ -11,12 +11,13 @@ import java.util.Collection; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Rfc6020AbnfRule("type-stmt") -public interface TypeStatement extends DeclaredStatement { +public interface TypeStatement extends DeclaredStatement { @Override default StatementDefinition statementDefinition() { return YangStmtMapping.TYPE; diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefEffectiveStatement.java index b14059a45d..5391fa181e 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefEffectiveStatement.java @@ -9,15 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; /** - * Effective model statement which should be used to derive application behaviour related to typedefs. + * Effective model statement which should be used to derive application behaviour related to {@code typedef}s. + * All statements form the {@link TypedefNamespace}. */ -public interface TypedefEffectiveStatement extends EffectiveStatement, TypeDefinitionAware { +public interface TypedefEffectiveStatement extends NamespacedEffectiveStatement, TypeDefinitionAware { @Override default StatementDefinition statementDefinition() { return YangStmtMapping.TYPEDEF; diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefNamespace.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefNamespace.java new file mode 100644 index 0000000000..18f3371402 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/TypedefNamespace.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.api.stmt; + +import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; + +/** + * Namespace of available {@code typedef}s inside of an {@link EffectiveStatement}. It holds that statement's + * {@code typedef} substatements. This constitutes the statament's contribution to the following in accordance with + * RFC7950 section 6.2.1: + *
+ *     All derived type names defined within a parent node or at the top
+ *     level of the module or its submodules share the same type
+ *     identifier namespace.  This namespace is scoped to all descendant
+ *     nodes of the parent node or module.  This means that any
+ *     descendant node may use that typedef, and it MUST NOT define a
+ *     typedef with the same name.
+ * 
+ * + * @author Robert Varga + */ +@Beta +// FIXME: 7.0.0: add indexing of this namespace to yang-model-spi +public abstract class TypedefNamespace extends EffectiveStatementNamespace { + private TypedefNamespace() { + // Should never be instantiated + } +} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BinaryTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BinaryTypeDefinition.java index 767c728d87..25101038b8 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BinaryTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BinaryTypeDefinition.java @@ -10,8 +10,6 @@ package org.opendaylight.yangtools.yang.model.api.type; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * The binary built-in type represents any binary data, i.e., a sequence of octets. Binary values are encoded with the @@ -24,11 +22,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * [RFC-6020] The binary Built-In Type */ public interface BinaryTypeDefinition extends LengthRestrictedTypeDefinition { - /** - * Well-known QName of the {@code binary} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "binary").intern(); - static String toString(final @NonNull BinaryTypeDefinition type) { return TypeDefinitions.toStringHelper(type).add("length", type.getLengthConstraint().orElse(null)).toString(); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BitsTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BitsTypeDefinition.java index e8d98ae92e..230e76b912 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BitsTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BitsTypeDefinition.java @@ -11,9 +11,7 @@ import java.util.Collection; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.DocumentedNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -21,11 +19,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; * Makes is possible to access to the individual bits values of this type. */ public interface BitsTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code bits} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "bits").intern(); - /** * Returns all bit values. * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BooleanTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BooleanTypeDefinition.java index 4a7eb2bbf5..5ae6251654 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BooleanTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/BooleanTypeDefinition.java @@ -9,19 +9,12 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; /** * Marker interface which marks that type definition represents the built-in YANG {@code boolean} type. */ public interface BooleanTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code boolean} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "boolean").intern(); - static int hashCode(final @NonNull BooleanTypeDefinition type) { return TypeDefinitions.basicHashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/DecimalTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/DecimalTypeDefinition.java index 3a2e73ca9f..e548f4eeeb 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/DecimalTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/DecimalTypeDefinition.java @@ -9,19 +9,12 @@ package org.opendaylight.yangtools.yang.model.api.type; import java.math.BigDecimal; import java.util.Objects; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Contains methods for getting data from the YANG type substatement for decimal64 built-in * type. */ public interface DecimalTypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code decimal64} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "decimal64").intern(); - /** * Returns integer between 1 and 18 inclusively. * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EmptyTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EmptyTypeDefinition.java index 1648bf2d15..d568e7c621 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EmptyTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EmptyTypeDefinition.java @@ -9,16 +9,9 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; public interface EmptyTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code empty} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "empty").intern(); - static int hashCode(final @NonNull EmptyTypeDefinition type) { return TypeDefinitions.basicHashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EnumTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EnumTypeDefinition.java index 67448df4c8..05d4ac3f9d 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EnumTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/EnumTypeDefinition.java @@ -11,8 +11,6 @@ import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.DocumentedNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -20,11 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; * Makes is possible to access to the individual enumeration values of this type. */ public interface EnumTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code enumeration} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "enumeration").intern(); - /** * Contains the methods for accessing the data about the concrete enumeration item which represents {@code enum} * YANG type. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/IdentityrefTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/IdentityrefTypeDefinition.java index 573c2bf065..0f572d22b1 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/IdentityrefTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/IdentityrefTypeDefinition.java @@ -11,8 +11,6 @@ import java.util.Objects; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -20,11 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; * Contains method for getting data from identityref built-in YANG type. */ public interface IdentityrefTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code identityref} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "identityref").intern(); - /** * Returns the set of identities this reference points to. * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java index e0de16bf6a..e828f192d5 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java @@ -10,19 +10,12 @@ package org.opendaylight.yangtools.yang.model.api.type; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Contains methods for getting data from the instance-identifier YANG built-in type. */ public interface InstanceIdentifierTypeDefinition extends RequireInstanceRestrictedTypeDefinition { - /** - * Well-known QName of the {@code instance-identifier} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "instance-identifier").intern(); - static int hashCode(final @NonNull InstanceIdentifierTypeDefinition type) { return Objects.hash(type.getQName(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits().orElse(null), type.getDefaultValue().orElse(null), type.requireInstance()); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int16TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int16TypeDefinition.java index 10d98c1e17..4ec598e017 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int16TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int16TypeDefinition.java @@ -9,8 +9,6 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from int16 type. @@ -18,11 +16,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Int16TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code int16} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "int16").intern(); - static int hashCode(final @NonNull Int16TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int32TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int32TypeDefinition.java index 3d252683b7..64fc002d65 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int32TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int32TypeDefinition.java @@ -9,8 +9,6 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from int32 type. @@ -18,11 +16,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Int32TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code int32} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "int32").intern(); - static int hashCode(final @NonNull Int32TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int64TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int64TypeDefinition.java index 8a260f904d..4e466b9ac9 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int64TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int64TypeDefinition.java @@ -9,8 +9,6 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from int64 type. @@ -18,11 +16,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Int64TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code int64} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "int64").intern(); - static int hashCode(final @NonNull Int64TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int8TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int8TypeDefinition.java index a830f4b6cc..8f415c0221 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int8TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Int8TypeDefinition.java @@ -9,8 +9,6 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from int8 type. @@ -18,11 +16,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Int8TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code int8} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "int8").intern(); - static int hashCode(final @NonNull Int8TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java index 777f308920..de0d753ce0 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java @@ -10,17 +10,15 @@ package org.opendaylight.yangtools.yang.model.api.type; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.PathExpression; public interface LeafrefTypeDefinition extends RequireInstanceRestrictedTypeDefinition { /** - * Well-known QName of the {@code leafref} built-in type. + * Return the {@link PathExpression} of this {@code leafref}. + * + * @return A path expression */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "leafref").intern(); - - PathExpression getPathStatement(); + @NonNull PathExpression getPathStatement(); /** * {@inheritDoc} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/StringTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/StringTypeDefinition.java index cab16512e9..0772d5bb94 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/StringTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/StringTypeDefinition.java @@ -11,18 +11,11 @@ import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Contains method for getting data from the string YANG built-in type. */ public interface StringTypeDefinition extends LengthRestrictedTypeDefinition { - /** - * Well-known QName of the {@code string} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "string").intern(); - /** * Returns patterns specified in the string. * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/TypeDefinitions.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/TypeDefinitions.java index 18fcc07ecc..13a1334e7d 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/TypeDefinitions.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/TypeDefinitions.java @@ -7,14 +7,115 @@ */ package org.opendaylight.yangtools.yang.model.api.type; +import static org.opendaylight.yangtools.yang.common.YangConstants.RFC6020_YANG_MODULE; + +import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -final class TypeDefinitions { +@Beta +public final class TypeDefinitions { + /** + * Well-known QName of the {@code binary} built-in type. + */ + public static final @NonNull QName BINARY = QName.create(RFC6020_YANG_MODULE, "binary").intern(); + + /** + * Well-known QName of the {@code bits} built-in type. + */ + public static final @NonNull QName BITS = QName.create(RFC6020_YANG_MODULE, "bits").intern(); + + /** + * Well-known QName of the {@code boolean} built-in type. + */ + public static final @NonNull QName BOOLEAN = QName.create(RFC6020_YANG_MODULE, "boolean").intern(); + + /** + * Well-known QName of the {@code decimal64} built-in type. + */ + public static final @NonNull QName DECIMAL64 = QName.create(RFC6020_YANG_MODULE, "decimal64").intern(); + + /** + * Well-known QName of the {@code empty} built-in type. + */ + public static final @NonNull QName EMPTY = QName.create(RFC6020_YANG_MODULE, "empty").intern(); + + /** + * Well-known QName of the {@code enumeration} built-in type. + */ + public static final @NonNull QName ENUMERATION = QName.create(RFC6020_YANG_MODULE, "enumeration").intern(); + + /** + * Well-known QName of the {@code identityref} built-in type. + */ + public static final @NonNull QName IDENTITYREF = QName.create(RFC6020_YANG_MODULE, "identityref").intern(); + + /** + * Well-known QName of the {@code int8} built-in type. + */ + public static final @NonNull QName INT8 = QName.create(RFC6020_YANG_MODULE, "int8").intern(); + + /** + * Well-known QName of the {@code int16} built-in type. + */ + public static final @NonNull QName INT16 = QName.create(RFC6020_YANG_MODULE, "int16").intern(); + + /** + * Well-known QName of the {@code int32} built-in type. + */ + public static final @NonNull QName INT32 = QName.create(RFC6020_YANG_MODULE, "int32").intern(); + + /** + * Well-known QName of the {@code int64} built-in type. + */ + public static final @NonNull QName INT64 = QName.create(RFC6020_YANG_MODULE, "int64").intern(); + + /** + * Well-known QName of the {@code string} built-in type. + */ + public static final @NonNull QName STRING = QName.create(RFC6020_YANG_MODULE, "string").intern(); + + /** + * Well-known QName of the {@code union} built-in type. + */ + public static final @NonNull QName UNION = QName.create(RFC6020_YANG_MODULE, "union").intern(); + + /** + * Well-known QName of the {@code leafref} built-in type. + */ + public static final @NonNull QName LEAFREF = QName.create(RFC6020_YANG_MODULE, "leafref").intern(); + + /** + * Well-known QName of the {@code instance-identifier} built-in type. + */ + public static final @NonNull QName INSTANCE_IDENTIFIER = QName.create(RFC6020_YANG_MODULE, "instance-identifier") + .intern(); + + /** + * Well-known QName of the {@code uint8} built-in type. + */ + public static final @NonNull QName UINT8 = QName.create(RFC6020_YANG_MODULE, "uint8").intern(); + + /** + * Well-known QName of the {@code uint16} built-in type. + */ + public static final @NonNull QName UINT16 = QName.create(RFC6020_YANG_MODULE, "uint16").intern(); + + /** + * Well-known QName of the {@code uint32} built-in type. + */ + public static final @NonNull QName UINT32 = QName.create(RFC6020_YANG_MODULE, "uint32").intern(); + + /** + * Well-known QName of the {@code uint64} built-in type. + */ + public static final @NonNull QName UINT64 = QName.create(RFC6020_YANG_MODULE, "uint64").intern(); + private TypeDefinitions() { // Hidden on purpose } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint16TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint16TypeDefinition.java index 06c5f92a1e..4da9b0e35d 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint16TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint16TypeDefinition.java @@ -9,9 +9,7 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint16; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from uint16 type. @@ -19,11 +17,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Uint16TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code uint16} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "uint16").intern(); - static int hashCode(final @NonNull Uint16TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint32TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint32TypeDefinition.java index 43ccf2d925..5a1ebd8aac 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint32TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint32TypeDefinition.java @@ -9,9 +9,7 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from uint32 type. @@ -19,11 +17,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Uint32TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code uint32} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "uint32").intern(); - static int hashCode(final @NonNull Uint32TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint64TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint64TypeDefinition.java index 16da42267c..8f9a97a047 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint64TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint64TypeDefinition.java @@ -9,9 +9,7 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint64; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from uint64 type. @@ -19,11 +17,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Uint64TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code uint64} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "uint64").intern(); - static int hashCode(final @NonNull Uint64TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint8TypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint8TypeDefinition.java index 8b7cb1b762..a4fe95c241 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint8TypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/Uint8TypeDefinition.java @@ -9,9 +9,7 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint8; -import org.opendaylight.yangtools.yang.common.YangConstants; /** * Type definition derived from uint8 type. @@ -19,11 +17,6 @@ import org.opendaylight.yangtools.yang.common.YangConstants; * @author Robert Varga */ public interface Uint8TypeDefinition extends RangeRestrictedTypeDefinition { - /** - * Well-known QName of the {@code uint8} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "uint8").intern(); - static int hashCode(final @NonNull Uint8TypeDefinition type) { return TypeDefinitions.hashCode(type); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/UnionTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/UnionTypeDefinition.java index 8c88c70cca..f739c81bb2 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/UnionTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/UnionTypeDefinition.java @@ -9,19 +9,12 @@ package org.opendaylight.yangtools.yang.model.api.type; import java.util.List; import java.util.Objects; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; /** * Contains the method which access union item in the union type. */ public interface UnionTypeDefinition extends TypeDefinition { - /** - * Well-known QName of the {@code union} built-in type. - */ - QName QNAME = QName.create(YangConstants.RFC6020_YANG_MODULE, "union").intern(); - /** * Returns type definitions which represent the values of the arguments for all YANG {@code type} substatement in * the main {@code union} statement. diff --git a/yang/yang-model-ri/src/main/java/module-info.java b/yang/yang-model-ri/src/main/java/module-info.java index 379c16e755..15b9b30b3f 100644 --- a/yang/yang-model-ri/src/main/java/module-info.java +++ b/yang/yang-model-ri/src/main/java/module-info.java @@ -15,8 +15,9 @@ module org.opendaylight.yangtools.yang.model.ri { requires transitive org.opendaylight.yangtools.yang.model.api; requires transitive org.opendaylight.yangtools.yang.repo.api; requires com.google.common; - requires org.opendaylight.yangtools.yang.model.spi; requires org.opendaylight.yangtools.concepts; + requires org.opendaylight.yangtools.yang.common; + requires org.opendaylight.yangtools.yang.model.spi; requires org.slf4j; // Annotations diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/DeclaredStatements.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/DeclaredStatements.java index a3a6f849c3..ce88e87109 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/DeclaredStatements.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/DeclaredStatements.java @@ -639,10 +639,10 @@ public final class DeclaredStatements { return new SubmoduleStatementImpl(rawArgument, argument, substatements); } - public static TypeStatement createType(final String argument, + public static TypeStatement createType(final String rawArgument, final QName argument, final ImmutableList> substatements) { - return substatements.isEmpty() ? new EmptyTypeStatement(argument) - : new RegularTypeStatement(argument, substatements); + return substatements.isEmpty() ? new EmptyTypeStatement(rawArgument, argument) + : new RegularTypeStatement(rawArgument, argument, substatements); } public static TypedefStatement createTypedef(final QName argument, diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/EmptyTypeStatement.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/EmptyTypeStatement.java index fcc6bc3165..bceb41ff93 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/EmptyTypeStatement.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/EmptyTypeStatement.java @@ -7,11 +7,12 @@ */ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument; -public final class EmptyTypeStatement extends WithRawStringArgument implements TypeStatement { - public EmptyTypeStatement(final String rawArgument) { - super(rawArgument); +public final class EmptyTypeStatement extends WithArgument implements TypeStatement { + public EmptyTypeStatement(final String rawArgument, final QName argument) { + super(rawArgument, argument); } } diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/RegularTypeStatement.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/RegularTypeStatement.java index 7307b5c2a0..77363dced6 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/RegularTypeStatement.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/decl/RegularTypeStatement.java @@ -8,13 +8,14 @@ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -public final class RegularTypeStatement extends WithSubstatements implements TypeStatement { - public RegularTypeStatement(final String rawArgument, +public final class RegularTypeStatement extends WithSubstatements implements TypeStatement { + public RegularTypeStatement(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/TypedefEffectiveStatementImpl.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/TypedefEffectiveStatementImpl.java index 4b0e9f68f2..44c5eff532 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/TypedefEffectiveStatementImpl.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/TypedefEffectiveStatementImpl.java @@ -167,8 +167,8 @@ public final class TypedefEffectiveStatementImpl extends Default implements BinaryTypeDefinition { static final @NonNull BaseBinaryType INSTANCE = new BaseBinaryType(); private BaseBinaryType() { - super(QNAME); + super(TypeDefinitions.BINARY); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseBooleanType.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseBooleanType.java index 5dc0db8508..b198bacc7a 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseBooleanType.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseBooleanType.java @@ -9,12 +9,13 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseBooleanType extends AbstractBaseType implements BooleanTypeDefinition { static final @NonNull BaseBooleanType INSTANCE = new BaseBooleanType(); private BaseBooleanType() { - super(QNAME); + super(TypeDefinitions.BOOLEAN); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseEmptyType.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseEmptyType.java index e55f93fc3a..56774ea739 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseEmptyType.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseEmptyType.java @@ -9,12 +9,13 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseEmptyType extends AbstractBaseType implements EmptyTypeDefinition { static final @NonNull BaseEmptyType INSTANCE = new BaseEmptyType(); private BaseEmptyType() { - super(QNAME); + super(TypeDefinitions.EMPTY); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInstanceIdentifierType.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInstanceIdentifierType.java index df698c28ac..5afcd12e5d 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInstanceIdentifierType.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInstanceIdentifierType.java @@ -9,13 +9,14 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseInstanceIdentifierType extends AbstractBaseType implements InstanceIdentifierTypeDefinition { static final @NonNull BaseInstanceIdentifierType INSTANCE = new BaseInstanceIdentifierType(); private BaseInstanceIdentifierType() { - super(QNAME); + super(TypeDefinitions.INSTANCE_IDENTIFIER); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt16Type.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt16Type.java index 4f39aca22b..d73f9037f0 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt16Type.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt16Type.java @@ -9,13 +9,14 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseInt16Type extends AbstractRangeRestrictedBaseType implements Int16TypeDefinition { static final @NonNull BaseInt16Type INSTANCE = new BaseInt16Type(); private BaseInt16Type() { - super(QNAME, Short.MIN_VALUE, Short.MAX_VALUE); + super(TypeDefinitions.INT16, Short.MIN_VALUE, Short.MAX_VALUE); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt32Type.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt32Type.java index dd3af9334f..b3f0a84c8c 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt32Type.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt32Type.java @@ -9,13 +9,14 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseInt32Type extends AbstractRangeRestrictedBaseType implements Int32TypeDefinition { static final @NonNull BaseInt32Type INSTANCE = new BaseInt32Type(); private BaseInt32Type() { - super(QNAME, Integer.MIN_VALUE, Integer.MAX_VALUE); + super(TypeDefinitions.INT32, Integer.MIN_VALUE, Integer.MAX_VALUE); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt64Type.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt64Type.java index c20757be07..778b3367d3 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt64Type.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt64Type.java @@ -9,13 +9,14 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseInt64Type extends AbstractRangeRestrictedBaseType implements Int64TypeDefinition { static final @NonNull BaseInt64Type INSTANCE = new BaseInt64Type(); private BaseInt64Type() { - super(QNAME, Long.MIN_VALUE, Long.MAX_VALUE); + super(TypeDefinitions.INT64, Long.MIN_VALUE, Long.MAX_VALUE); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt8Type.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt8Type.java index 3f9a1e184a..cddc4dca92 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt8Type.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseInt8Type.java @@ -9,13 +9,14 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseInt8Type extends AbstractRangeRestrictedBaseType implements Int8TypeDefinition { static final @NonNull BaseInt8Type INSTANCE = new BaseInt8Type(); private BaseInt8Type() { - super(QNAME, Byte.MIN_VALUE, Byte.MAX_VALUE); + super(TypeDefinitions.INT8, Byte.MIN_VALUE, Byte.MAX_VALUE); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseStringType.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseStringType.java index fb07ca9d59..924c131461 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseStringType.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseStringType.java @@ -12,13 +12,14 @@ import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; final class BaseStringType extends AbstractLengthRestrictedBaseType implements StringTypeDefinition { static final @NonNull BaseStringType INSTANCE = new BaseStringType(); private BaseStringType() { - super(QNAME); + super(TypeDefinitions.STRING); } @Override diff --git a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseUint16Type.java b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseUint16Type.java index 444e87092e..b9285f689d 100644 --- a/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseUint16Type.java +++ b/yang/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/BaseUint16Type.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.model.ri.type; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition; final class BaseUint16Type extends AbstractRangeRestrictedBaseType @@ -16,7 +17,7 @@ final class BaseUint16Type extends AbstractRangeRestrictedBaseType @@ -16,7 +17,7 @@ final class BaseUint32Type extends AbstractRangeRestrictedBaseType @@ -16,7 +17,7 @@ final class BaseUint64Type extends AbstractRangeRestrictedBaseType @@ -16,7 +17,7 @@ final class BaseUint8Type extends AbstractRangeRestrictedBaseType, E extends Effec @Override public final QName argumentAsTypeQName() { - final Object argument = argument(); - verify(argument instanceof String, "Unexpected argument %s", argument); - return interpretAsQName((String) argument); + return interpretAsQName(getRawArgument()); } @Override diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java index 6256b76975..ee60b98356 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java @@ -14,7 +14,6 @@ import com.google.common.collect.ImmutableList; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement; @@ -24,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.IdentityRefS import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.IdentityrefTypeBuilder; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -34,15 +32,10 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; abstract class AbstractIdentityRefSpecificationSupport - extends AbstractStringStatementSupport> { - AbstractIdentityRefSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - + extends AbstractTypeSupport { @Override - public final void onFullDefinitionDeclared(final Mutable> stmt) { + public final void onFullDefinitionDeclared(final Mutable> stmt) { super.onFullDefinitionDeclared(stmt); final Collection> baseStatements = @@ -57,17 +50,17 @@ abstract class AbstractIdentityRefSpecificationSupport } @Override - protected final IdentityRefSpecification createDeclared(final StmtContext ctx, + protected final IdentityRefSpecification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noBase(ctx); } - return new IdentityRefSpecificationImpl(ctx.getRawArgument(), substatements); + return new IdentityRefSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected final EffectiveStatement createEffective( - final Current stmt, + protected final EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noBase(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java index 8cd9d4efc0..1daef24c87 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java @@ -8,7 +8,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; -import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement; @@ -16,30 +16,24 @@ import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveSt import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.LeafrefTypeBuilder; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -abstract class AbstractLeafrefSpecificationSupport extends AbstractStringStatementSupport> { - AbstractLeafrefSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - +abstract class AbstractLeafrefSpecificationSupport extends AbstractTypeSupport { @Override - protected final LeafrefSpecification createDeclared(final StmtContext ctx, + protected final LeafrefSpecification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noPath(ctx); } - return new LeafrefSpecificationImpl(ctx.getRawArgument(), substatements); + return new LeafrefSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noPath(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java index e9fcf74979..176bdd30a0 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java @@ -50,6 +50,7 @@ import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition; @@ -67,7 +68,6 @@ import org.opendaylight.yangtools.yang.model.ri.type.RequireInstanceRestrictedTy import org.opendaylight.yangtools.yang.model.ri.type.RestrictedTypes; import org.opendaylight.yangtools.yang.model.ri.type.StringTypeBuilder; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -79,12 +79,10 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -abstract class AbstractTypeStatementSupport - extends AbstractStringStatementSupport> { +abstract class AbstractTypeStatementSupport extends AbstractTypeSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addOptional(YangStmtMapping.BASE) @@ -99,76 +97,51 @@ abstract class AbstractTypeStatementSupport .addAny(YangStmtMapping.TYPE) .build(); - static final String BINARY = "binary"; - static final String BITS = "bits"; - static final String BOOLEAN = "boolean"; - static final String DECIMAL64 = "decimal64"; - static final String EMPTY = "empty"; - static final String ENUMERATION = "enumeration"; - static final String IDENTITY_REF = "identityref"; - static final String INSTANCE_IDENTIFIER = "instance-identifier"; - static final String INT8 = "int8"; - static final String INT16 = "int16"; - static final String INT32 = "int32"; - static final String INT64 = "int64"; - static final String LEAF_REF = "leafref"; - static final String STRING = "string"; - static final String UINT8 = "uint8"; - static final String UINT16 = "uint16"; - static final String UINT32 = "uint32"; - static final String UINT64 = "uint64"; - static final String UNION = "union"; - private static final ImmutableMap STATIC_BUILT_IN_TYPES = ImmutableMap.builder() - .put(BINARY, BuiltinEffectiveStatement.BINARY) - .put(BOOLEAN, BuiltinEffectiveStatement.BOOLEAN) - .put(EMPTY, BuiltinEffectiveStatement.EMPTY) + .put(TypeDefinitions.BINARY.getLocalName(), BuiltinEffectiveStatement.BINARY) + .put(TypeDefinitions.BOOLEAN.getLocalName(), BuiltinEffectiveStatement.BOOLEAN) + .put(TypeDefinitions.EMPTY.getLocalName(), BuiltinEffectiveStatement.EMPTY) // FIXME: this overlaps with DYNAMIC_BUILT_IN_TYPES. One of these is not needed, but we need to decide // what to do. I think we should gradually use per-statement validators, hence go towards dynamic? - .put(INSTANCE_IDENTIFIER, BuiltinEffectiveStatement.INSTANCE_IDENTIFIER) - .put(INT8, BuiltinEffectiveStatement.INT8) - .put(INT16, BuiltinEffectiveStatement.INT16) - .put(INT32, BuiltinEffectiveStatement.INT32) - .put(INT64, BuiltinEffectiveStatement.INT64) - .put(STRING, BuiltinEffectiveStatement.STRING) - .put(UINT8, BuiltinEffectiveStatement.UINT8) - .put(UINT16, BuiltinEffectiveStatement.UINT16) - .put(UINT32, BuiltinEffectiveStatement.UINT32) - .put(UINT64, BuiltinEffectiveStatement.UINT64) + .put(TypeDefinitions.INSTANCE_IDENTIFIER.getLocalName(), BuiltinEffectiveStatement.INSTANCE_IDENTIFIER) + .put(TypeDefinitions.INT8.getLocalName(), BuiltinEffectiveStatement.INT8) + .put(TypeDefinitions.INT16.getLocalName(), BuiltinEffectiveStatement.INT16) + .put(TypeDefinitions.INT32.getLocalName(), BuiltinEffectiveStatement.INT32) + .put(TypeDefinitions.INT64.getLocalName(), BuiltinEffectiveStatement.INT64) + .put(TypeDefinitions.STRING.getLocalName(), BuiltinEffectiveStatement.STRING) + .put(TypeDefinitions.UINT8.getLocalName(), BuiltinEffectiveStatement.UINT8) + .put(TypeDefinitions.UINT16.getLocalName(), BuiltinEffectiveStatement.UINT16) + .put(TypeDefinitions.UINT32.getLocalName(), BuiltinEffectiveStatement.UINT32) + .put(TypeDefinitions.UINT64.getLocalName(), BuiltinEffectiveStatement.UINT64) .build(); private static final ImmutableMap> DYNAMIC_BUILT_IN_TYPES = ImmutableMap.>builder() - .put(BITS, new BitsSpecificationSupport()) - .put(DECIMAL64, new Decimal64SpecificationSupport()) - .put(ENUMERATION, new EnumSpecificationSupport()) - .put(IDENTITY_REF, new IdentityRefSpecificationRFC6020Support()) - .put(INSTANCE_IDENTIFIER, new InstanceIdentifierSpecificationSupport()) - .put(LEAF_REF, new LeafrefSpecificationRFC6020Support()) - .put(UNION, new UnionSpecificationSupport()) + .put(TypeDefinitions.BITS.getLocalName(), new BitsSpecificationSupport()) + .put(TypeDefinitions.DECIMAL64.getLocalName(), new Decimal64SpecificationSupport()) + .put(TypeDefinitions.ENUMERATION.getLocalName(), new EnumSpecificationSupport()) + .put(TypeDefinitions.IDENTITYREF.getLocalName(), new IdentityRefSpecificationRFC6020Support()) + .put(TypeDefinitions.INSTANCE_IDENTIFIER.getLocalName(), new InstanceIdentifierSpecificationSupport()) + .put(TypeDefinitions.LEAFREF.getLocalName(), new LeafrefSpecificationRFC6020Support()) + .put(TypeDefinitions.UNION.getLocalName(), new UnionSpecificationSupport()) .build(); private static final ImmutableMap BUILT_IN_TYPES = Maps.uniqueIndex(ImmutableSet.copyOf( Iterables.concat(STATIC_BUILT_IN_TYPES.keySet(), DYNAMIC_BUILT_IN_TYPES.keySet())), key -> key); - AbstractTypeStatementSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override public final void onFullDefinitionDeclared( - final Mutable> stmt) { + final Mutable> stmt) { super.onFullDefinitionDeclared(stmt); - final String argument = stmt.getArgument(); - final BuiltinEffectiveStatement builtin = STATIC_BUILT_IN_TYPES.get(argument); + final BuiltinEffectiveStatement builtin = STATIC_BUILT_IN_TYPES.get(stmt.getRawArgument()); if (builtin != null) { stmt.addToNs(BaseTypeNamespace.class, Empty.getInstance(), builtin); return; } - final QName typeQName = StmtContextUtils.parseNodeIdentifier(stmt, argument); + final QName typeQName = stmt.getArgument(); final ModelActionBuilder typeAction = stmt.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); final Prerequisite> typePrereq = typeAction.requiresCtx(stmt, TypeNamespace.class, typeQName, ModelProcessingPhase.EFFECTIVE_MODEL); @@ -192,12 +165,6 @@ abstract class AbstractTypeStatementSupport }); } - @Override - public final String internArgument(final String rawArgument) { - final String found; - return (found = BUILT_IN_TYPES.get(rawArgument)) != null ? found : rawArgument; - } - @Override public boolean hasArgumentSpecificSupports() { return !DYNAMIC_BUILT_IN_TYPES.isEmpty(); @@ -214,19 +181,19 @@ abstract class AbstractTypeStatementSupport } @Override - protected final TypeStatement createDeclared(final StmtContext ctx, + protected final TypeStatement createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { - final TypeStatement builtin = BuiltinTypeStatement.lookup(ctx); + final TypeStatement builtin = BuiltinTypeStatement.lookup(ctx.getRawArgument()); if (builtin != null) { return builtin; } } - return DeclaredStatements.createType(ctx.getRawArgument(), substatements); + return DeclaredStatements.createType(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective(final Current stmt, + protected EffectiveStatement createEffective(final Current stmt, final ImmutableList> substatements) { // First look up the proper base type final TypeEffectiveStatement typeStmt = resolveType(stmt); @@ -289,15 +256,8 @@ abstract class AbstractTypeStatementSupport } // FIXME: YANGTOOLS-1208: this needs to happen during onFullDefinitionDeclared() and stored (again) in a namespace - static final @NonNull QName typeEffectiveQName(final Current stmt) { - // FIXME: YANGTOOLS-1117: this really should be handled through A=AbstractQName, with two values coming out of - // parseArgument(): either UnqualifiedQName or QualifiedQName. Each of those can easily be bound to - // parent module: - // stmt.getArgument().bindTo(parentNamespace). - final String argument = stmt.getArgument(); - return QName.create(stmt.getEffectiveParent().effectiveNamespace(), - // Split out localName event if it is prefixed. This should really be in parseArgument() - argument.substring(argument.indexOf(':') + 1)).intern(); + static final @NonNull QName typeEffectiveQName(final Current stmt) { + return stmt.getArgument().bindTo(stmt.getEffectiveParent().effectiveNamespace()).intern(); } /** @@ -307,7 +267,7 @@ abstract class AbstractTypeStatementSupport * @return Resolved type * @throws SourceException if the target type cannot be found */ - private static @NonNull TypeEffectiveStatement resolveType(final Current ctx) { + private static @NonNull TypeEffectiveStatement resolveType(final Current ctx) { final Object obj = verifyNotNull(ctx.namespaceItem(BaseTypeNamespace.class, Empty.getInstance())); if (obj instanceof BuiltinEffectiveStatement) { return (BuiltinEffectiveStatement) obj; @@ -319,7 +279,7 @@ abstract class AbstractTypeStatementSupport } } - private static @NonNull TypeEffectiveStatement createBinary(final Current ctx, + private static @NonNull TypeEffectiveStatement createBinary(final Current ctx, final BinaryTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { final LengthRestrictedTypeBuilder builder = @@ -359,14 +319,14 @@ abstract class AbstractTypeStatementSupport abstract @NonNull Bit addRestrictedBit(@NonNull EffectiveStmtCtx stmt, @NonNull BitsTypeDefinition base, @NonNull BitEffectiveStatement bit); - private static @NonNull TypeEffectiveStatement createBoolean(final Current ctx, + private static @NonNull TypeEffectiveStatement createBoolean(final Current ctx, final BooleanTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { return new TypeEffectiveStatementImpl<>(declared, substatements, RestrictedTypes.newBooleanBuilder(baseType, typeEffectiveQName(ctx))); } - private static @NonNull TypeEffectiveStatement createDecimal(final Current ctx, + private static @NonNull TypeEffectiveStatement createDecimal(final Current ctx, final DecimalTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { final RangeRestrictedTypeBuilder builder = @@ -387,7 +347,7 @@ abstract class AbstractTypeStatementSupport return new TypeEffectiveStatementImpl<>(declared, substatements, builder); } - private static @NonNull TypeEffectiveStatement createEmpty(final Current ctx, + private static @NonNull TypeEffectiveStatement createEmpty(final Current ctx, final EmptyTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { return new TypeEffectiveStatementImpl<>(declared, substatements, RestrictedTypes.newEmptyBuilder(baseType, @@ -412,14 +372,14 @@ abstract class AbstractTypeStatementSupport abstract @NonNull EnumPair addRestrictedEnum(@NonNull EffectiveStmtCtx stmt, @NonNull EnumTypeDefinition base, @NonNull EnumEffectiveStatement enumStmt); - private static @NonNull TypeEffectiveStatement createIdentityref(final Current ctx, + private static @NonNull TypeEffectiveStatement createIdentityref(final Current ctx, final IdentityrefTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { return new TypeEffectiveStatementImpl<>(declared, substatements, RestrictedTypes.newIdentityrefBuilder(baseType, typeEffectiveQName(ctx))); } - private static @NonNull TypeEffectiveStatement createInstanceIdentifier(final Current ctx, + private static @NonNull TypeEffectiveStatement createInstanceIdentifier(final Current ctx, final InstanceIdentifierTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { final InstanceIdentifierTypeBuilder builder = RestrictedTypes.newInstanceIdentifierBuilder(baseType, @@ -452,7 +412,7 @@ abstract class AbstractTypeStatementSupport } } - private static @NonNull TypeEffectiveStatement createLeafref(final Current ctx, + private static @NonNull TypeEffectiveStatement createLeafref(final Current ctx, final LeafrefTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { final RequireInstanceRestrictedTypeBuilder builder = @@ -466,7 +426,7 @@ abstract class AbstractTypeStatementSupport return new TypeEffectiveStatementImpl<>(declared, substatements, builder); } - private static @NonNull TypeEffectiveStatement createString(final Current ctx, + private static @NonNull TypeEffectiveStatement createString(final Current ctx, final StringTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { final StringTypeBuilder builder = RestrictedTypes.newStringBuilder(baseType, @@ -492,7 +452,7 @@ abstract class AbstractTypeStatementSupport return new TypeEffectiveStatementImpl<>(declared, substatements, builder); } - private static @NonNull TypeEffectiveStatement createUnion(final Current ctx, + private static @NonNull TypeEffectiveStatement createUnion(final Current ctx, final UnionTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { return new TypeEffectiveStatementImpl<>(declared, substatements, RestrictedTypes.newUnionBuilder(baseType, diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeSupport.java new file mode 100644 index 0000000000..df2a5f05eb --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeSupport.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import java.util.List; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; + +/** + * Abstract base of all type-related statement support classes. + */ +abstract class AbstractTypeSupport + extends AbstractQNameStatementSupport> { + private static final ImmutableMap BUILTIN_TYPES = Maps.uniqueIndex(List.of( + TypeDefinitions.BINARY, + TypeDefinitions.BITS, + TypeDefinitions.BOOLEAN, + TypeDefinitions.DECIMAL64, + TypeDefinitions.EMPTY, + TypeDefinitions.ENUMERATION, + TypeDefinitions.IDENTITYREF, + TypeDefinitions.INSTANCE_IDENTIFIER, + TypeDefinitions.INT8, + TypeDefinitions.INT16, + TypeDefinitions.INT32, + TypeDefinitions.INT64, + TypeDefinitions.LEAFREF, + TypeDefinitions.STRING, + TypeDefinitions.UINT8, + TypeDefinitions.UINT16, + TypeDefinitions.UINT32, + TypeDefinitions.UINT64, + TypeDefinitions.UNION), + QName::getLocalName); + + AbstractTypeSupport() { + super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); + } + + @Override + public final String internArgument(final String rawArgument) { + final QName builtin; + return (builtin = BUILTIN_TYPES.get(rawArgument)) != null ? builtin.getLocalName() : rawArgument; + } + + @Override + public final QName parseArgumentValue(final StmtContext ctx, final String value) { + // RFC7950 section 7.3 states that: + // + // The name of the type MUST NOT be one of the YANG built-in types. + // + // Therefore, if the string matches one of built-in types, it cannot legally refer to a typedef. Hence consult + // built in types and if it's not there parse it as a node identifier. + final String rawArgument = ctx.getRawArgument(); + final QName builtin = BUILTIN_TYPES.get(rawArgument); + return builtin != null ? builtin : StmtContextUtils.parseNodeIdentifier(ctx, rawArgument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationImpl.java index b4d4e7db76..4202f1585f 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationImpl.java @@ -8,12 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.BitsSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class BitsSpecificationImpl extends WithSubstatements implements BitsSpecification { - BitsSpecificationImpl(final String rawArgument, final ImmutableList> substatements) { - super(rawArgument, substatements); +final class BitsSpecificationImpl extends WithSubstatements implements BitsSpecification { + BitsSpecificationImpl(final String rawArgument, final QName argument, + final ImmutableList> substatements) { + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationSupport.java index 9a7c32dba1..aba2622bca 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; import java.util.Optional; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; @@ -18,41 +19,35 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.BitsSpecific import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.BitsTypeBuilder; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -final class BitsSpecificationSupport - extends AbstractStringStatementSupport> { +final class BitsSpecificationSupport extends AbstractTypeSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addMultiple(YangStmtMapping.BIT) .build(); - BitsSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } @Override - protected BitsSpecification createDeclared(final StmtContext ctx, + protected BitsSpecification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noBits(ctx); } - return new BitsSpecificationImpl(ctx.getRawArgument(), substatements); + return new BitsSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noBits(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java index 7a762e8e26..401b7aca08 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; @@ -76,8 +77,8 @@ enum BuiltinEffectiveStatement implements TypeEffectiveStatement } @Override - public final String argument() { - return getTypeDefinition().getQName().getLocalName(); + public final QName argument() { + return getTypeDefinition().getQName(); } @Override diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinTypeStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinTypeStatement.java index 405b95c832..73bba2773c 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinTypeStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinTypeStatement.java @@ -7,45 +7,44 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; -import static java.util.Objects.requireNonNull; - import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithQNameArgument; -final class BuiltinTypeStatement extends WithRawStringArgument implements TypeStatement { +final class BuiltinTypeStatement extends WithQNameArgument implements TypeStatement { private static final ImmutableMap BUILTINS; static { final Builder builder = ImmutableMap.builder(); - putBuiltin(builder, AbstractTypeStatementSupport.BINARY); - putBuiltin(builder, AbstractTypeStatementSupport.BOOLEAN); - putBuiltin(builder, AbstractTypeStatementSupport.EMPTY); - putBuiltin(builder, AbstractTypeStatementSupport.INSTANCE_IDENTIFIER); - putBuiltin(builder, AbstractTypeStatementSupport.INT8); - putBuiltin(builder, AbstractTypeStatementSupport.INT16); - putBuiltin(builder, AbstractTypeStatementSupport.INT32); - putBuiltin(builder, AbstractTypeStatementSupport.INT64); - putBuiltin(builder, AbstractTypeStatementSupport.STRING); - putBuiltin(builder, AbstractTypeStatementSupport.UINT8); - putBuiltin(builder, AbstractTypeStatementSupport.UINT16); - putBuiltin(builder, AbstractTypeStatementSupport.UINT32); - putBuiltin(builder, AbstractTypeStatementSupport.UINT64); + putBuiltin(builder, TypeDefinitions.BINARY); + putBuiltin(builder, TypeDefinitions.BOOLEAN); + putBuiltin(builder, TypeDefinitions.EMPTY); + putBuiltin(builder, TypeDefinitions.INSTANCE_IDENTIFIER); + putBuiltin(builder, TypeDefinitions.INT8); + putBuiltin(builder, TypeDefinitions.INT16); + putBuiltin(builder, TypeDefinitions.INT32); + putBuiltin(builder, TypeDefinitions.INT64); + putBuiltin(builder, TypeDefinitions.STRING); + putBuiltin(builder, TypeDefinitions.UINT8); + putBuiltin(builder, TypeDefinitions.UINT16); + putBuiltin(builder, TypeDefinitions.UINT32); + putBuiltin(builder, TypeDefinitions.UINT64); BUILTINS = builder.build(); } - private static void putBuiltin(final Builder builder, final String argument) { - builder.put(argument, new BuiltinTypeStatement(argument)); + private static void putBuiltin(final Builder builder, final QName argument) { + builder.put(argument.getLocalName(), new BuiltinTypeStatement(argument)); } - private BuiltinTypeStatement(final String rawArgument) { - super(requireNonNull(rawArgument)); + private BuiltinTypeStatement(final QName argument) { + super(argument); } - static @Nullable TypeStatement lookup(final StmtContext ctx) { - return BUILTINS.get(ctx.getArgument()); + static @Nullable TypeStatement lookup(final String rawArgument) { + return BUILTINS.get(rawArgument); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationImpl.java index a81895ad7e..e357c24274 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationImpl.java @@ -8,13 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class Decimal64SpecificationImpl extends WithSubstatements implements Decimal64Specification { - Decimal64SpecificationImpl(final String rawArgument, +final class Decimal64SpecificationImpl extends WithSubstatements implements Decimal64Specification { + Decimal64SpecificationImpl(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationSupport.java index 28aa6b1ff3..46e05fe150 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationSupport.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -16,42 +17,36 @@ import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.DecimalTypeBuilder; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -final class Decimal64SpecificationSupport extends AbstractStringStatementSupport> { +final class Decimal64SpecificationSupport extends AbstractTypeSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addMandatory(YangStmtMapping.FRACTION_DIGITS) .addOptional(YangStmtMapping.RANGE) .build(); - Decimal64SpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } @Override - protected Decimal64Specification createDeclared(final StmtContext ctx, + protected Decimal64Specification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noFracDigits(ctx); } - return new Decimal64SpecificationImpl(ctx.getRawArgument(), substatements); + return new Decimal64SpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noFracDigits(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java index 59aef0c6a3..a74bb34ca5 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EmptyIdentifierSpecification.java @@ -7,11 +7,12 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument; -final class EmptyIdentifierSpecification extends WithRawStringArgument implements InstanceIdentifierSpecification { - EmptyIdentifierSpecification(final String rawArgument) { - super(rawArgument); +final class EmptyIdentifierSpecification extends WithArgument implements InstanceIdentifierSpecification { + EmptyIdentifierSpecification(final String rawArgument, final QName argument) { + super(rawArgument, argument); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationImpl.java index 779e8862d3..9a8526c640 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationImpl.java @@ -8,12 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.EnumSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class EnumSpecificationImpl extends WithSubstatements implements EnumSpecification { - EnumSpecificationImpl(final String rawArgument, final ImmutableList> substatements) { - super(rawArgument, substatements); +final class EnumSpecificationImpl extends WithSubstatements implements EnumSpecification { + EnumSpecificationImpl(final String rawArgument, final QName argument, + final ImmutableList> substatements) { + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationSupport.java index 55496111a1..4c174fdb3b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; import java.util.Optional; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -18,39 +19,33 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.EnumerationTypeBuilder; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -final class EnumSpecificationSupport - extends AbstractStringStatementSupport> { +final class EnumSpecificationSupport extends AbstractTypeSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping.TYPE).addMultiple(YangStmtMapping.ENUM).build(); - EnumSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } @Override - protected EnumSpecification createDeclared(final StmtContext ctx, + protected EnumSpecification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noEnum(ctx); } - return new EnumSpecificationImpl(ctx.getRawArgument(), substatements); + return new EnumSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noEnum(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java index 118b07cb54..f3ffcfc213 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java @@ -8,13 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.IdentityRefSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class IdentityRefSpecificationImpl extends WithSubstatements implements IdentityRefSpecification { - IdentityRefSpecificationImpl(final String rawArgument, +final class IdentityRefSpecificationImpl extends WithSubstatements implements IdentityRefSpecification { + IdentityRefSpecificationImpl(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityrefSpecificationRFC7950Support.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationRFC7950Support.java similarity index 93% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityrefSpecificationRFC7950Support.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationRFC7950Support.java index 0323dd4c93..18559754a0 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityrefSpecificationRFC7950Support.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationRFC7950Support.java @@ -13,7 +13,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; /** * Class providing necessary support for processing YANG 1.1 identityref statement. */ -final class IdentityrefSpecificationRFC7950Support extends AbstractIdentityRefSpecificationSupport { +final class IdentityRefSpecificationRFC7950Support extends AbstractIdentityRefSpecificationSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .TYPE) .addMultiple(YangStmtMapping.BASE) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java index 785ae274a4..4daeeb9ed5 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/InstanceIdentifierSpecificationSupport.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -16,23 +17,17 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIden import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.InstanceIdentifierTypeBuilder; import org.opendaylight.yangtools.yang.model.ri.type.RestrictedTypes; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; final class InstanceIdentifierSpecificationSupport - extends AbstractStringStatementSupport> { + extends AbstractTypeSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addOptional(YangStmtMapping.REQUIRE_INSTANCE) .build(); - InstanceIdentifierSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; @@ -40,15 +35,15 @@ final class InstanceIdentifierSpecificationSupport @Override protected InstanceIdentifierSpecification createDeclared( - final StmtContext ctx, + final StmtContext ctx, final ImmutableList> substatements) { - return substatements.isEmpty() ? new EmptyIdentifierSpecification(ctx.getRawArgument()) - : new RegularInstanceIdentifierSpecification(ctx.getRawArgument(), substatements); + return substatements.isEmpty() ? new EmptyIdentifierSpecification(ctx.getRawArgument(), ctx.getArgument()) + : new RegularInstanceIdentifierSpecification(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { final InstanceIdentifierTypeBuilder builder = RestrictedTypes.newInstanceIdentifierBuilder( BaseTypes.instanceIdentifierType(), stmt.argumentAsTypeQName()); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java index ca7f6c0a61..fb92b0d26e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java @@ -8,13 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class LeafrefSpecificationImpl extends WithSubstatements implements LeafrefSpecification { - LeafrefSpecificationImpl(final String rawArgument, +final class LeafrefSpecificationImpl extends WithSubstatements implements LeafrefSpecification { + LeafrefSpecificationImpl(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java index 6e827bdb47..b001062413 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/RegularInstanceIdentifierSpecification.java @@ -8,14 +8,15 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.InstanceIdentifierSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class RegularInstanceIdentifierSpecification extends WithSubstatements +final class RegularInstanceIdentifierSpecification extends WithSubstatements implements InstanceIdentifierSpecification { - RegularInstanceIdentifierSpecification(final String rawArgument, + RegularInstanceIdentifierSpecification(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeEffectiveStatementImpl.java index 9d1c21326e..5df6b684b7 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeEffectiveStatementImpl.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -18,7 +19,7 @@ import org.opendaylight.yangtools.yang.model.ri.type.TypeBuilder; import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; final class TypeEffectiveStatementImpl, D extends TypeStatement> - extends WithSubstatements implements TypeEffectiveStatement { + extends WithSubstatements implements TypeEffectiveStatement { private final @NonNull T typeDefinition; TypeEffectiveStatementImpl(final D declared, final ImmutableList> substatements, diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeStatementRFC7950Support.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeStatementRFC7950Support.java index 5374e93a68..5f1054f78e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeStatementRFC7950Support.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/TypeStatementRFC7950Support.java @@ -18,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; @@ -28,8 +29,8 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; @Beta public final class TypeStatementRFC7950Support extends AbstractTypeStatementSupport { private static final ImmutableMap> ARGUMENT_SPECIFIC_SUPPORTS = ImmutableMap.of( - LEAF_REF, new LeafrefSpecificationRFC7950Support(), - IDENTITY_REF, new IdentityrefSpecificationRFC7950Support()); + TypeDefinitions.LEAFREF.getLocalName(), new LeafrefSpecificationRFC7950Support(), + TypeDefinitions.IDENTITYREF.getLocalName(), new IdentityRefSpecificationRFC7950Support()); private static final TypeStatementRFC7950Support INSTANCE = new TypeStatementRFC7950Support(); private TypeStatementRFC7950Support() { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationImpl.java index c58cf5ba64..425c899e08 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationImpl.java @@ -8,13 +8,14 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.UnionSpecification; -import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements; -final class UnionSpecificationImpl extends WithSubstatements implements UnionSpecification { - UnionSpecificationImpl(final String rawArgument, +final class UnionSpecificationImpl extends WithSubstatements implements UnionSpecification { + UnionSpecificationImpl(final String rawArgument, final QName argument, final ImmutableList> substatements) { - super(rawArgument, substatements); + super(rawArgument, argument, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationSupport.java index 99814c0da0..b863895729 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; import com.google.common.collect.ImmutableList; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -16,41 +17,35 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.UnionSpecification; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; import org.opendaylight.yangtools.yang.model.ri.type.UnionTypeBuilder; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -final class UnionSpecificationSupport - extends AbstractStringStatementSupport> { - private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping - .TYPE) +final class UnionSpecificationSupport extends AbstractTypeSupport { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = + SubstatementValidator.builder(YangStmtMapping.TYPE) .addMultiple(YangStmtMapping.TYPE) .build(); - UnionSpecificationSupport() { - super(YangStmtMapping.TYPE, StatementPolicy.exactReplica()); - } - @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } @Override - protected UnionSpecification createDeclared(final StmtContext ctx, + protected UnionSpecification createDeclared(final StmtContext ctx, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noType(ctx); } - return new UnionSpecificationImpl(ctx.getRawArgument(), substatements); + return new UnionSpecificationImpl(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected EffectiveStatement createEffective( - final Current stmt, + protected EffectiveStatement createEffective( + final Current stmt, final ImmutableList> substatements) { if (substatements.isEmpty()) { throw noType(stmt); diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java index ce6f87e7e8..4e57b84002 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentTest.java @@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; -import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; public class AugmentTest { private static final QNameModule FOO = QNameModule.create( @@ -95,7 +95,7 @@ public class AugmentTest { assertPathEquals(expectedSchemaPath, ds0ChannelNumber); assertFalse(ds0ChannelNumber.isAugmenting()); // type of leaf ds0ChannelNumber - assertEquals(StringTypeDefinition.QNAME, ds0ChannelNumber.getType().getQName()); + assertEquals(TypeDefinitions.STRING, ds0ChannelNumber.getType().getQName()); // leaf interface-id qname = QName.create(FOO, "interface-id"); diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeclaredStatementsTest.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeclaredStatementsTest.java index 12ad6db7d0..9af98c4aeb 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeclaredStatementsTest.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeclaredStatementsTest.java @@ -329,7 +329,7 @@ public class DeclaredStatementsTest { assertEquals("test description", typedefStatement.getDescription().get().argument()); assertEquals("test reference", typedefStatement.getReference().get().argument()); assertEquals("test-typedef", typedefStatement.argument().getLocalName()); - assertEquals("int32", typedefStatement.getType().argument()); + assertEquals("int32", typedefStatement.getType().rawArgument()); assertEquals("meter", typedefStatement.getUnits().get().argument()); } diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java index 234ca5fc43..6b7bf818a0 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java @@ -23,6 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; public class TypedefConstraintsTest { @@ -67,9 +68,7 @@ public class TypedefConstraintsTest { assertEquals(new BigDecimal(1.5), range.lowerEndpoint()); assertEquals(new BigDecimal(5.5), range.upperEndpoint()); - assertTrue(decType.getQName().getModule().equals(leafDecimal.getQName().getModule())); - assertTrue(decType.getQName().getLocalName().equals(DecimalTypeDefinition.QNAME.getLocalName())); + assertEquals(TypeDefinitions.DECIMAL64.bindTo(leafDecimal.getQName().getModule()), decType.getQName()); assertNull(decType.getBaseType()); } - } diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java index 80a802af62..ce22eaedac 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java @@ -61,6 +61,7 @@ import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.TypeDefinitions; import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes; @@ -476,7 +477,7 @@ public class YangParserTest { assertEquals(BaseTypes.int32Type(), myUnionBaseTypes.get(1)); final Int16TypeDefinition int16Ext = (Int16TypeDefinition) myUnionBaseTypes.get(0); - assertEquals(QName.create(BAR, "int16"), int16Ext.getQName()); + assertEquals(TypeDefinitions.INT16, int16Ext.getQName()); assertEquals(Optional.empty(), int16Ext.getUnits()); assertEquals(Optional.empty(), int16Ext.getDefaultValue()); final Set> ranges = int16Ext.getRangeConstraint().get().getAllowedRanges() -- 2.36.6