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();
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
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) {