Define MaxAccess enumeration 96/92496/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 18 Sep 2020 22:06:18 +0000 (00:06 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 19 Sep 2020 00:11:26 +0000 (02:11 +0200)
RFC2578 specifies which strings are actually valid as max-access
arguments. Make sure we properly validate them and use an enum.

JIRA: YANGTOOLS-1134
Change-Id: I9e22dccb115f34ab50aaa8cf84e09d12713c69fa
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 51d659c364c9b775f50fa5badb7cf986e5ec29ac)

yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccess.java [new file with mode: 0644]
yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccessEffectiveStatement.java
yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccessSchemaNode.java
yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccessStatement.java
yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/MaxAccessEffectiveStatementImpl.java
yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/MaxAccessStatementImpl.java
yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/MaxAccessStatementSupport.java
yang/rfc6643-parser-support/src/test/java/org/opendaylight/yangtools/rfc6643/parser/IetfYangSmiv2ExtensionPluginTest.java

diff --git a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccess.java b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/MaxAccess.java
new file mode 100644 (file)
index 0000000..726c290
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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.rfc6643.model.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import java.util.Arrays;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Maximum allowed access, as defined by
+ * <a href="https://tools.ietf.org/html/rfc2578#section-7.3">RFC2578 Section 7.3</a>.
+ */
+@Beta
+public enum MaxAccess {
+    /**
+     * Indicates the annotated object is an auxiliary object, as per
+     * <a href="https://tools.ietf.org/html/rfc2578#section-7.7">RFC2578 Section 7.7</a>.
+     */
+    NOT_ACCESSIBLE("not-accessible"),
+    /**
+     * Indicates the annotated object is accessible only for notifications.
+     */
+    ACCESSIBLE_FOR_NOTIFY("accessible-for-notify"),
+    /**
+     * Indicates that {@code read} access makes 'protocol sense', but  {@code write} and {@code create} do not.
+     */
+    READ_ONLY("read-only"),
+    /**
+     * Indicates that {@code read} and {@code write} access make 'protocol sense', but {@code create} does not.
+     */
+    READ_WRITE("read-write"),
+    /**
+     * Indicates that {@code read}, {@code write} and {@code create} access make 'protocol sense'.
+     */
+    READ_CREATE("read-create");
+
+    private static final ImmutableMap<String, MaxAccess> VALUES =
+            Maps.uniqueIndex(Arrays.asList(MaxAccess.values()), MaxAccess::stringLiteral);
+
+    private @NonNull String str;
+
+    MaxAccess(final @NonNull String str) {
+        this.str = str;
+    }
+
+    public @NonNull String stringLiteral() {
+        return str;
+    }
+
+    public static @Nullable MaxAccess forStringLiteral(final @NonNull String str) {
+        return VALUES.get(requireNonNull(str));
+    }
+}
index ff8ba64a062339dfdd6fb6df3b6c8dffff7df8bc..a9432a855533ad36fe7e4062a7ea83044c302d8f 100644 (file)
@@ -9,8 +9,12 @@ package org.opendaylight.yangtools.rfc6643.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
-public interface MaxAccessEffectiveStatement extends EffectiveStatement<String, MaxAccessStatement> {
-
+public interface MaxAccessEffectiveStatement extends EffectiveStatement<MaxAccess, MaxAccessStatement> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return IetfYangSmiv2ExtensionsMapping.MAX_ACCESS;
+    }
 }
index 5a2fb8a8a5f0008311984bc5e969883b604a1e0d..40d8473f926109c6651e38d2957d484c1043c547 100644 (file)
@@ -8,10 +8,11 @@
 package org.opendaylight.yangtools.rfc6643.model.api;
 
 import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 
 @Beta
 public interface MaxAccessSchemaNode extends UnknownSchemaNode {
 
-    String getArgument();
+    @NonNull MaxAccess getArgument();
 }
index e04dcbd9003c7fd894ef9bc69ca33fecba43fff9..15891f504eb4f10fce4f551f930334b6c7b5b1b9 100644 (file)
@@ -8,9 +8,13 @@
 package org.opendaylight.yangtools.rfc6643.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 @Beta
-public interface MaxAccessStatement extends UnknownStatement<String> {
-
+public interface MaxAccessStatement extends UnknownStatement<MaxAccess> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return IetfYangSmiv2ExtensionsMapping.MAX_ACCESS;
+    }
 }
