From: Robert Varga Date: Thu, 2 Jul 2020 18:06:11 +0000 (+0200) Subject: Consolidate EnumTypeEffectiveStatementImpl X-Git-Tag: v5.0.4~29 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=386d760df6ea4d22bd7c21dc1ca8880cfe6afb61;p=yangtools.git Consolidate EnumTypeEffectiveStatementImpl TypeEffectiveStatementImpl can easily support the case of an enum type, migrate it. JIRA: YANGTOOLS-1065 Change-Id: I756ee91f4ce9c9e846ee65afbc4629dd23668002 Signed-off-by: Robert Varga --- 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 72cb0e99e4..65950677cc 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 @@ -24,6 +24,7 @@ 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.BitEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement; @@ -31,6 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit; @@ -38,6 +40,7 @@ import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; 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.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition; @@ -52,6 +55,7 @@ import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.util.type.BitsTypeBuilder; +import org.opendaylight.yangtools.yang.model.util.type.EnumerationTypeBuilder; import org.opendaylight.yangtools.yang.model.util.type.InvalidLengthConstraintException; import org.opendaylight.yangtools.yang.model.util.type.LengthRestrictedTypeBuilder; import org.opendaylight.yangtools.yang.model.util.type.RangeRestrictedTypeBuilder; @@ -235,7 +239,7 @@ abstract class AbstractTypeStatementSupport } else if (baseType instanceof EmptyTypeDefinition) { return createEmpty(ctx, (EmptyTypeDefinition) baseType, declared, substatements); } else if (baseType instanceof EnumTypeDefinition) { - return new EnumTypeEffectiveStatementImpl(ctx, (EnumTypeDefinition) baseType); + return createEnum(ctx, (EnumTypeDefinition) baseType, declared, substatements); } else if (baseType instanceof IdentityrefTypeDefinition) { return createIdentityref(ctx, (IdentityrefTypeDefinition) baseType, declared, substatements); } else if (baseType instanceof InstanceIdentifierTypeDefinition) { @@ -426,6 +430,35 @@ abstract class AbstractTypeStatementSupport typeEffectiveSchemaPath(ctx))); } + private static @NonNull TypeEffectiveStatement createEnum(final StmtContext ctx, + final EnumTypeDefinition baseType, final TypeStatement declared, + final ImmutableList> substatements) { + final EnumerationTypeBuilder builder = RestrictedTypes.newEnumerationBuilder(baseType, + ctx.getSchemaPath().get()); + + final YangVersion yangVersion = ctx.getRootVersion(); + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof EnumEffectiveStatement) { + SourceException.throwIf(yangVersion != YangVersion.VERSION_1_1, ctx.getStatementSourceReference(), + "Restricted enumeration type is allowed only in YANG 1.1 version."); + + final EnumEffectiveStatement enumSubStmt = (EnumEffectiveStatement) stmt; + final Optional declaredValue = + enumSubStmt.findFirstEffectiveSubstatementArgument(ValueEffectiveStatement.class); + final int effectiveValue; + if (declaredValue.isEmpty()) { + effectiveValue = getBaseTypeEnumValue(enumSubStmt.getDeclared().rawArgument(), baseType, ctx); + } else { + effectiveValue = declaredValue.orElseThrow(); + } + + builder.addEnum(EffectiveTypeUtil.buildEnumPair(enumSubStmt, effectiveValue)); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + private static @NonNull TypeEffectiveStatement createIdentityref(final StmtContext ctx, final IdentityrefTypeDefinition baseType, final TypeStatement declared, final ImmutableList> substatements) { @@ -451,4 +484,16 @@ abstract class AbstractTypeStatementSupport throw new SourceException(ctx.getStatementSourceReference(), "Bit '%s' is not a subset of its base bits type %s.", bitName, baseType.getQName()); } + + private static int getBaseTypeEnumValue(final String enumName, final EnumTypeDefinition baseType, + final StmtContext ctx) { + for (EnumPair baseTypeEnumPair : baseType.getValues()) { + if (enumName.equals(baseTypeEnumPair.getName())) { + return baseTypeEnumPair.getValue(); + } + } + + throw new SourceException(ctx.getStatementSourceReference(), + "Enum '%s' is not a subset of its base enumeration type %s.", enumName, baseType.getQName()); + } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumTypeEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumTypeEffectiveStatementImpl.java deleted file mode 100644 index 2134e1b18f..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumTypeEffectiveStatementImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. 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 java.util.Optional; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.common.YangVersion; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement; -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.util.type.EnumerationTypeBuilder; -import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; - -final class EnumTypeEffectiveStatementImpl extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull EnumTypeDefinition typeDefinition; - - EnumTypeEffectiveStatementImpl( - final StmtContext> ctx, - final EnumTypeDefinition baseType) { - super(ctx); - - final EnumerationTypeBuilder builder = RestrictedTypes.newEnumerationBuilder(baseType, - ctx.getSchemaPath().get()); - - final YangVersion yangVersion = ctx.getRootVersion(); - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof EnumEffectiveStatement) { - SourceException.throwIf(yangVersion != YangVersion.VERSION_1_1, ctx.getStatementSourceReference(), - "Restricted enumeration type is allowed only in YANG 1.1 version."); - - final EnumEffectiveStatement enumSubStmt = (EnumEffectiveStatement) stmt; - final Optional declaredValue = - enumSubStmt.findFirstEffectiveSubstatementArgument(ValueEffectiveStatement.class); - final int effectiveValue; - if (declaredValue.isEmpty()) { - effectiveValue = getBaseTypeEnumValue(enumSubStmt.getDeclared().rawArgument(), baseType, ctx); - } else { - effectiveValue = declaredValue.orElseThrow(); - } - - builder.addEnum(EffectiveTypeUtil.buildEnumPair(enumSubStmt, effectiveValue)); - } else if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode) stmt); - } - } - - typeDefinition = builder.build(); - } - - private static int getBaseTypeEnumValue(final String enumName, final EnumTypeDefinition baseType, - final StmtContext ctx) { - for (EnumPair baseTypeEnumPair : baseType.getValues()) { - if (enumName.equals(baseTypeEnumPair.getName())) { - return baseTypeEnumPair.getValue(); - } - } - - throw new SourceException(ctx.getStatementSourceReference(), - "Enum '%s' is not a subset of its base enumeration type %s.", enumName, baseType.getQName()); - } - - @Override - public EnumTypeDefinition getTypeDefinition() { - return typeDefinition; - } -}