From: Robert Varga Date: Thu, 2 Jul 2020 21:56:30 +0000 (+0200) Subject: Migrate LeafrefSpecificationSupport X-Git-Tag: v5.0.4~19 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=29e538348ab4d9dc3d42ce70009b132d272716af;p=yangtools.git Migrate LeafrefSpecificationSupport LeafrefSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: I735563730e8c382b49ea01fccc00191ffcfdfb14 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java index 52649adee7..a889aac7e1 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractLeafrefSpecificationSupport.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.PathEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification; -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.LeafrefTypeBuilder; +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.source.SourceException; abstract class AbstractLeafrefSpecificationSupport - extends - AbstractStatementSupport> { + extends BaseStatementSupport> { AbstractLeafrefSpecificationSupport() { super(YangStmtMapping.TYPE); } @@ -26,13 +32,48 @@ abstract class AbstractLeafrefSpecificationSupport } @Override - public final LeafrefSpecification createDeclared(final StmtContext ctx) { - return new LeafrefSpecificationImpl(ctx); + protected final LeafrefSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new LeafrefSpecificationImpl(ctx, substatements); } @Override - public final EffectiveStatement createEffective( - final StmtContext> ctx) { - return new LeafrefSpecificationEffectiveStatement(ctx); + protected final LeafrefSpecification createEmptyDeclared(final StmtContext ctx) { + throw noPath(ctx); + } + + @Override + protected final EffectiveStatement createEffective( + final StmtContext> ctx, + final LeafrefSpecification declared, + final ImmutableList> substatements) { + final LeafrefTypeBuilder builder = BaseTypes.leafrefTypeBuilder(ctx.getSchemaPath().get()); + + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof PathEffectiveStatement) { + builder.setPathStatement(((PathEffectiveStatement) stmt).argument()); + } else if (stmt instanceof RequireInstanceEffectiveStatement) { + builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument()); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected final EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final LeafrefSpecification declared) { + throw noPath(ctx); + } + + private static SourceException noPath(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("A path 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/LeafrefSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationEffectiveStatement.java deleted file mode 100644 index 14f65eb9c2..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationEffectiveStatement.java +++ /dev/null @@ -1,51 +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.PathEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.LeafrefSpecification; -import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.LeafrefTypeBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class LeafrefSpecificationEffectiveStatement - extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - private final @NonNull LeafrefTypeDefinition typeDefinition; - - LeafrefSpecificationEffectiveStatement(final StmtContext> ctx) { - super(ctx); - - final LeafrefTypeBuilder builder = BaseTypes.leafrefTypeBuilder(ctx.getSchemaPath().get()); - - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof PathEffectiveStatement) { - builder.setPathStatement(((PathEffectiveStatement) stmt).argument()); - } else if (stmt instanceof RequireInstanceEffectiveStatement) { - builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument()); - } else if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public LeafrefTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java index 27dd08fa5e..557a710626 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/LeafrefSpecificationImpl.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.LeafrefSpecification; -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 LeafrefSpecificationImpl extends AbstractDeclaredStatement implements LeafrefSpecification { - LeafrefSpecificationImpl(final StmtContext context) { - super(context); +final class LeafrefSpecificationImpl extends WithSubstatements implements LeafrefSpecification { + LeafrefSpecificationImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); } }