diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSource.java index 8a4c476443..2a3f39322f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSource.java @@ -163,7 +163,7 @@ private boolean acceptedByFiler(Map cachedResourceMap, Map newReso if (onAddFilter != null || genericFilter != null) { var anyAddAccepted = addedResources.values().stream() - .anyMatch(r -> acceptedByGenericFiler(r) && onAddFilter.accept(r)); + .anyMatch(r -> acceptedByGenericFiler(r) && acceptedByOnAddFilter(r)); if (anyAddAccepted) { return true; } @@ -176,7 +176,7 @@ private boolean acceptedByFiler(Map cachedResourceMap, Map newReso if (onDeleteFilter != null || genericFilter != null) { var anyDeleteAccepted = deletedResource.values().stream() - .anyMatch(r -> acceptedByGenericFiler(r) && onDeleteFilter.accept(r, false)); + .anyMatch(r -> acceptedByGenericFiler(r) && acceptedByOnDeleteFilter(r)); if (anyDeleteAccepted) { return true; } @@ -197,11 +197,23 @@ private boolean acceptedByFiler(Map cachedResourceMap, Map newReso entry -> { var newResource = newResourcesMap.get(entry.getKey()); return acceptedByGenericFiler(newResource) - && onUpdateFilter.accept(newResource, entry.getValue()); + && acceptedByOnUpdateFilter(newResource, entry.getValue()); }); } else return !possibleUpdatedResources.isEmpty(); } + private boolean acceptedByOnAddFilter(R resource) { + return onAddFilter == null || onAddFilter.accept(resource); + } + + private boolean acceptedByOnDeleteFilter(R resource) { + return onDeleteFilter == null || onDeleteFilter.accept(resource, false); + } + + private boolean acceptedByOnUpdateFilter(R newResource, R oldResource) { + return onUpdateFilter == null || onUpdateFilter.accept(newResource, oldResource); + } + private boolean acceptedByGenericFiler(R resource) { return genericFilter == null || genericFilter.accept(resource); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSourceTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSourceTest.java index 889cc4da75..6fe97b2fdd 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSourceTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/ExternalResourceCachingEventSourceTest.java @@ -211,6 +211,43 @@ void genericFilteringEvents() { verify(eventHandler, times(0)).handleEvent(any()); } + @Test + void onlyGenericFilterSetDoesNotFailOnAdd() { + var eventSource = new TestExternalCachingEventSource(); + eventSource.setGenericFilter(res -> true); + setUpSource(eventSource); + + source.handleResources(primaryID1(), Set.of(testResource1())); + + verify(eventHandler, times(1)).handleEvent(any()); + } + + @Test + void onlyGenericFilterSetDoesNotFailOnDelete() { + var eventSource = new TestExternalCachingEventSource(); + eventSource.setGenericFilter(res -> true); + setUpSource(eventSource); + + source.handleResources(primaryID1(), Set.of(testResource1())); + source.handleResources(primaryID1(), Set.of()); + + verify(eventHandler, times(2)).handleEvent(any()); + } + + @Test + void onlyGenericFilterSetDoesNotFailOnUpdate() { + var eventSource = new TestExternalCachingEventSource(); + eventSource.setGenericFilter(res -> true); + setUpSource(eventSource); + + source.handleResources(primaryID1(), Set.of(testResource1())); + var changed = testResource1(); + changed.setValue("changedValue"); + source.handleResources(primaryID1(), Set.of(changed)); + + verify(eventHandler, times(2)).handleEvent(any()); + } + public static class TestExternalCachingEventSource extends ExternalResourceCachingEventSource { public TestExternalCachingEventSource() {