Add OrderedByStatement.Ordering 99/86599/7
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 28 Dec 2019 10:22:28 +0000 (11:22 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 22 Jan 2020 15:18:02 +0000 (16:18 +0100)
This adds a utility enum to express parsed argument value, allowing
us to remove some string duplication.

JIRA: YANGTOOLS-1058
Change-Id: I147f51fbeb9140d6cd43a80d205218a73d827a21
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/OrderedByEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/OrderedByStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/leaf_list/AbstractLeafListStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ordered_by/AbstractOrderedByEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ordered_by/OrderedByStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ordered_by/OrderedByStatementSupport.java

index 724e272b90b32cf93337a6b25c2e86a06a82da14..9029d145f65e7eb848af92a0d2ac125cc49aade1 100644 (file)
@@ -9,8 +9,9 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
 
 @Beta
-public interface OrderedByEffectiveStatement extends EffectiveStatement<String, OrderedByStatement> {
+public interface OrderedByEffectiveStatement extends EffectiveStatement<Ordering, OrderedByStatement> {
 
 }
index 554f2159d44ef7ab226914b6e1bcee0573744a69..325e8286c19569188582e1eb6fea6ed062914f45 100644 (file)
@@ -10,10 +10,38 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import static com.google.common.base.Verify.verifyNotNull;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 
-public interface OrderedByStatement extends DeclaredStatement<String> {
-    default @NonNull String getValue() {
+public interface OrderedByStatement extends DeclaredStatement<OrderedByStatement.Ordering> {
+    @NonNullByDefault
+    enum Ordering {
+        SYSTEM("system"),
+        USER("user");
+
+        private final String argumentString;
+
+        Ordering(final String argumentString) {
+            this.argumentString = argumentString;
+        }
+
+        public String getArgumentString() {
+            return argumentString;
+        }
+
+        public static Ordering forArgumentString(final String argumentString) {
+            switch (argumentString) {
+                case "system":
+                    return SYSTEM;
+                case "user":
+                    return USER;
+                default:
+                    throw new IllegalArgumentException("Invalid ordering string '" + argumentString + "'");
+            }
+        }
+    }
+
+    default @NonNull Ordering getValue() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(argument());
     }
index 9dda6fbeb5f5b8a9833d717951a7aac9090ddddd..3d9288ed2988af175b6c69054d5f645c1f3b60c7 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
@@ -70,8 +71,8 @@ abstract class AbstractLeafListStatementSupport
                 .setHistory(ctx.getCopyHistory())
                 .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
                 .setConfiguration(ctx.isConfiguration())
-                .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, "system")
-                    .equals("user"))
+                .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, Ordering.SYSTEM)
+                    .equals(Ordering.USER))
                 .toFlags();
         final ImmutableSet<String> defaultValues = substatements.stream()
                 .filter(DefaultEffectiveStatement.class::isInstance)
index 8449858df7b8cc55ea6328a75561010ad32426bb..68f1dcd3efaff0e1d1e35904bd2e2470f62c14dc 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
@@ -100,8 +101,8 @@ abstract class AbstractListStatementSupport extends BaseQNameStatementSupport<Li
                 .setHistory(ctx.getCopyHistory())
                 .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
                 .setConfiguration(configuration)
-                .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, "system")
-                    .equals("user"))
+                .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, Ordering.SYSTEM)
+                    .equals(Ordering.USER))
                 .toFlags();
         if (configuration && keyDefinition.isEmpty() && !inGrouping(ctx)) {
             LOG.info("Configuration list {} does not define any keys in violation of RFC7950 section 7.8.2. While "
index 4d73782bf93ec748d8c28b1556a714d5627d2947..8ba8d285db8adc78bb21e3125987bebc4eb8c8b3 100644 (file)
@@ -9,10 +9,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ordered_by;
 
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement;
 
 abstract class AbstractOrderedByEffectiveStatement
-        extends AbstractDeclaredEffectiveStatement.DefaultArgument<String, OrderedByStatement>
+        extends AbstractDeclaredEffectiveStatement.DefaultArgument<Ordering, OrderedByStatement>
         implements OrderedByEffectiveStatement {
     AbstractOrderedByEffectiveStatement(final OrderedByStatement declared) {
         super(declared);
index 266b2558f0e22eeab46f8e0c9369cb59c1987640..d40b15d7bd00f985abbeb7c2a44911ad2463ac02 100644 (file)
@@ -8,11 +8,12 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ordered_by;
 
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class OrderedByStatementImpl extends AbstractDeclaredStatement<String> implements OrderedByStatement {
-    OrderedByStatementImpl(final StmtContext<String, OrderedByStatement, ?> context) {
+final class OrderedByStatementImpl extends AbstractDeclaredStatement<Ordering> implements OrderedByStatement {
+    OrderedByStatementImpl(final StmtContext<Ordering, OrderedByStatement, ?> context) {
         super(context);
     }
 }
index aeefa3bccc8ee5f6a0b6adce993614a7b5769bdd..d7244ea5b55a2dbbb633ed44ecb61427d5be14c9 100644 (file)
@@ -12,12 +12,14 @@ import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement.Ordering;
+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.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class OrderedByStatementSupport
-        extends BaseStringStatementSupport<OrderedByStatement, OrderedByEffectiveStatement> {
+        extends BaseStatementSupport<Ordering, OrderedByStatement, OrderedByEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
             SubstatementValidator.builder(YangStmtMapping.ORDERED_BY).build();
     private static final OrderedByStatementSupport INSTANCE = new OrderedByStatementSupport();
@@ -31,12 +33,16 @@ public final class OrderedByStatementSupport
     }
 
     @Override
-    public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return value;
+    public Ordering parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        try {
+            return Ordering.forArgumentString(value);
+        } catch (IllegalArgumentException e) {
+            throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid ordered-by argument '%s'", value);
+        }
     }
 
     @Override
-    public OrderedByStatement createDeclared(final StmtContext<String, OrderedByStatement, ?> ctx) {
+    public OrderedByStatement createDeclared(final StmtContext<Ordering, OrderedByStatement, ?> ctx) {
         return new OrderedByStatementImpl(ctx);
     }
 
@@ -47,7 +53,7 @@ public final class OrderedByStatementSupport
 
     @Override
     protected OrderedByEffectiveStatement createEffective(
-            final StmtContext<String, OrderedByStatement, OrderedByEffectiveStatement> ctx,
+            final StmtContext<Ordering, OrderedByStatement, OrderedByEffectiveStatement> ctx,
             final OrderedByStatement declared,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         return new RegularOrderedByEffectiveStatement(declared, substatements);
@@ -55,7 +61,7 @@ public final class OrderedByStatementSupport
 
     @Override
     protected OrderedByEffectiveStatement createEmptyEffective(
-            final StmtContext<String, OrderedByStatement, OrderedByEffectiveStatement> ctx,
+            final StmtContext<Ordering, OrderedByStatement, OrderedByEffectiveStatement> ctx,
             final OrderedByStatement declared) {
         return new EmptyOrderedByEffectiveStatement(declared);
     }