index 23af3f295d73ee65f6397db671b59623f49ce7b3..4ea669f216658c6284e4d62c3a0648c2c66880c1 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import java.util.Objects;
+import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessStatement;
@@ -16,18 +17,18 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class MaxAccessEffectiveStatementImpl extends UnknownEffectiveStatementBase<String, MaxAccessStatement>
+final class MaxAccessEffectiveStatementImpl extends UnknownEffectiveStatementBase<MaxAccess, MaxAccessStatement>
         implements MaxAccessEffectiveStatement, MaxAccessSchemaNode {
 
     private final SchemaPath path;
 
-    MaxAccessEffectiveStatementImpl(final StmtContext<String, MaxAccessStatement, ?> ctx) {
+    MaxAccessEffectiveStatementImpl(final StmtContext<MaxAccess, MaxAccessStatement, ?> ctx) {
         super(ctx);
         path = ctx.getParentContext().getSchemaPath().get().createChild(getNodeType());
     }
 
     @Override
-    public String getArgument() {
+    public MaxAccess getArgument() {
         return argument();
     }
 
index 104aa0bb3bb42408c3ccd742622c38cee8cdd2d0..81c6e9f3cd47dc5c2db444a87704bd9d25cb4e27 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.yangtools.rfc6643.parser;
 
+import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class MaxAccessStatementImpl extends AbstractDeclaredStatement<String> implements MaxAccessStatement {
-    MaxAccessStatementImpl(final StmtContext<String, MaxAccessStatement, ?> context) {
+final class MaxAccessStatementImpl extends AbstractDeclaredStatement<MaxAccess> implements MaxAccessStatement {
+    MaxAccessStatementImpl(final StmtContext<MaxAccess, MaxAccessStatement, ?> context) {
         super(context);
     }
 }
index c208acd3ce8905e0e41b04d1f478440d909d7357..e3fd6a21225b91bd111891dcc386f166be690d23 100644 (file)
@@ -9,15 +9,17 @@ package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.rfc6643.model.api.IetfYangSmiv2ExtensionsMapping;
+import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 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;
 
 @Beta
 public final class MaxAccessStatementSupport
-        extends AbstractStatementSupport<String, MaxAccessStatement, MaxAccessEffectiveStatement> {
+        extends AbstractStatementSupport<MaxAccess, MaxAccessStatement, MaxAccessEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
             SubstatementValidator.builder(IetfYangSmiv2ExtensionsMapping.MAX_ACCESS).build();
     private static final MaxAccessStatementSupport INSTANCE = new MaxAccessStatementSupport();
@@ -31,8 +33,18 @@ public final class MaxAccessStatementSupport
     }
 
     @Override
-    public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return value;
+    public MaxAccess parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        final MaxAccess val = MaxAccess.forStringLiteral(value);
+        if (val == null) {
+            throw new SourceException(ctx.getStatementSourceReference(), "Invalid max-access value '%s'", value);
+        }
+        return val;
+    }
+
+    @Override
+    public String internArgument(final String rawArgument) {
+        final MaxAccess val = MaxAccess.forStringLiteral(rawArgument);
+        return val == null ? rawArgument : val.stringLiteral();
     }
 
     @Override
@@ -41,13 +53,13 @@ public final class MaxAccessStatementSupport
     }
 
     @Override
-    public MaxAccessStatement createDeclared(final StmtContext<String, MaxAccessStatement, ?> ctx) {
+    public MaxAccessStatement createDeclared(final StmtContext<MaxAccess, MaxAccessStatement, ?> ctx) {
         return new MaxAccessStatementImpl(ctx);
     }
 
     @Override
     public MaxAccessEffectiveStatement createEffective(
-            final StmtContext<String, MaxAccessStatement, MaxAccessEffectiveStatement> ctx) {
+            final StmtContext<MaxAccess, MaxAccessStatement, MaxAccessEffectiveStatement> ctx) {
         return new MaxAccessEffectiveStatementImpl(ctx);
     }
 }
\ No newline at end of file
index c0d599a30885e4f56e54936b97f53ca69477e1af..b3937cbcf57069a6ff76f7255c74371acd1d5d6c 100644 (file)
@@ -17,6 +17,7 @@ import org.junit.Test;
 import org.opendaylight.yangtools.rfc6643.model.api.AliasSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.DefValSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.ImpliedSchemaNode;
+import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.ObjectIdentifier;
 import org.opendaylight.yangtools.rfc6643.model.api.OidSchemaNode;
@@ -95,7 +96,7 @@ public class IetfYangSmiv2ExtensionPluginTest {
         ifStackHigherLayer.getUnknownSchemaNodes().forEach(unknownSchemaNode -> {
             if (unknownSchemaNode instanceof MaxAccessSchemaNode) {
                 final MaxAccessSchemaNode maxAccess = (MaxAccessSchemaNode) unknownSchemaNode;
-                assertEquals(maxAccess.getArgument(), "not-accessible");
+                assertEquals(MaxAccess.NOT_ACCESSIBLE, maxAccess.getArgument());
             }
         });