Factor out filter update logic 48/116448/7
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 5 May 2025 22:34:06 +0000 (00:34 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 6 May 2025 15:18:13 +0000 (15:18 +0000)
The DTCL implementation ends up calling down to the registry itself.
Move the logic down, so the listener becomes only and API bridge to
onFiltersUpdated().

Also use a plain NPE when forcing switch exhaustiveness.

JIRA: NETCONF-1459
Change-Id: Ie7961acb22d1922af7110288dd720a18b030e494
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
plugins/restconf-server-mdsal/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfStreamRegistry.java

index 3a51de1c486b3b5a1f8840bae86c3e02400236f4..e644c701b39fdf11f58c3b1c580538a2a6bd671f 100644 (file)
@@ -116,10 +116,9 @@ public final class MdsalRestconfStreamRegistry extends AbstractRestconfStreamReg
             for (var change : changes) {
                 final var node = change.getRootNode();
                 switch (node.modificationType()) {
-                    case null -> throw new IllegalStateException("Modification type is null for node: " + node);
+                    case null -> throw new NullPointerException();
                     case SUBTREE_MODIFIED, APPEARED, WRITE -> {
-                        final var data = (MapNode) node.dataAfter();
-                        processFilters(data);
+                        onFiltersUpdated((MapNode) node.dataAfter());
                     }
                     case DELETE, DISAPPEARED -> {
                         final var data = (MapNode) node.dataBefore();
@@ -142,55 +141,6 @@ public final class MdsalRestconfStreamRegistry extends AbstractRestconfStreamReg
         public void onInitialData() {
             // No filters at all
         }
-
-        private void processFilters(final MapNode node) {
-            if (node == null) {
-                return;
-            }
-            node.body().forEach(entry -> {
-                final var name = extractFilterName(entry);
-                final var filterSpec = (ChoiceNode) entry.childByArg(FILTER_SPEC_NODEID);
-                if (filterSpec == null) {
-                    removeFilter(name);
-                    LOG.debug("Removed filter {} without specification", name);
-                    return;
-                }
-
-                final EventStreamFilter filter;
-                try {
-                    filter = parseFilter(filterSpec);
-                } catch (RequestException e) {
-                    LOG.warn("Failed to parse subtree {} filter, removing it", filterSpec.prettyTree(), e);
-                    removeFilter(name);
-                    return;
-                }
-
-                putFilter(name, filter);
-                LOG.debug("Updated filter {} to {}", name, filter);
-            });
-        }
-
-        @NonNullByDefault
-        private EventStreamFilter parseFilter(final ChoiceNode filterSpec) throws RequestException {
-            final var subtree = (AnydataNode<?>) filterSpec.childByArg(STREAM_SUBTREE_FILTER_NODEID);
-            if (subtree != null) {
-                return parseSubtreeFilter(subtree);
-            }
-            final var xpath = (LeafNode<?>) filterSpec.childByArg(STREAM_XPATH_FILTER_NODEID);
-            if (xpath != null) {
-                return parseXpathFilter((String) xpath.body());
-            }
-            throw new RequestException("Unsupported filter %s", filterSpec);
-        }
-
-        private static @NonNull String extractFilterName(final MapEntryNode entry) {
-            if (entry.childByArg(NAME_NODEID) instanceof LeafNode<?> leafNode) {
-                if (leafNode.body() instanceof String filterName) {
-                    return filterName;
-                }
-            }
-            throw new IllegalStateException("Filter must have name: " + entry);
-        }
     }
 
     @Inject
@@ -242,6 +192,55 @@ public final class MdsalRestconfStreamRegistry extends AbstractRestconfStreamReg
         start(notificationSource);
     }
 
+    private void onFiltersUpdated(final MapNode filters) {
+        if (filters == null) {
+            return;
+        }
+        filters.body().forEach(entry -> {
+            final var name = extractFilterName(entry);
+            final var filterSpec = (ChoiceNode) entry.childByArg(FILTER_SPEC_NODEID);
+            if (filterSpec == null) {
+                removeFilter(name);
+                LOG.debug("Removed filter {} without specification", name);
+                return;
+            }
+
+            final EventStreamFilter filter;
+            try {
+                filter = parseFilter(filterSpec);
+            } catch (RequestException e) {
+                LOG.warn("Failed to parse subtree {} filter, removing it", filterSpec.prettyTree(), e);
+                removeFilter(name);
+                return;
+            }
+
+            putFilter(name, filter);
+            LOG.debug("Updated filter {} to {}", name, filter);
+        });
+    }
+
+    @NonNullByDefault
+    private EventStreamFilter parseFilter(final ChoiceNode filterSpec) throws RequestException {
+        final var subtree = (AnydataNode<?>) filterSpec.childByArg(STREAM_SUBTREE_FILTER_NODEID);
+        if (subtree != null) {
+            return parseSubtreeFilter(subtree);
+        }
+        final var xpath = (LeafNode<?>) filterSpec.childByArg(STREAM_XPATH_FILTER_NODEID);
+        if (xpath != null) {
+            return parseXpathFilter((String) xpath.body());
+        }
+        throw new RequestException("Unsupported filter %s", filterSpec);
+    }
+
+    private static @NonNull String extractFilterName(final MapEntryNode entry) {
+        if (entry.childByArg(NAME_NODEID) instanceof LeafNode<?> leafNode) {
+            if (leafNode.body() instanceof String filterName) {
+                return filterName;
+            }
+        }
+        throw new IllegalStateException("Filter must have name: " + entry);
+    }
+
     @Override
     protected ListenableFuture<Void> putStream(final RestconfStream<?> stream, final String description,
             final URI restconfURI) {