From 289f175e5bbd33662f1fd9bd2d441b1d1c486392 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Jul 2020 23:44:23 +0200 Subject: [PATCH] Migrate UnionSpecificationSupport UnionSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: I93ad3126e000c489776ea92aed58e9183e93da42 Signed-off-by: Robert Varga --- .../UnionSpecificationEffectiveStatement.java | 48 --------------- .../stmt/type/UnionSpecificationImpl.java | 11 ++-- .../stmt/type/UnionSpecificationSupport.java | 60 +++++++++++++++---- 3 files changed, 56 insertions(+), 63 deletions(-) delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationEffectiveStatement.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationEffectiveStatement.java deleted file mode 100644 index 6ea6895769..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationEffectiveStatement.java +++ /dev/null @@ -1,48 +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.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.UnionSpecification; -import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.UnionTypeBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class UnionSpecificationEffectiveStatement extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull UnionTypeDefinition typeDefinition; - - UnionSpecificationEffectiveStatement( - final StmtContext> ctx) { - super(ctx); - - final UnionTypeBuilder builder = BaseTypes.unionTypeBuilder(ctx.getSchemaPath().get()); - - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof TypeEffectiveStatement) { - builder.addType(((TypeEffectiveStatement)stmt).getTypeDefinition()); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public UnionTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} 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 833dd04a64..de5cac415b 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 @@ -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.UnionSpecification; -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 UnionSpecificationImpl extends AbstractDeclaredStatement implements UnionSpecification { - UnionSpecificationImpl(final StmtContext context) { - super(context); +final class UnionSpecificationImpl extends WithSubstatements implements UnionSpecification { + UnionSpecificationImpl(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/UnionSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/UnionSpecificationSupport.java index 3fcc5f7e20..f2bd4b6bd5 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 @@ -7,15 +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.TypeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.UnionSpecification; -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.UnionTypeBuilder; +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 UnionSpecificationSupport extends - AbstractStatementSupport> { +final class UnionSpecificationSupport + extends BaseStatementSupport> { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .TYPE) .addMultiple(YangStmtMapping.TYPE) @@ -31,18 +37,50 @@ final class UnionSpecificationSupport extends } @Override - public UnionSpecification createDeclared(final StmtContext ctx) { - return new UnionSpecificationImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public EffectiveStatement createEffective( - final StmtContext> ctx) { - return new UnionSpecificationEffectiveStatement(ctx); + protected UnionSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new UnionSpecificationImpl(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected UnionSpecification createEmptyDeclared(final StmtContext ctx) { + throw noType(ctx); + } + + @Override + protected EffectiveStatement createEffective( + final StmtContext> ctx, + final UnionSpecification declared, final ImmutableList> substatements) { + final UnionTypeBuilder builder = BaseTypes.unionTypeBuilder(ctx.getSchemaPath().get()); + + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof TypeEffectiveStatement) { + builder.addType(((TypeEffectiveStatement)stmt).getTypeDefinition()); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final UnionSpecification declared) { + throw noType(ctx); + } + + private static SourceException noType(final StmtContext ctx) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.12 + * + * When the type is "union", the "type" statement (Section 7.4) MUST be + * present. + */ + return new SourceException("At least one type statement has to be present", ctx.getStatementSourceReference()); } -} \ No newline at end of file +} -- 2.36.6