From a0f94fe03f06e56b53a27d0577ecca553702f1f6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Jul 2020 23:28:27 +0200 Subject: [PATCH] Migrate IdentityRefSpecificationSupport IdentityRefSpecificationSupport can use memory-efficient representation through BaseStatementSupport. Furthermore we can reuse TypeEffectiveStatementImpl instead of brewing a separate effective implementation. JIRA: YANGTOOLS-1065 Change-Id: Ic198df95ab519f42c687b7bec0d0620b9c9a9126 Signed-off-by: Robert Varga --- ...stractIdentityRefSpecificationSupport.java | 76 +++++++++++++++---- ...ityRefSpecificationEffectiveStatement.java | 57 -------------- .../type/IdentityRefSpecificationImpl.java | 11 ++- 3 files changed, 69 insertions(+), 75 deletions(-) delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationEffectiveStatement.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java index 91ea4029ee..dcb380573b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractIdentityRefSpecificationSupport.java @@ -7,21 +7,30 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; +import com.google.common.collect.ImmutableList; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; 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.BaseEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.IdentityRefSpecification; +import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; +import org.opendaylight.yangtools.yang.model.util.type.IdentityrefTypeBuilder; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; abstract class AbstractIdentityRefSpecificationSupport - extends AbstractStatementSupport> { AbstractIdentityRefSpecificationSupport() { super(YangStmtMapping.TYPE); @@ -32,18 +41,6 @@ abstract class AbstractIdentityRefSpecificationSupport return value; } - @Override - public final IdentityRefSpecification createDeclared(final StmtContext ctx) { - return new IdentityRefSpecificationImpl(ctx); - } - - @Override - public final EffectiveStatement createEffective( - final StmtContext> ctx) { - return new IdentityRefSpecificationEffectiveStatement(ctx); - } - @Override public final void onFullDefinitionDeclared(final Mutable> stmt) { @@ -59,4 +56,55 @@ abstract class AbstractIdentityRefSpecificationSupport baseIdentity.getLocalName()); } } + + @Override + protected final IdentityRefSpecification createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new IdentityRefSpecificationImpl(ctx, substatements); + } + + @Override + protected final IdentityRefSpecification createEmptyDeclared( + final StmtContext ctx) { + throw noBase(ctx); + } + + @Override + protected final EffectiveStatement createEffective( + final StmtContext> ctx, + final IdentityRefSpecification declared, + final ImmutableList> substatements) { + final IdentityrefTypeBuilder builder = BaseTypes.identityrefTypeBuilder(ctx.getSchemaPath().get()); + for (final EffectiveStatement stmt : substatements) { + if (stmt instanceof BaseEffectiveStatement) { + final QName identityQName = ((BaseEffectiveStatement) stmt).argument(); + final StmtContext identityCtx = + ctx.getFromNamespace(IdentityNamespace.class, identityQName); + builder.addIdentity((IdentitySchemaNode) identityCtx.buildEffective()); + } + } + + return new TypeEffectiveStatementImpl<>(declared, substatements, builder); + } + + @Override + protected final EffectiveStatement createEmptyEffective( + final StmtContext> ctx, + final IdentityRefSpecification declared) { + throw noBase(ctx); + } + + private static SourceException noBase(final StmtContext ctx) { + /* + * https://tools.ietf.org/html/rfc7950#section-9.10.2 + * + * The "base" statement, which is a substatement to the "type" + * statement, MUST be present at least once if the type is + * "identityref". + */ + return new SourceException("At least one base 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/IdentityRefSpecificationEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationEffectiveStatement.java deleted file mode 100644 index 126fe38e48..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationEffectiveStatement.java +++ /dev/null @@ -1,57 +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.common.QName; -import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -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.BaseEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.IdentityRefSpecification; -import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; -import org.opendaylight.yangtools.yang.model.util.type.IdentityrefTypeBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class IdentityRefSpecificationEffectiveStatement - extends DeclaredEffectiveStatementBase - implements TypeEffectiveStatement { - - private final @NonNull IdentityrefTypeDefinition typeDefinition; - - IdentityRefSpecificationEffectiveStatement(final StmtContext> ctx) { - super(ctx); - - final IdentityrefTypeBuilder builder = BaseTypes.identityrefTypeBuilder(ctx.getSchemaPath().get()); - for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof BaseEffectiveStatement) { - final QName identityQName = ((BaseEffectiveStatement) stmt).argument(); - final StmtContext identityCtx = - ctx.getFromNamespace(IdentityNamespace.class, identityQName); - builder.addIdentity((IdentitySchemaNode) identityCtx.buildEffective()); - } - if (stmt instanceof UnknownSchemaNode) { - builder.addUnknownSchemaNode((UnknownSchemaNode)stmt); - } - } - - typeDefinition = builder.build(); - } - - @Override - public IdentityrefTypeDefinition getTypeDefinition() { - return typeDefinition; - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java index 02ba0bb17d..779993a086 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/IdentityRefSpecificationImpl.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.IdentityRefSpecification; -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 IdentityRefSpecificationImpl extends AbstractDeclaredStatement implements IdentityRefSpecification { - IdentityRefSpecificationImpl(final StmtContext context) { - super(context); +final class IdentityRefSpecificationImpl extends WithSubstatements implements IdentityRefSpecification { + IdentityRefSpecificationImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); } } -- 2.36.6