From: Robert Varga Date: Thu, 2 Jul 2020 21:08:20 +0000 (+0200) Subject: Migrate EnumSpecificationSupport X-Git-Tag: v5.0.4~22 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=1c2c85162b922e6d39a28b4efea61c14b791ad56;p=yangtools.git Migrate EnumSpecificationSupport EnumSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: I0b211e2cfd09cae8e69ca614b190a562ba85e090 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationEffectiveStatement.java deleted file mode 100644 index 47e78b9165..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/EnumSpecificationEffectiveStatement.java +++ /dev/null @@ -1,75 +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.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.EnumSpecification; -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.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.EnumerationTypeBuilder; -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 EnumSpecificationEffectiveStatement extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull EnumTypeDefinition typeDefinition; - - EnumSpecificationEffectiveStatement( - final StmtContext> ctx) { - super(ctx); - - final EnumerationTypeBuilder builder = BaseTypes.enumerationTypeBuilder(ctx.getSchemaPath().get()); - Integer highestValue = null; - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof EnumEffectiveStatement) { - final EnumEffectiveStatement enumSubStmt = (EnumEffectiveStatement) stmt; - - final Optional declaredValue = - enumSubStmt.findFirstEffectiveSubstatementArgument(ValueEffectiveStatement.class); - final int effectiveValue; - if (declaredValue.isEmpty()) { - if (highestValue != null) { - SourceException.throwIf(highestValue == 2147483647, ctx.getStatementSourceReference(), - "Enum '%s' must have a value statement", enumSubStmt); - effectiveValue = highestValue + 1; - } else { - effectiveValue = 0; - } - } else { - effectiveValue = declaredValue.orElseThrow(); - } - - final EnumPair pair = EffectiveTypeUtil.buildEnumPair(enumSubStmt, effectiveValue); - if (highestValue == null || highestValue < pair.getValue()) { - highestValue = pair.getValue(); - } - - builder.addEnum(pair); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode) stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public EnumTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} 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 2d760f1b7f..8b65541942 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 @@ -7,12 +7,15 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.EnumSpecification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class EnumSpecificationImpl extends AbstractDeclaredStatement implements EnumSpecification { - EnumSpecificationImpl(final StmtContext context) { - super(context); +final class EnumSpecificationImpl extends WithSubstatements implements EnumSpecification { + EnumSpecificationImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, 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 01aea391f8..33998b07ab 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 @@ -7,19 +7,26 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +import com.google.common.collect.ImmutableList; +import java.util.Optional; 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.EnumEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.EnumSpecification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +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.util.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.util.type.EnumerationTypeBuilder; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; 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 AbstractStatementSupport> { - private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping - .TYPE) - .addMultiple(YangStmtMapping.ENUM) - .build(); + extends BaseStatementSupport> { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = + SubstatementValidator.builder(YangStmtMapping.TYPE).addMultiple(YangStmtMapping.ENUM).build(); EnumSpecificationSupport() { super(YangStmtMapping.TYPE); @@ -31,18 +38,73 @@ final class EnumSpecificationSupport } @Override - public EnumSpecification createDeclared(final StmtContext ctx) { - return new EnumSpecificationImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public EffectiveStatement createEffective( - final StmtContext> ctx) { - return new EnumSpecificationEffectiveStatement(ctx); + protected EnumSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new EnumSpecificationImpl(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected EnumSpecification createEmptyDeclared(final StmtContext ctx) { + throw noEnum(ctx); } + + @Override + protected EffectiveStatement createEffective( + final StmtContext> ctx, + final EnumSpecification declared, final ImmutableList> substatements) { + final EnumerationTypeBuilder builder = BaseTypes.enumerationTypeBuilder(ctx.getSchemaPath().get()); + Integer highestValue = null; + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof EnumEffectiveStatement) { + final EnumEffectiveStatement enumSubStmt = (EnumEffectiveStatement) stmt; + + final Optional declaredValue = + enumSubStmt.findFirstEffectiveSubstatementArgument(ValueEffectiveStatement.class); + final int effectiveValue; + if (declaredValue.isEmpty()) { + if (highestValue != null) { + SourceException.throwIf(highestValue == 2147483647, ctx.getStatementSourceReference(), + "Enum '%s' must have a value statement", enumSubStmt); + effectiveValue = highestValue + 1; + } else { + effectiveValue = 0; + } + } else { + effectiveValue = declaredValue.orElseThrow(); + } + + final EnumPair pair = EffectiveTypeUtil.buildEnumPair(enumSubStmt, effectiveValue); + if (highestValue == null || highestValue < pair.getValue()) { + highestValue = pair.getValue(); + } + + builder.addEnum(pair); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final EnumSpecification declared) { + throw noEnum(ctx); + } + + private static SourceException noEnum(final StmtContext ctx) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.6.4 + * + * The "enum" statement, which is a substatement to the "type" + * statement, MUST be present if the type is "enumeration". + */ + return new SourceException("At least one enum statement has to be present", ctx.getStatementSourceReference()); + } + } \ No newline at end of file