From: Robert Varga Date: Thu, 2 Jul 2020 20:43:18 +0000 (+0200) Subject: Migrate BitsSpecificationSupport X-Git-Tag: v5.0.4~24 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=43b4dbc37c48f1460c93e7e03d3b4fabd3f833f6;p=yangtools.git Migrate BitsSpecificationSupport BitsSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: Id2d9b816388584ceda3c8cc8528b8cccfae08fbb Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationEffectiveStatement.java deleted file mode 100644 index 4e1c81719f..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationEffectiveStatement.java +++ /dev/null @@ -1,74 +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.Uint32; -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.BitEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.BitsSpecification; -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.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.BitsTypeBuilder; -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 BitsSpecificationEffectiveStatement extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull BitsTypeDefinition typeDefinition; - - BitsSpecificationEffectiveStatement( - final StmtContext> ctx) { - super(ctx); - - final BitsTypeBuilder builder = BaseTypes.bitsTypeBuilder(ctx.getSchemaPath().get()); - Uint32 highestPosition = null; - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof BitEffectiveStatement) { - final BitEffectiveStatement bitSubStmt = (BitEffectiveStatement) stmt; - - final Optional declaredPosition = bitSubStmt.getDeclaredPosition(); - final Uint32 effectivePos; - if (declaredPosition.isEmpty()) { - if (highestPosition != null) { - SourceException.throwIf(Uint32.MAX_VALUE.equals(highestPosition), - ctx.getStatementSourceReference(), "Bit %s must have a position statement", bitSubStmt); - effectivePos = Uint32.fromIntBits(highestPosition.intValue() + 1); - } else { - effectivePos = Uint32.ZERO; - } - } else { - effectivePos = declaredPosition.get(); - } - - final Bit bit = EffectiveTypeUtil.buildBit(bitSubStmt, effectivePos); - if (highestPosition == null || highestPosition.compareTo(bit.getPosition()) < 0) { - highestPosition = bit.getPosition(); - } - - builder.addBit(bit); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode) stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public BitsTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} 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 d4068f9254..d22ef58629 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 @@ -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.BitsSpecification; -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 BitsSpecificationImpl extends AbstractDeclaredStatement implements BitsSpecification { - BitsSpecificationImpl(final StmtContext context) { - super(context); +final class BitsSpecificationImpl extends WithSubstatements implements BitsSpecification { + BitsSpecificationImpl(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/BitsSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BitsSpecificationSupport.java index 6a21582689..8640170f86 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 @@ -7,15 +7,24 @@ */ 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.Uint32; 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.TypeStatement.BitsSpecification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit; +import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.util.type.BitsTypeBuilder; +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 BitsSpecificationSupport - extends AbstractStatementSupport> { + extends BaseStatementSupport> { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) .addMultiple(YangStmtMapping.BIT) @@ -31,18 +40,71 @@ final class BitsSpecificationSupport } @Override - public BitsSpecification createDeclared(final StmtContext ctx) { - return new BitsSpecificationImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public EffectiveStatement createEffective( - final StmtContext> ctx) { - return new BitsSpecificationEffectiveStatement(ctx); + protected BitsSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new BitsSpecificationImpl(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected BitsSpecification createEmptyDeclared(final StmtContext ctx) { + throw noBits(ctx); + } + + @Override + protected EffectiveStatement createEffective( + final StmtContext> ctx, + final BitsSpecification declared, final ImmutableList> substatements) { + final BitsTypeBuilder builder = BaseTypes.bitsTypeBuilder(ctx.getSchemaPath().get()); + Uint32 highestPosition = null; + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof BitEffectiveStatement) { + final BitEffectiveStatement bitSubStmt = (BitEffectiveStatement) stmt; + + final Optional declaredPosition = bitSubStmt.getDeclaredPosition(); + final Uint32 effectivePos; + if (declaredPosition.isEmpty()) { + if (highestPosition != null) { + SourceException.throwIf(Uint32.MAX_VALUE.equals(highestPosition), + ctx.getStatementSourceReference(), "Bit %s must have a position statement", bitSubStmt); + effectivePos = Uint32.fromIntBits(highestPosition.intValue() + 1); + } else { + effectivePos = Uint32.ZERO; + } + } else { + effectivePos = declaredPosition.get(); + } + + final Bit bit = EffectiveTypeUtil.buildBit(bitSubStmt, effectivePos); + if (highestPosition == null || highestPosition.compareTo(bit.getPosition()) < 0) { + highestPosition = bit.getPosition(); + } + + builder.addBit(bit); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final BitsSpecification declared) { + throw noBits(ctx); + } + + private static SourceException noBits(final StmtContext ctx) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.7.4: + * + * The "bit" statement, which is a substatement to the "type" statement, + * MUST be present if the type is "bits". + */ + return new SourceException("At least one bit statement has to be present", ctx.getStatementSourceReference()); } -} \ No newline at end of file +} 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 64c14a8ee9..a30eb21127 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 @@ -17,12 +17,12 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.model.util.type.TypeBuilder; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; -final class TypeEffectiveStatementImpl> extends WithSubstatements - implements TypeEffectiveStatement { +final class TypeEffectiveStatementImpl, D extends TypeStatement> + extends WithSubstatements implements TypeEffectiveStatement { private final @NonNull T typeDefinition; - TypeEffectiveStatementImpl(final TypeStatement declared, - final ImmutableList> substatements, final TypeBuilder builder) { + TypeEffectiveStatementImpl(final D declared, final ImmutableList> substatements, + final TypeBuilder builder) { super(declared, substatements); for (EffectiveStatement stmt : substatements) {