From b8a0082dda2731f9c27aad93f05d3c3e21915aa3 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 30 Jan 2020 15:42:35 +0100 Subject: [PATCH] Convert yang-version statement support yang-version statements are few and far between, but that is not a reason to be wasteful. This reworks declared and effective implementations to lower their footprint as well as share only a few instances typically. JIRA: YANGTOOLS-1065 Change-Id: Ia5485b3dff972fc41721a3ec72be9b7f2ea67088 Signed-off-by: Robert Varga --- .../stmt/YangVersionEffectiveStatement.java | 7 +- .../model/api/stmt/YangVersionStatement.java | 7 ++ .../EmptyYangVersionEffectiveStatement.java | 20 ++++++ .../EmptyYangVersionStatement.java | 18 +++++ .../RegularYangVersionEffectiveStatement.java | 23 +++++++ .../RegularYangVersionStatement.java | 21 ++++++ .../YangVersionStatementImpl.java | 19 ------ .../YangVersionStatementSupport.java | 68 +++++++++++++++---- 8 files changed, 150 insertions(+), 33 deletions(-) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionEffectiveStatement.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionStatement.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionEffectiveStatement.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionStatement.java delete mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementImpl.java diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionEffectiveStatement.java index 17790b8944..428a93b6ce 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionEffectiveStatement.java @@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta public interface YangVersionEffectiveStatement extends EffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.YANG_VERSION; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionStatement.java index 74df26cc3b..8d1cf10097 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionStatement.java @@ -11,9 +11,16 @@ import static com.google.common.base.Verify.verifyNotNull; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.YangVersion; +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.StatementDefinition; public interface YangVersionStatement extends DeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.YANG_VERSION; + } + default @NonNull YangVersion getValue() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here return verifyNotNull(argument()); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionEffectiveStatement.java new file mode 100644 index 0000000000..75ef435491 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionEffectiveStatement.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.yang_version; + +import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument; + +final class EmptyYangVersionEffectiveStatement extends DefaultArgument + implements YangVersionEffectiveStatement { + EmptyYangVersionEffectiveStatement(final YangVersionStatement declared) { + super(declared); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionStatement.java new file mode 100644 index 0000000000..c15bbc4dab --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionStatement.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.yang_version; + +import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString; + +final class EmptyYangVersionStatement extends ArgumentToString implements YangVersionStatement { + EmptyYangVersionStatement(final YangVersion argument) { + super(argument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionEffectiveStatement.java new file mode 100644 index 0000000000..cf07339cba --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionEffectiveStatement.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.yang_version; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; + +final class RegularYangVersionEffectiveStatement extends WithSubstatements + implements YangVersionEffectiveStatement { + RegularYangVersionEffectiveStatement(final YangVersionStatement declared, + final ImmutableList> substatements) { + super(declared, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionStatement.java new file mode 100644 index 0000000000..376c12a334 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionStatement.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.yang_version; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements; + +final class RegularYangVersionStatement extends WithSubstatements implements YangVersionStatement { + RegularYangVersionStatement(final YangVersion argument, + final ImmutableList> substatements) { + super(argument, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementImpl.java deleted file mode 100644 index eefb012d0b..0000000000 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementImpl.java +++ /dev/null @@ -1,19 +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.yang_version; - -import org.opendaylight.yangtools.yang.common.YangVersion; -import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; - -final class YangVersionStatementImpl extends AbstractDeclaredStatement implements YangVersionStatement { - YangVersionStatementImpl(final StmtContext context) { - super(context); - } -} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementSupport.java index 3819dec92c..507e5e772b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementSupport.java @@ -7,23 +7,36 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.yang_version; +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.YangVersion; 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.YangVersionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +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.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; public final class YangVersionStatementSupport - extends AbstractStatementSupport { + extends BaseStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .YANG_VERSION) .build(); private static final YangVersionStatementSupport INSTANCE = new YangVersionStatementSupport(); + private static final @NonNull EmptyYangVersionStatement EMPTY_VER1_DECL = + new EmptyYangVersionStatement(YangVersion.VERSION_1); + private static final @NonNull EmptyYangVersionStatement EMPTY_VER1_1_DECL = + new EmptyYangVersionStatement(YangVersion.VERSION_1_1); + private static final @NonNull EmptyYangVersionEffectiveStatement EMPTY_VER1_EFF = + new EmptyYangVersionEffectiveStatement(EMPTY_VER1_DECL); + private static final @NonNull EmptyYangVersionEffectiveStatement EMPTY_VER1_1_EFF = + new EmptyYangVersionEffectiveStatement(EMPTY_VER1_1_DECL); + private YangVersionStatementSupport() { super(YangStmtMapping.YANG_VERSION); } @@ -38,11 +51,6 @@ public final class YangVersionStatementSupport "Unsupported YANG version %s", value); } - @Override - public YangVersionStatement createDeclared(final StmtContext ctx) { - return new YangVersionStatementImpl(ctx); - } - @Override public void onPreLinkageDeclared( final Mutable stmt) { @@ -50,13 +58,47 @@ public final class YangVersionStatementSupport } @Override - public YangVersionEffectiveStatement createEffective( - final StmtContext ctx) { - return new YangVersionEffectiveStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected YangVersionStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularYangVersionStatement(ctx.coerceStatementArgument(), substatements); + } + + @Override + protected YangVersionStatement createEmptyDeclared(final StmtContext ctx) { + final YangVersion argument = ctx.coerceStatementArgument(); + switch (argument) { + case VERSION_1: + return EMPTY_VER1_DECL; + case VERSION_1_1: + return EMPTY_VER1_1_DECL; + default: + throw new IllegalStateException("Unhandled version " + argument); + } + } + + @Override + protected YangVersionEffectiveStatement createEffective( + final StmtContext ctx, + final YangVersionStatement declared, + final ImmutableList> substatements) { + return new RegularYangVersionEffectiveStatement(declared, substatements); + } + + @Override + protected YangVersionEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final YangVersionStatement declared) { + if (EMPTY_VER1_DECL.equals(declared)) { + return EMPTY_VER1_EFF; + } else if (EMPTY_VER1_1_DECL.equals(declared)) { + return EMPTY_VER1_1_EFF; + } else { + return new EmptyYangVersionEffectiveStatement(declared); + } } -} \ No newline at end of file +} -- 2.36.6