diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistry.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistry.java index c4b5e7d5..aa2e27f9 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistry.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistry.java @@ -19,10 +19,9 @@ import java.time.Clock; import java.time.Duration; import java.time.Instant; import java.util.Collection; -import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.function.Predicate; @@ -296,7 +295,7 @@ public class DefaultEventPublicationRegistry */ static class PublicationsInProgress implements Iterable { - private final Set publications = ConcurrentHashMap.newKeySet(); + private final Map publications = new ConcurrentHashMap<>(); /** * Registers the given {@link TargetEventPublication} as currently processed. @@ -308,7 +307,7 @@ public class DefaultEventPublicationRegistry Assert.notNull(publication, "TargetEventPublication must not be null!"); - publications.add(publication); + publications.put(new Key(publication), publication); return publication; } @@ -325,8 +324,7 @@ public class DefaultEventPublicationRegistry Assert.notNull(event, "Event must not be null!"); Assert.notNull(identifier, "PublicationTargetIdentifier must not be null!"); - getPublication(event, identifier) - .ifPresent(publications::remove); + publications.remove(new Key(event, identifier)); } /** @@ -338,7 +336,7 @@ public class DefaultEventPublicationRegistry Assert.notNull(publication, "TargetEventPublication must not be null!"); - publications.remove(publication); + publications.remove(new Key(publication)); } /** @@ -354,9 +352,7 @@ public class DefaultEventPublicationRegistry Assert.notNull(event, "Event must not be null!"); Assert.notNull(identifier, "PublicationTargetIdentifier must not be null!"); - return publications.stream() - .filter(it -> it.isAssociatedWith(event, identifier)) - .findFirst(); + return Optional.ofNullable(publications.get(new Key(event, identifier))); } /* @@ -365,7 +361,48 @@ public class DefaultEventPublicationRegistry */ @Override public Iterator iterator() { - return new HashSet<>(publications).iterator(); + return publications.values().iterator(); + } + + private record Key(Object event, PublicationTargetIdentifier identifier) { + + public Key(TargetEventPublication publication) { + this(publication.getEvent(), publication.getTargetIdentifier()); + } + + /* + * (non-Javadoc) + * @see org.springframework.modulith.events.core.DefaultEventPublicationRegistry.PublicationsInProgress.Key#equals(java.lang.Object) + */ + @Override + public final boolean equals(Object obj) { + + if (obj == this) { + return true; + } + + if (!(obj instanceof Key that)) { + return false; + } + + return this.event == that.event + && this.identifier.equals(identifier); + } + + /* + * (non-Javadoc) + * @see org.springframework.modulith.events.core.DefaultEventPublicationRegistry.PublicationsInProgress.Key#hashCode() + */ + @Override + public final int hashCode() { + + int result = 7; + + result += 31 * System.identityHashCode(event); + result += 31 * identifier.hashCode(); + + return result; + } } } } diff --git a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistryUnitTests.java b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistryUnitTests.java index 18ba5c3b..2bd84958 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistryUnitTests.java +++ b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/core/DefaultEventPublicationRegistryUnitTests.java @@ -97,7 +97,6 @@ class DefaultEventPublicationRegistryUnitTests { assertThat(inProgress.getPublication(firstEvent, identifier)).containsSame(first); assertThat(inProgress.getPublication(secondEvent, identifier)).containsSame(second); - } private DefaultEventPublicationRegistry createRegistry(Instant instant) {