diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java index a17328e7d7..c65d897734 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java @@ -213,7 +213,7 @@ public List> getEventSourcesFor(Class dependentType) { @Override public EventSource dynamicallyRegisterEventSource(EventSource eventSource) { synchronized (this) { - var actual = eventSources.existingEventSourceOfSameNameAndType(eventSource); + var actual = eventSources.existingEventSourceByName(eventSource.name()); if (actual != null) { eventSource = actual; } else { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java index 79091de0d3..e790ae3c32 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java @@ -19,10 +19,37 @@ class EventSources

{ private final ConcurrentNavigableMap>> sources = new ConcurrentSkipListMap<>(); + private final Map sourceByName = new HashMap<>(); + private final TimerEventSource

retryAndRescheduleTimerEventSource = new TimerEventSource<>("RetryAndRescheduleTimerEventSource"); private ControllerEventSource

controllerEventSource; + public void add(EventSource eventSource) { + final var name = eventSource.name(); + var existing = sourceByName.get(name); + if (existing != null) { + throw new IllegalArgumentException("Event source " + existing + + " is already registered with name: " + name); + } + sourceByName.put(name, eventSource); + sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource); + } + + public EventSource remove(String name) { + var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst(); + sourceByName.remove(name); + return optionalMap.map(m -> m.remove(name)).orElse(null); + } + + public void clear() { + sources.clear(); + sourceByName.clear(); + } + + public EventSource existingEventSourceByName(String name) { + return sourceByName.get(name); + } void createControllerEventSource(Controller

controller) { controllerEventSource = new ControllerEventSource<>(controller); @@ -54,30 +81,7 @@ Stream> flatMappedSources() { return sources.values().stream().flatMap(c -> c.values().stream()); } - public void clear() { - sources.clear(); - } - - @SuppressWarnings("unchecked") - public EventSource existingEventSourceOfSameNameAndType(EventSource source) { - return (EventSource) existingEventSourcesOfSameType(source).get(source.name()); - } - - private Map> existingEventSourcesOfSameType( - EventSource source) { - return sources.getOrDefault(keyFor(source), Collections.emptyMap()); - } - public void add(EventSource eventSource) { - final var name = eventSource.name(); - final var existing = existingEventSourcesOfSameType(eventSource); - if (existing.get(name) != null) { - throw new IllegalArgumentException("Event source " + existing - + " is already registered with name: " + name); - } - - sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource); - } private String keyFor(EventSource source) { return keyFor(source.resourceType()); @@ -145,10 +149,4 @@ public List> getEventSources(Class dependentType) { return sourcesForType.values().stream() .map(es -> (EventSource) es).toList(); } - - @SuppressWarnings("rawtypes") - public EventSource remove(String name) { - var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst(); - return optionalMap.map(m -> m.remove(name)).orElse(null); - } } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java index b5ff379dd6..7e45bda68c 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java @@ -48,8 +48,11 @@ public void registersEventSource() { @Test public void closeShouldCascadeToEventSources() { EventSource eventSource = mock(EventSource.class); + when(eventSource.name()).thenReturn("name1"); when(eventSource.resourceType()).thenReturn(EventSource.class); + EventSource eventSource2 = mock(TimerEventSource.class); + when(eventSource2.name()).thenReturn("name2"); when(eventSource2.resourceType()).thenReturn(AbstractEventSource.class); eventSourceManager.registerEventSource(eventSource); @@ -65,11 +68,12 @@ public void closeShouldCascadeToEventSources() { public void startCascadesToEventSources() { EventSource eventSource = mock(EventSource.class); when(eventSource.priority()).thenReturn(EventSourceStartPriority.DEFAULT); + when(eventSource.name()).thenReturn("name1"); when(eventSource.resourceType()).thenReturn(EventSource.class); EventSource eventSource2 = mock(TimerEventSource.class); when(eventSource2.priority()).thenReturn(EventSourceStartPriority.DEFAULT); + when(eventSource2.name()).thenReturn("name2"); when(eventSource2.resourceType()).thenReturn(AbstractEventSource.class); - eventSourceManager.registerEventSource(eventSource); eventSourceManager.registerEventSource(eventSource2); diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourcesTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourcesTest.java index 9c2d09bac4..3d0d92da4f 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourcesTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourcesTest.java @@ -134,7 +134,7 @@ void getShouldWork() { eventSourceMockWithName(EventSource.class, "name1", HasMetadata.class); final var mock2 = eventSourceMockWithName(EventSource.class, "name2", HasMetadata.class); - final var mock3 = eventSourceMockWithName(EventSource.class, "name2", ConfigMap.class); + final var mock3 = eventSourceMockWithName(EventSource.class, "name3", ConfigMap.class); eventSources.add(mock1); eventSources.add(mock2); @@ -142,7 +142,7 @@ void getShouldWork() { assertEquals(mock1, eventSources.get(HasMetadata.class, "name1")); assertEquals(mock2, eventSources.get(HasMetadata.class, "name2")); - assertEquals(mock3, eventSources.get(ConfigMap.class, "name2")); + assertEquals(mock3, eventSources.get(ConfigMap.class, "name3")); assertEquals(mock3, eventSources.get(ConfigMap.class, null));