From: Robert Varga Date: Thu, 2 Jul 2020 20:54:20 +0000 (+0200) Subject: Migrate Decimal64SpecificationSupport X-Git-Tag: v5.0.4~23 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=0fde1b8bd73fd00676978f5bda3042e6f920ab22;p=yangtools.git Migrate Decimal64SpecificationSupport Decimal64SpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: Ic00af914cf31095179b2e9da4484679929431ed0 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationEffectiveStatement.java deleted file mode 100644 index 8f95263137..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationEffectiveStatement.java +++ /dev/null @@ -1,54 +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 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.FractionDigitsEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification; -import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.DecimalTypeBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class Decimal64SpecificationEffectiveStatement - extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull DecimalTypeDefinition typeDefinition; - - Decimal64SpecificationEffectiveStatement( - final StmtContext> ctx) { - super(ctx); - - final DecimalTypeBuilder builder = BaseTypes.decimalTypeBuilder(ctx.getSchemaPath().get()); - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof FractionDigitsEffectiveStatement) { - builder.setFractionDigits(((FractionDigitsEffectiveStatement) stmt).argument()); - } - if (stmt instanceof RangeEffectiveStatement) { - final RangeEffectiveStatement range = (RangeEffectiveStatement) stmt; - builder.setRangeConstraint(range, range.argument()); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public DecimalTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} 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 d5d0506796..e1575c9f48 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 @@ -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.Decimal64Specification; -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 Decimal64SpecificationImpl extends AbstractDeclaredStatement implements Decimal64Specification { - Decimal64SpecificationImpl(final StmtContext context) { - super(context); +final class Decimal64SpecificationImpl extends WithSubstatements implements Decimal64Specification { + Decimal64SpecificationImpl(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/Decimal64SpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/Decimal64SpecificationSupport.java index 59163ada70..fca77cc55f 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 @@ -7,14 +7,21 @@ */ 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.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.util.type.DecimalTypeBuilder; +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 Decimal64SpecificationSupport extends AbstractStatementSupport> { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.TYPE) @@ -32,18 +39,55 @@ final class Decimal64SpecificationSupport extends AbstractStatementSupport ctx) { - return new Decimal64SpecificationImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public EffectiveStatement createEffective(final StmtContext> ctx) { - return new Decimal64SpecificationEffectiveStatement(ctx); + protected Decimal64Specification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new Decimal64SpecificationImpl(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected Decimal64Specification createEmptyDeclared(final StmtContext ctx) { + throw noFracDigits(ctx); + } + + @Override + protected EffectiveStatement createEffective( + final StmtContext> ctx, + final Decimal64Specification declared, + final ImmutableList> substatements) { + final DecimalTypeBuilder builder = BaseTypes.decimalTypeBuilder(ctx.getSchemaPath().get()); + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof FractionDigitsEffectiveStatement) { + builder.setFractionDigits(((FractionDigitsEffectiveStatement) stmt).argument()); + } + if (stmt instanceof RangeEffectiveStatement) { + final RangeEffectiveStatement range = (RangeEffectiveStatement) stmt; + builder.setRangeConstraint(range, range.argument()); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final Decimal64Specification declared) { + throw noFracDigits(ctx); + } + + private static SourceException noFracDigits(final StmtContext ctx) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.3.4 + * + * The "fraction-digits" statement, which is a substatement to the + * "type" statement, MUST be present if the type is "decimal64". + */ + return new SourceException("At least one fraction-digits statement has to be present", + ctx.getStatementSourceReference()); } } \ No newline at end of file