Convert yang-version statement support 18/87318/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 30 Jan 2020 14:42:35 +0000 (15:42 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 31 Jan 2020 10:35:28 +0000 (11:35 +0100)
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 <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/YangVersionStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/EmptyYangVersionStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/RegularYangVersionStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementImpl.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/yang_version/YangVersionStatementSupport.java

index 17790b8944d3972305b5bad7950c5cebc296a1e9..428a93b6ce475c540e4ceb4b73e07208ea22309f 100644 (file)
@@ -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<YangVersion, YangVersionStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.YANG_VERSION;
+    }
 }
index 74df26cc3b80386446a497fb9ba8c9d40cbb57ca..8d1cf10097f90578b0f7b8489221a6a1fca8de8c 100644 (file)
@@ -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<YangVersion> {
+    @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 (file)
index 0000000..75ef435
--- /dev/null
@@ -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<YangVersion, YangVersionStatement>
+        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 (file)
index 0000000..c15bbc4
--- /dev/null
@@ -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<YangVersion> 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 (file)
index 0000000..cf07339
--- /dev/null
@@ -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<YangVersion, YangVersionStatement>
+        implements YangVersionEffectiveStatement {
+    RegularYangVersionEffectiveStatement(final YangVersionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> 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 (file)
index 0000000..376c12a
--- /dev/null
@@ -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<YangVersion> implements YangVersionStatement {
+    RegularYangVersionStatement(final YangVersion argument,
+            final ImmutableList<? extends DeclaredStatement<?>> 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 (file)
index eefb012..0000000
+++ /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<YangVersion> implements YangVersionStatement {
-    YangVersionStatementImpl(final StmtContext<YangVersion, YangVersionStatement, ?> context) {
-        super(context);
-    }
-}
index 3819dec92c667478740f0fbae8f72d08766cb460..507e5e772b10170c07b5289b749775de541c5656 100644 (file)
@@ -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<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> {
+        extends BaseStatementSupport<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> {
     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<YangVersion, YangVersionStatement, ?> ctx) {
-        return new YangVersionStatementImpl(ctx);
-    }
-
     @Override
     public void onPreLinkageDeclared(
             final Mutable<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> stmt) {
@@ -50,13 +58,47 @@ public final class YangVersionStatementSupport
     }
 
     @Override
-    public YangVersionEffectiveStatement createEffective(
-            final StmtContext<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> ctx) {
-        return new YangVersionEffectiveStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected YangVersionStatement createDeclared(final StmtContext<YangVersion, YangVersionStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularYangVersionStatement(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected YangVersionStatement createEmptyDeclared(final StmtContext<YangVersion, YangVersionStatement, ?> 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<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> ctx,
+            final YangVersionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularYangVersionEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected YangVersionEffectiveStatement createEmptyEffective(
+            final StmtContext<YangVersion, YangVersionStatement, YangVersionEffectiveStatement> 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
+}