diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 0c7578a1..8b974402 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -12,14 +12,14 @@ jobs: boot: - '3.1.12' - '3.2.12' - - '3.3.10' - - '3.3.11-SNAPSHOT' - - '3.4.5-SNAPSHOT' + - '3.3.11' + - '3.3.12-SNAPSHOT' + - '3.4.6-SNAPSHOT' - '3.5.0-M3' - '3.5.0-SNAPSHOT' jmolecules: - - '2023.2.1' - - '2025.0.0-RC2' + - '2023.3.1' + - '2025.0.0-RC3' name: Build against Boot ${{ matrix.boot }} / jMolecules ${{ matrix.jmolecules }} runs-on: ubuntu-latest diff --git a/pom.xml b/pom.xml index 89375641..c580d1d0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 pom @@ -40,11 +40,11 @@ 4.16.1 7.0.0.202409031743-r 1.5.2 - 2023.2.1 + 2023.2.2 UTF-8 UTF-8 - 3.4.4 - 6.2.5 + 3.4.5 + 6.2.6 3.1.1 1.17.6 @@ -131,8 +131,9 @@ limitations under the License. - spring-modulith-integration-test + spring-modulith-benchmarks spring-modulith-examples + spring-modulith-integration-test @@ -164,6 +165,7 @@ limitations under the License. prepare-release + spring-modulith-benchmarks spring-modulith-distribution spring-modulith-examples spring-modulith-integration-test @@ -526,6 +528,11 @@ limitations under the License. maven-shade-plugin 3.6.0 + + org.codehaus.mojo + exec-maven-plugin + 3.5.0 + @@ -639,7 +646,7 @@ limitations under the License. https://github.com/spring-projects/spring-modulith scm:git:https://github.com/spring-projects/spring-modulith scm:git:ssh://git@github.com/spring-projects-experimental/spring-modulith - 1.3.4 + 1.3.5 diff --git a/spring-modulith-actuator/pom.xml b/spring-modulith-actuator/pom.xml index c5a49703..de48e79e 100644 --- a/spring-modulith-actuator/pom.xml +++ b/spring-modulith-actuator/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 Spring Modulith - Actuator diff --git a/spring-modulith-api/pom.xml b/spring-modulith-api/pom.xml index d0c859cc..4bc54788 100644 --- a/spring-modulith-api/pom.xml +++ b/spring-modulith-api/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-apt/pom.xml b/spring-modulith-apt/pom.xml index 94999838..0bb32026 100644 --- a/spring-modulith-apt/pom.xml +++ b/spring-modulith-apt/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 Spring Modulith - APT diff --git a/spring-modulith-benchmarks/pom.xml b/spring-modulith-benchmarks/pom.xml new file mode 100644 index 00000000..ad67485b --- /dev/null +++ b/spring-modulith-benchmarks/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + + + org.springframework.modulith + spring-modulith + 1.3.5 + ../pom.xml + + + Spring Modulith - Benchmarks + spring-modulith-benchmarks + + + + 1.37 + true + org.springframework.modulith.benchmark + + + + + + org.springframework.modulith + spring-modulith-events-core + ${project.version} + test + + + + org.junit.jupiter + junit-jupiter + test + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + com.github.mp911de.microbenchmark-runner + microbenchmark-runner-junit5 + 0.4.0.RELEASE + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + + + + + + jitpack.io + https://jitpack.io + + + + \ No newline at end of file diff --git a/spring-modulith-benchmarks/src/test/java/org/springframework/modulith/events/core/PublicationsInProgressBenchmarks.java b/spring-modulith-benchmarks/src/test/java/org/springframework/modulith/events/core/PublicationsInProgressBenchmarks.java new file mode 100644 index 00000000..5ab9fa12 --- /dev/null +++ b/spring-modulith-benchmarks/src/test/java/org/springframework/modulith/events/core/PublicationsInProgressBenchmarks.java @@ -0,0 +1,106 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.modulith.events.core; + +import jmh.mbr.junit5.Microbenchmark; +import lombok.Value; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import org.springframework.modulith.events.core.DefaultEventPublicationRegistry.PublicationsInProgress; + +/** + * @author Oliver Drotbohm + */ +@Warmup(iterations = 10, time = 2) +@Measurement(iterations = 10, time = 2) +@Microbenchmark +public class PublicationsInProgressBenchmarks { + + @State(Scope.Benchmark) + public static class Fixture implements Iterable { + + private static final int NUMBER = 100; + + private final List events = new ArrayList<>(); + private final List identifiers = new ArrayList<>(); + private final List randomPublications = new ArrayList<>(); + + PublicationsInProgress inProgress; + + public Fixture() { + + this.inProgress = new DefaultEventPublicationRegistry.PublicationsInProgress(); + + for (int i = 0; i < NUMBER; i++) { + + var event = new Event(UUID.randomUUID().toString()); + + for (int j = 0; j < NUMBER; j++) { + + var identifier = PublicationTargetIdentifier.of(UUID.randomUUID().toString()); + + events.add(event); + identifiers.add(identifier); + + inProgress.register(TargetEventPublication.of(event, identifier)); + } + } + + var random = new Random(); + + for (int i = 0; i < NUMBER; i++) { + + var event = events.get(random.nextInt(NUMBER)); + var id = identifiers.get(random.nextInt(NUMBER)); + + randomPublications.add(TargetEventPublication.of(event, id)); + } + } + + /* + * (non-Javadoc) + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return randomPublications.iterator(); + } + + @Value + static class Event { + String value; + } + } + + @Benchmark + public void inProgressPublicationsAccess(Fixture fixture, Blackhole sink) { + + for (TargetEventPublication publication : fixture) { + sink.consume(fixture.inProgress.getPublication(publication.getEvent(), publication.getTargetIdentifier())); + } + } +} diff --git a/spring-modulith-bom/pom.xml b/spring-modulith-bom/pom.xml index 0aab8aaf..1f972630 100644 --- a/spring-modulith-bom/pom.xml +++ b/spring-modulith-bom/pom.xml @@ -13,7 +13,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml @@ -22,152 +22,152 @@ org.springframework.modulith spring-modulith-actuator - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-apt - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-core - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-docs - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-amqp - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-aws-sns - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-aws-sqs - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-core - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-jackson - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-jdbc - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-jms - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-jpa - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-kafka - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-messaging - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-mongodb - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-tests - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-junit - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-moments - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-observability - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-runtime - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-core - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-insight - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-jdbc - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-jpa - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-mongodb - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-neo4j - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-starter-test - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-test - 1.3.4 + 1.3.5 diff --git a/spring-modulith-core/pom.xml b/spring-modulith-core/pom.xml index eb9c88a3..45ffccb4 100644 --- a/spring-modulith-core/pom.xml +++ b/spring-modulith-core/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/FormattableType.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/FormattableType.java index 709b0595..95abff2a 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/FormattableType.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/FormattableType.java @@ -76,7 +76,7 @@ private FormattableType(String type) { .collect(Collectors.joining(".")); return abbreviatedPackage.concat(".") // - .concat(ClassUtils.getShortName(getFullName())); + .concat(ClassUtils.getShortName(type)); }); } @@ -158,7 +158,7 @@ public String getAbbreviatedFullName(@Nullable ApplicationModule module) { return abbreviate(basePackageName) // .concat(typePackageName.substring(basePackageName.length())) // .concat(".") // - .concat(ClassUtils.getShortName(getFullName())); + .concat(ClassUtils.getShortName(type)); } /* diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/NamedInterfaces.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/NamedInterfaces.java index 5c10be27..180a67bc 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/NamedInterfaces.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/NamedInterfaces.java @@ -250,7 +250,7 @@ private static List ofAnnotatedTypes(Classes classes) { .filter(it -> !JavaPackage.isPackageInfoType(it)) // .forEach(it -> { - if (!it.isAnnotatedWith(org.springframework.modulith.NamedInterface.class)) { + if (!it.isMetaAnnotatedWith(org.springframework.modulith.NamedInterface.class)) { return; } diff --git a/spring-modulith-core/src/test/java/example/metani/Exposed.java b/spring-modulith-core/src/test/java/example/metani/Exposed.java new file mode 100644 index 00000000..161085af --- /dev/null +++ b/spring-modulith-core/src/test/java/example/metani/Exposed.java @@ -0,0 +1,22 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.metani; + +/** + * @author Oliver Drotbohm + */ +@ModuleApi +public class Exposed {} diff --git a/spring-modulith-core/src/test/java/example/metani/ModuleApi.java b/spring-modulith-core/src/test/java/example/metani/ModuleApi.java new file mode 100644 index 00000000..8afc6b3b --- /dev/null +++ b/spring-modulith-core/src/test/java/example/metani/ModuleApi.java @@ -0,0 +1,32 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example.metani; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import org.springframework.modulith.NamedInterface; + +/** + * @author Oliver Drotbohm + */ +@Retention(RUNTIME) +@Target({ TYPE }) +@NamedInterface("api") +public @interface ModuleApi {} diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ApplicationModulesUnitTests.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ApplicationModulesUnitTests.java index 2eee5a3a..c1cb9438 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ApplicationModulesUnitTests.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ApplicationModulesUnitTests.java @@ -37,6 +37,7 @@ void discoversComplexModuleArrangement() { .containsExactlyInAnyOrder( "invalid", "customId", + "metani", "ni", "ni.nested", "ni.nested.b.first", diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/NamedInterfacesUnitTests.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/NamedInterfacesUnitTests.java index 2dec5abe..428a6be5 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/NamedInterfacesUnitTests.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/NamedInterfacesUnitTests.java @@ -98,6 +98,18 @@ void detectsNamedInterfacesATypeIsContainedIn() { .containsExactlyInAnyOrder("spi", "kpi"); } + @Test // GH-1139 + void discoveredNamedInterfaceOnComposedAnnotation() { + + var pkg = TestUtils.getPackage(example.metani.Exposed.class); + + var result = NamedInterfaces.discoverNamedInterfaces(pkg); + + assertThat(result).hasSize(2) + .extracting(NamedInterface::getName) + .containsExactlyInAnyOrder(NamedInterface.UNNAMED_NAME, "api"); + } + private static void assertInterfaceContains(NamedInterfaces interfaces, String name, Class... types) { var classNames = Arrays.stream(types).map(Class::getName).toArray(String[]::new); diff --git a/spring-modulith-distribution/pom.xml b/spring-modulith-distribution/pom.xml index 3f14c0fb..5242542a 100644 --- a/spring-modulith-distribution/pom.xml +++ b/spring-modulith-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-docs/pom.xml b/spring-modulith-docs/pom.xml index 8ecde768..7c68164b 100644 --- a/spring-modulith-docs/pom.xml +++ b/spring-modulith-docs/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/pom.xml b/spring-modulith-events/pom.xml index 3fda2c27..fabed5f4 100644 --- a/spring-modulith-events/pom.xml +++ b/spring-modulith-events/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-amqp/pom.xml b/spring-modulith-events/spring-modulith-events-amqp/pom.xml index 99577817..d7ebd248 100644 --- a/spring-modulith-events/spring-modulith-events-amqp/pom.xml +++ b/spring-modulith-events/spring-modulith-events-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - AMQP support diff --git a/spring-modulith-events/spring-modulith-events-api/pom.xml b/spring-modulith-events/spring-modulith-events-api/pom.xml index edc3f5e8..23ce302f 100644 --- a/spring-modulith-events/spring-modulith-events-api/pom.xml +++ b/spring-modulith-events/spring-modulith-events-api/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - API diff --git a/spring-modulith-events/spring-modulith-events-aws-sns/pom.xml b/spring-modulith-events/spring-modulith-events-aws-sns/pom.xml index d43fce8c..907c9ae6 100644 --- a/spring-modulith-events/spring-modulith-events-aws-sns/pom.xml +++ b/spring-modulith-events/spring-modulith-events-aws-sns/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - AWS SNS support diff --git a/spring-modulith-events/spring-modulith-events-aws-sqs/pom.xml b/spring-modulith-events/spring-modulith-events-aws-sqs/pom.xml index 31865785..67a8e537 100644 --- a/spring-modulith-events/spring-modulith-events-aws-sqs/pom.xml +++ b/spring-modulith-events/spring-modulith-events-aws-sqs/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - AWS SQS support diff --git a/spring-modulith-events/spring-modulith-events-core/pom.xml b/spring-modulith-events/spring-modulith-events-core/pom.xml index 35333a43..665f7add 100644 --- a/spring-modulith-events/spring-modulith-events-core/pom.xml +++ b/spring-modulith-events/spring-modulith-events-core/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventExternalizationAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventExternalizationAutoConfiguration.java index fba66b9b..59c71833 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventExternalizationAutoConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventExternalizationAutoConfiguration.java @@ -17,6 +17,8 @@ import java.lang.reflect.Method; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -38,6 +40,7 @@ * Auto-configuration to externalize application events. * * @author Oliver Drotbohm + * @author 조상준 * @since 1.1 */ @ConditionalOnProperty(name = "spring.modulith.events.externalization.enabled", @@ -47,6 +50,8 @@ @AutoConfigureAfter(EventPublicationConfiguration.class) public class EventExternalizationAutoConfiguration { + private static final Logger LOG = LoggerFactory.getLogger(EventExternalizationAutoConfiguration.class); + @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) static EventListenerFactory filteringEventListenerFactory(EventExternalizationConfiguration config) { @@ -60,6 +65,9 @@ static EventExternalizationConfiguration eventExternalizationConfiguration(BeanF var packages = AutoConfigurationPackages.get(factory); + LOG.debug("Configuring event externalization to export events annotated with @Externalized in packages: {}", + packages); + return EventExternalizationConfiguration.defaults(packages).build(); } 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..9bc4de44 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.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 @@ private static String getConfirmationMessage(Collection publications) { */ 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 @@ TargetEventPublication register(TargetEventPublication publication) { Assert.notNull(publication, "TargetEventPublication must not be null!"); - publications.add(publication); + publications.put(new Key(publication), publication); return publication; } @@ -325,8 +324,7 @@ void unregister(Object event, PublicationTargetIdentifier identifier) { 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 @@ void unregister(TargetEventPublication publication) { Assert.notNull(publication, "TargetEventPublication must not be null!"); - publications.remove(publication); + publications.remove(new Key(publication)); } /** @@ -354,9 +352,7 @@ Optional getPublication(Object event, PublicationTargetI 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,14 @@ Optional getPublication(Object event, PublicationTargetI */ @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()); + } } } } diff --git a/spring-modulith-events/spring-modulith-events-jackson/pom.xml b/spring-modulith-events/spring-modulith-events-jackson/pom.xml index b601e29c..bda3a453 100644 --- a/spring-modulith-events/spring-modulith-events-jackson/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jackson/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml index e7c55f7a..d93d5fc3 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-jms/pom.xml b/spring-modulith-events/spring-modulith-events-jms/pom.xml index e9fbddd9..3023bf2e 100644 --- a/spring-modulith-events/spring-modulith-events-jms/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jms/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - JMS support diff --git a/spring-modulith-events/spring-modulith-events-jpa/pom.xml b/spring-modulith-events/spring-modulith-events-jpa/pom.xml index 701bb3db..da7fa5d2 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jpa/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-kafka/pom.xml b/spring-modulith-events/spring-modulith-events-kafka/pom.xml index 03255929..548bb454 100644 --- a/spring-modulith-events/spring-modulith-events-kafka/pom.xml +++ b/spring-modulith-events/spring-modulith-events-kafka/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - Kafka support diff --git a/spring-modulith-events/spring-modulith-events-messaging/pom.xml b/spring-modulith-events/spring-modulith-events-messaging/pom.xml index 313e82fd..15e1b5b7 100644 --- a/spring-modulith-events/spring-modulith-events-messaging/pom.xml +++ b/spring-modulith-events/spring-modulith-events-messaging/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - Spring Messaging support diff --git a/spring-modulith-events/spring-modulith-events-mongodb/pom.xml b/spring-modulith-events/spring-modulith-events-mongodb/pom.xml index 37920683..300699c8 100644 --- a/spring-modulith-events/spring-modulith-events-mongodb/pom.xml +++ b/spring-modulith-events/spring-modulith-events-mongodb/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-neo4j/pom.xml b/spring-modulith-events/spring-modulith-events-neo4j/pom.xml index 53007f9a..5ae31120 100644 --- a/spring-modulith-events/spring-modulith-events-neo4j/pom.xml +++ b/spring-modulith-events/spring-modulith-events-neo4j/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-events/spring-modulith-events-tests/pom.xml b/spring-modulith-events/spring-modulith-events-tests/pom.xml index 02a79f1d..83882cdf 100644 --- a/spring-modulith-events/spring-modulith-events-tests/pom.xml +++ b/spring-modulith-events/spring-modulith-events-tests/pom.xml @@ -3,7 +3,7 @@ org.springframework.modulith spring-modulith-events - 1.3.4 + 1.3.5 Spring Modulith - Events - Integration tests diff --git a/spring-modulith-examples/pom.xml b/spring-modulith-examples/pom.xml index 8ea6e66b..4e36308f 100644 --- a/spring-modulith-examples/pom.xml +++ b/spring-modulith-examples/pom.xml @@ -4,13 +4,13 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 pom Spring Modulith - Examples @@ -25,7 +25,7 @@ 17 - 2023.2.1 + 2023.2.2 true @@ -101,7 +101,7 @@ org.springframework.modulith spring-modulith-bom - 1.3.4 + 1.3.5 pom import @@ -186,6 +186,6 @@ - 1.3.4 + 1.3.5 diff --git a/spring-modulith-examples/spring-modulith-example-epr-jdbc/pom.xml b/spring-modulith-examples/spring-modulith-example-epr-jdbc/pom.xml index c66cf826..dce6df66 100644 --- a/spring-modulith-examples/spring-modulith-example-epr-jdbc/pom.xml +++ b/spring-modulith-examples/spring-modulith-example-epr-jdbc/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-examples/spring-modulith-example-epr-mongodb/pom.xml b/spring-modulith-examples/spring-modulith-example-epr-mongodb/pom.xml index 99ec1ca9..0895c0f5 100644 --- a/spring-modulith-examples/spring-modulith-example-epr-mongodb/pom.xml +++ b/spring-modulith-examples/spring-modulith-example-epr-mongodb/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-examples/spring-modulith-example-epr-neo4j/pom.xml b/spring-modulith-examples/spring-modulith-example-epr-neo4j/pom.xml index ad36a012..8b364676 100644 --- a/spring-modulith-examples/spring-modulith-example-epr-neo4j/pom.xml +++ b/spring-modulith-examples/spring-modulith-example-epr-neo4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-examples/spring-modulith-example-full/pom.xml b/spring-modulith-examples/spring-modulith-example-full/pom.xml index 4b86aa98..77582d0c 100644 --- a/spring-modulith-examples/spring-modulith-example-full/pom.xml +++ b/spring-modulith-examples/spring-modulith-example-full/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-examples/spring-modulith-example-kafka/pom.xml b/spring-modulith-examples/spring-modulith-example-kafka/pom.xml index 2ce8ea69..4bada84f 100644 --- a/spring-modulith-examples/spring-modulith-example-kafka/pom.xml +++ b/spring-modulith-examples/spring-modulith-example-kafka/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-examples - 1.3.4 + 1.3.5 Spring Modulith - Examples - Kafka Example diff --git a/spring-modulith-integration-test/pom.xml b/spring-modulith-integration-test/pom.xml index 9d7d23dc..dae6e583 100644 --- a/spring-modulith-integration-test/pom.xml +++ b/spring-modulith-integration-test/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-junit/pom.xml b/spring-modulith-junit/pom.xml index e1c14a4e..7c79c7de 100644 --- a/spring-modulith-junit/pom.xml +++ b/spring-modulith-junit/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-moments/pom.xml b/spring-modulith-moments/pom.xml index 215257ad..e46368b1 100644 --- a/spring-modulith-moments/pom.xml +++ b/spring-modulith-moments/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 Spring Modulith - Moments diff --git a/spring-modulith-observability/pom.xml b/spring-modulith-observability/pom.xml index 3f18969a..626dc8cd 100644 --- a/spring-modulith-observability/pom.xml +++ b/spring-modulith-observability/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 spring-modulith-observability diff --git a/spring-modulith-runtime/pom.xml b/spring-modulith-runtime/pom.xml index dd845d34..6e00e847 100644 --- a/spring-modulith-runtime/pom.xml +++ b/spring-modulith-runtime/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 Spring Modulith - Runtime support diff --git a/spring-modulith-starters/pom.xml b/spring-modulith-starters/pom.xml index 9207e3cf..05cf2181 100644 --- a/spring-modulith-starters/pom.xml +++ b/spring-modulith-starters/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/spring-modulith-starters/spring-modulith-starter-core/pom.xml b/spring-modulith-starters/spring-modulith-starter-core/pom.xml index d638c6f2..34c71f77 100644 --- a/spring-modulith-starters/spring-modulith-starter-core/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-core/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,26 +21,26 @@ org.springframework.modulith spring-modulith-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-apt - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-core - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-moments - 1.3.4 + 1.3.5 diff --git a/spring-modulith-starters/spring-modulith-starter-insight/pom.xml b/spring-modulith-starters/spring-modulith-starter-insight/pom.xml index 593906cc..b0a4276a 100644 --- a/spring-modulith-starters/spring-modulith-starter-insight/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-insight/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,14 +21,14 @@ org.springframework.modulith spring-modulith-actuator - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-observability - 1.3.4 + 1.3.5 runtime diff --git a/spring-modulith-starters/spring-modulith-starter-jdbc/pom.xml b/spring-modulith-starters/spring-modulith-starter-jdbc/pom.xml index 08e3187c..26215a6f 100644 --- a/spring-modulith-starters/spring-modulith-starter-jdbc/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-jdbc/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,7 +21,7 @@ org.springframework.modulith spring-modulith-starter-core - 1.3.4 + 1.3.5 @@ -29,24 +29,24 @@ org.springframework.modulith spring-modulith-events-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-core - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jackson - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jdbc - 1.3.4 + 1.3.5 runtime diff --git a/spring-modulith-starters/spring-modulith-starter-jpa/pom.xml b/spring-modulith-starters/spring-modulith-starter-jpa/pom.xml index 295f7bf2..a8246c16 100644 --- a/spring-modulith-starters/spring-modulith-starter-jpa/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-jpa/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,7 +21,7 @@ org.springframework.modulith spring-modulith-starter-core - 1.3.4 + 1.3.5 @@ -29,24 +29,24 @@ org.springframework.modulith spring-modulith-events-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-core - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jackson - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jpa - 1.3.4 + 1.3.5 runtime diff --git a/spring-modulith-starters/spring-modulith-starter-mongodb/pom.xml b/spring-modulith-starters/spring-modulith-starter-mongodb/pom.xml index b9f709a7..08c8aaa2 100644 --- a/spring-modulith-starters/spring-modulith-starter-mongodb/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-mongodb/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,31 +21,31 @@ org.springframework.modulith spring-modulith-starter-core - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-core - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jackson - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-mongodb - 1.3.4 + 1.3.5 runtime diff --git a/spring-modulith-starters/spring-modulith-starter-neo4j/pom.xml b/spring-modulith-starters/spring-modulith-starter-neo4j/pom.xml index 87123cc7..2e317dcf 100644 --- a/spring-modulith-starters/spring-modulith-starter-neo4j/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-neo4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -21,7 +21,7 @@ org.springframework.modulith spring-modulith-starter-core - 1.3.4 + 1.3.5 @@ -29,24 +29,24 @@ org.springframework.modulith spring-modulith-events-api - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-events-core - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-jackson - 1.3.4 + 1.3.5 runtime org.springframework.modulith spring-modulith-events-neo4j - 1.3.4 + 1.3.5 runtime diff --git a/spring-modulith-starters/spring-modulith-starter-test/pom.xml b/spring-modulith-starters/spring-modulith-starter-test/pom.xml index 540e061c..e64af6a9 100644 --- a/spring-modulith-starters/spring-modulith-starter-test/pom.xml +++ b/spring-modulith-starters/spring-modulith-starter-test/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith-starters - 1.3.4 + 1.3.5 ../pom.xml @@ -25,13 +25,13 @@ org.springframework.modulith spring-modulith-test - 1.3.4 + 1.3.5 org.springframework.modulith spring-modulith-docs - 1.3.4 + 1.3.5 diff --git a/spring-modulith-test/pom.xml b/spring-modulith-test/pom.xml index 243823cf..e08789fd 100644 --- a/spring-modulith-test/pom.xml +++ b/spring-modulith-test/pom.xml @@ -4,7 +4,7 @@ org.springframework.modulith spring-modulith - 1.3.4 + 1.3.5 ../pom.xml diff --git a/src/docs/antora/modules/ROOT/pages/fundamentals.adoc b/src/docs/antora/modules/ROOT/pages/fundamentals.adoc index 90412bde..bd2c875c 100644 --- a/src/docs/antora/modules/ROOT/pages/fundamentals.adoc +++ b/src/docs/antora/modules/ROOT/pages/fundamentals.adoc @@ -131,12 +131,12 @@ Let us have a look at an example arrangement (icon:plus-circle[role=green] denot [source, subs="+specialchars, macros"] ---- icon:cubes[] Example -└─ icon:folder[] src/main/java +╰─ icon:folder[] src/main/java ├─ icon:cube[] example <1> - | └─ icon:plus-circle[role=green] Application.java - └─ icon:cube[] example.inventory <2> + │ ╰─ icon:plus-circle[role=green] Application.java + ╰─ icon:cube[] example.inventory <2> ├─ icon:plus-circle[role=green] InventoryManagement.java - └─ icon:minus-circle[role=red] SomethingInventoryInternal.java + ╰─ icon:minus-circle[role=red] SomethingInventoryInternal.java ---- <1> The application's main package `example`. <2> An application module package `inventory`. @@ -150,16 +150,16 @@ If an application module package contains sub-packages, types in those might nee [source, subs="macros, quotes"] ---- icon:cubes[] Example -└─ icon:folder[] src/main/java +╰─ icon:folder[] src/main/java ├─ icon:cube[] example - | └─ icon:plus-circle[role=green] Application.java + │ ╰─ icon:plus-circle[role=green] Application.java ├─ icon:cube[] example.inventory - | ├─ icon:plus-circle[role=green] InventoryManagement.java - | └─ icon:minus-circle[role=red] SomethingInventoryInternal.java + │ ├─ icon:plus-circle[role=green] InventoryManagement.java + │ ╰─ icon:minus-circle[role=red] SomethingInventoryInternal.java ├─ **icon:cube[] example.order** - | └─ icon:plus-circle[role=green] OrderManagement.java - └─ icon:cube[] example.order.internal - └─ icon:plus-circle[role=green] SomethingOrderInternal.java + │ ╰─ icon:plus-circle[role=green] OrderManagement.java + ╰─ icon:cube[] example.order.internal + ╰─ icon:plus-circle[role=green] SomethingOrderInternal.java ---- In such an arrangement, the `order` package is considered an API package. @@ -180,32 +180,32 @@ To define nested application modules, explicitly annotate packages that are supp [source, subs="macros, quotes"] ---- icon:cubes[] Example -└─ icon:folder[] src/main/java - | +╰─ icon:folder[] src/main/java + │ ├─ icon:cube[] example - | └─ icon:plus-circle[role=green] Application.java - | - | -> Inventory - | + │ ╰─ icon:plus-circle[role=green] Application.java + │ + │ -> Inventory + │ ├─ icon:cube[] example.inventory - | ├─ icon:plus-circle[role=green] InventoryManagement.java - | └─ icon:minus-circle[role=red] SomethingInventoryInternal.java + │ ├─ icon:plus-circle[role=green] InventoryManagement.java + │ ╰─ icon:minus-circle[role=red] SomethingInventoryInternal.java ├─ icon:cube[] example.inventory.internal - | └─ icon:minus-circle[role=red] SomethingInventoryInternal.java - | - | -> Inventory > Nested - | + │ ╰─ icon:minus-circle[role=red] SomethingInventoryInternal.java + │ + │ -> Inventory > Nested + │ ├─ icon:cube[] example.inventory.nested - | ├─ icon:coffee[] package-info.java // @ApplicationModule - | └─ icon:plus-circle[role=orange] NestedApi.java + │ ├─ icon:coffee[] package-info.java // @ApplicationModule + │ ╰─ icon:plus-circle[role=orange] NestedApi.java ├─ icon:cube[] example.inventory.nested.internal - | └─ icon:minus-circle[role=red] NestedInternal.java - | - | -> Order - | - └─ icon:cube[] example.order + │ ╰─ icon:minus-circle[role=red] NestedInternal.java + │ + │ -> Order + │ + ╰─ icon:cube[] example.order ├─ icon:plus-circle[role=green] OrderManagement.java - └─ icon:minus-circle[role=red] SomethingOrderInternal.java + ╰─ icon:minus-circle[role=red] SomethingOrderInternal.java ---- In this example `inventory` is an application module as described xref:fundamentals.adoc#modules.simple[above]. @@ -242,10 +242,16 @@ Kotlin:: + [source, kotlin, role="secondary", chomp="none"] ---- -@org.springframework.modulith.ApplicationModule( +package example.inventory + +import org.springframework.modulith.ApplicationModule +import org.springframework.modulith.PackageInfo + +@ApplicationModule( type = Type.OPEN ) -package example.inventory +@PackageInfo +class ModuleMetadata {} ---- ====== @@ -301,17 +307,17 @@ You achieve that by annotating the `package-info.java` file of those packages wi [source, text, subs="macros, quotes"] ---- icon:cubes[] Example -└─ icon:folder[] src/main/java +╰─ icon:folder[] src/main/java ├─ icon:cube[] example - | └─ icon:plus-circle[role=green] Application.java + │ ╰─ icon:plus-circle[role=green] Application.java ├─ … ├─ icon:cube[] example.order - | └─ icon:plus-circle[role=green] OrderManagement.java + │ ╰─ icon:plus-circle[role=green] OrderManagement.java ├─ **icon:cube[] example.order.spi** - | ├— icon:coffee[] package-info.java - | └─ icon:plus-circle[role=green] SomeSpiInterface.java - └─ icon:cube[] example.order.internal - └─ icon:minus-circle[role=red] SomethingOrderInternal.java + │ ├— icon:coffee[] package-info.java + │ ╰─ icon:plus-circle[role=green] SomeSpiInterface.java + ╰─ icon:cube[] example.order.internal + ╰─ icon:minus-circle[role=red] SomethingOrderInternal.java ---- .`package-info.java` in `example.order.spi` @@ -358,10 +364,16 @@ Kotlin:: + [source, kotlin, role="secondary", chomp="none"] ---- -@org.springframework.modulith.ApplicationModule( +package example.inventory + +import org.springframework.modulith.ApplicationModule +import org.springframework.modulith.PackageInfo + +@ApplicationModule( allowedDependencies = "order :: spi" ) -package example.inventory +@PackageInfo +class ModuleMetadata {} ---- ====== @@ -387,10 +399,16 @@ Kotlin:: + [source, kotlin, role="secondary", chomp="none"] ---- -@org.springframework.modulith.ApplicationModule( +package example.inventory + +import org.springframework.modulith.ApplicationModule +import org.springframework.modulith.PackageInfo + +@ApplicationModule( allowedDependencies = "order :: *" ) -package example.inventory +@PackageInfo +class ModuleMetadata {} ---- ======