Skip to content

Commit bb2fa7f

Browse files
csvirimetacosm
authored andcommitted
improve: ensure unique name on event sources (#2370)
* improve: ensure unique name on event sources Signed-off-by: Attila Mészáros <[email protected]> * fix Signed-off-by: Attila Mészáros <[email protected]> --------- Signed-off-by: Attila Mészáros <[email protected]>
1 parent 67f3703 commit bb2fa7f

File tree

4 files changed

+35
-33
lines changed

4 files changed

+35
-33
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public <R> List<EventSource<R, P>> getEventSourcesFor(Class<R> dependentType) {
213213
@Override
214214
public <R> EventSource<R, P> dynamicallyRegisterEventSource(EventSource<R, P> eventSource) {
215215
synchronized (this) {
216-
var actual = eventSources.existingEventSourceOfSameNameAndType(eventSource);
216+
var actual = eventSources.existingEventSourceByName(eventSource.name());
217217
if (actual != null) {
218218
eventSource = actual;
219219
} else {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java

+27-29
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,37 @@ class EventSources<P extends HasMetadata> {
1919

2020
private final ConcurrentNavigableMap<String, Map<String, EventSource<?, P>>> sources =
2121
new ConcurrentSkipListMap<>();
22+
private final Map<String, EventSource> sourceByName = new HashMap<>();
23+
2224
private final TimerEventSource<P> retryAndRescheduleTimerEventSource =
2325
new TimerEventSource<>("RetryAndRescheduleTimerEventSource");
2426
private ControllerEventSource<P> controllerEventSource;
2527

28+
public void add(EventSource eventSource) {
29+
final var name = eventSource.name();
30+
var existing = sourceByName.get(name);
31+
if (existing != null) {
32+
throw new IllegalArgumentException("Event source " + existing
33+
+ " is already registered with name: " + name);
34+
}
35+
sourceByName.put(name, eventSource);
36+
sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource);
37+
}
38+
39+
public EventSource remove(String name) {
40+
var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst();
41+
sourceByName.remove(name);
42+
return optionalMap.map(m -> m.remove(name)).orElse(null);
43+
}
44+
45+
public void clear() {
46+
sources.clear();
47+
sourceByName.clear();
48+
}
49+
50+
public EventSource existingEventSourceByName(String name) {
51+
return sourceByName.get(name);
52+
}
2653

2754
void createControllerEventSource(Controller<P> controller) {
2855
controllerEventSource = new ControllerEventSource<>(controller);
@@ -54,30 +81,7 @@ Stream<EventSource<?, P>> flatMappedSources() {
5481
return sources.values().stream().flatMap(c -> c.values().stream());
5582
}
5683

57-
public void clear() {
58-
sources.clear();
59-
}
60-
61-
@SuppressWarnings("unchecked")
62-
public <R> EventSource<R, P> existingEventSourceOfSameNameAndType(EventSource<R, P> source) {
63-
return (EventSource<R, P>) existingEventSourcesOfSameType(source).get(source.name());
64-
}
65-
66-
private <R> Map<String, EventSource<?, P>> existingEventSourcesOfSameType(
67-
EventSource<R, P> source) {
68-
return sources.getOrDefault(keyFor(source), Collections.emptyMap());
69-
}
7084

71-
public <R> void add(EventSource<R, P> eventSource) {
72-
final var name = eventSource.name();
73-
final var existing = existingEventSourcesOfSameType(eventSource);
74-
if (existing.get(name) != null) {
75-
throw new IllegalArgumentException("Event source " + existing
76-
+ " is already registered with name: " + name);
77-
}
78-
79-
sources.computeIfAbsent(keyFor(eventSource), k -> new HashMap<>()).put(name, eventSource);
80-
}
8185

8286
private <R> String keyFor(EventSource<R, P> source) {
8387
return keyFor(source.resourceType());
@@ -145,10 +149,4 @@ public <S> List<EventSource<S, P>> getEventSources(Class<S> dependentType) {
145149
return sourcesForType.values().stream()
146150
.map(es -> (EventSource<S, P>) es).toList();
147151
}
148-
149-
@SuppressWarnings("rawtypes")
150-
public EventSource remove(String name) {
151-
var optionalMap = sources.values().stream().filter(m -> m.containsKey(name)).findFirst();
152-
return optionalMap.map(m -> m.remove(name)).orElse(null);
153-
}
154152
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourceManagerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,11 @@ public void registersEventSource() {
4848
@Test
4949
public void closeShouldCascadeToEventSources() {
5050
EventSource eventSource = mock(EventSource.class);
51+
when(eventSource.name()).thenReturn("name1");
5152
when(eventSource.resourceType()).thenReturn(EventSource.class);
53+
5254
EventSource eventSource2 = mock(TimerEventSource.class);
55+
when(eventSource2.name()).thenReturn("name2");
5356
when(eventSource2.resourceType()).thenReturn(AbstractEventSource.class);
5457

5558
eventSourceManager.registerEventSource(eventSource);
@@ -65,11 +68,12 @@ public void closeShouldCascadeToEventSources() {
6568
public void startCascadesToEventSources() {
6669
EventSource eventSource = mock(EventSource.class);
6770
when(eventSource.priority()).thenReturn(EventSourceStartPriority.DEFAULT);
71+
when(eventSource.name()).thenReturn("name1");
6872
when(eventSource.resourceType()).thenReturn(EventSource.class);
6973
EventSource eventSource2 = mock(TimerEventSource.class);
7074
when(eventSource2.priority()).thenReturn(EventSourceStartPriority.DEFAULT);
75+
when(eventSource2.name()).thenReturn("name2");
7176
when(eventSource2.resourceType()).thenReturn(AbstractEventSource.class);
72-
7377
eventSourceManager.registerEventSource(eventSource);
7478
eventSourceManager.registerEventSource(eventSource2);
7579

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventSourcesTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ void getShouldWork() {
134134
eventSourceMockWithName(EventSource.class, "name1", HasMetadata.class);
135135
final var mock2 =
136136
eventSourceMockWithName(EventSource.class, "name2", HasMetadata.class);
137-
final var mock3 = eventSourceMockWithName(EventSource.class, "name2", ConfigMap.class);
137+
final var mock3 = eventSourceMockWithName(EventSource.class, "name3", ConfigMap.class);
138138

139139
eventSources.add(mock1);
140140
eventSources.add(mock2);
141141
eventSources.add(mock3);
142142

143143
assertEquals(mock1, eventSources.get(HasMetadata.class, "name1"));
144144
assertEquals(mock2, eventSources.get(HasMetadata.class, "name2"));
145-
assertEquals(mock3, eventSources.get(ConfigMap.class, "name2"));
145+
assertEquals(mock3, eventSources.get(ConfigMap.class, "name3"));
146146
assertEquals(mock3, eventSources.get(ConfigMap.class, null));
147147

148148

0 commit comments

Comments
 (0)