Reuse OrderedByEffectiveStatement instances 72/87272/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Jan 2020 19:18:37 +0000 (20:18 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 29 Jan 2020 16:14:35 +0000 (17:14 +0100)
This is a low-cardinality statement for which we are already reusing
declared instances. This extends that support to cover effective
instances based on the shared declared instances.

Also ditch the use of EnumMap -- while it works, we only have two
values, which is easily taken care of by a switch statement.

JIRA: YANGTOOLS-1065
Change-Id: I43f135c9dec443b1b46b5517fa98f2c08af3d877
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit b235e6290637ae2decf53015012807026bb849db)

yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ordered_by/OrderedByStatementSupport.java

index 7a4372965377824e999bfc337e2413bb06ee3e16..e1f02af77bed1cf8c7dd29b2430db782f85192df 100644 (file)
@@ -30,6 +30,10 @@ public final class OrderedByStatementSupport
      */
     private static final @NonNull EmptyOrderedByStatement EMPTY_SYSTEM_DECL = new EmptyOrderedByStatement("system");
     private static final @NonNull EmptyOrderedByStatement EMPTY_USER_DECL = new EmptyOrderedByStatement("user");
+    private static final @NonNull EmptyOrderedByEffectiveStatement EMPTY_SYSTEM_EFF =
+            new EmptyOrderedByEffectiveStatement(EMPTY_SYSTEM_DECL);
+    private static final @NonNull EmptyOrderedByEffectiveStatement EMPTY_USER_EFF =
+            new EmptyOrderedByEffectiveStatement(EMPTY_USER_DECL);
 
     private OrderedByStatementSupport() {
         super(YangStmtMapping.ORDERED_BY);
@@ -91,6 +95,25 @@ public final class OrderedByStatementSupport
     protected OrderedByEffectiveStatement createEmptyEffective(
             final StmtContext<String, OrderedByStatement, OrderedByEffectiveStatement> ctx,
             final OrderedByStatement declared) {
+        // Aggressively reuse effective instances which are backed by the corresponding empty declared instance, as this
+        // is the case unless there is a weird extension in use.
+        final String argument = declared.getValue();
+        switch (argument) {
+            case "system":
+                if (EMPTY_SYSTEM_DECL.equals(declared)) {
+                    return EMPTY_SYSTEM_EFF;
+                }
+                break;
+            case "user":
+                if (EMPTY_USER_DECL.equals(declared)) {
+                    return EMPTY_USER_EFF;
+                }
+                break;
+            default:
+                throw new IllegalStateException("Unhandled argument " + argument);
+        }
+
+        // Declared instance was non-empty, which can happen with extensions
         return new EmptyOrderedByEffectiveStatement(declared);
     }
 }