From c4fe2716891a7d128a5d4366659ef5cbf12c7ef0 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 3 Feb 2023 10:52:14 +0100 Subject: [PATCH] GH-130 - Fall back to annotated class' name as system name. --- .../core/AnnotationModulithMetadata.java | 3 +- .../modulith/core/ModulithMetadata.java | 4 +- ...a.java => SpringBootModulithMetadata.java} | 21 +++++---- .../AnnotationModulithMetadataUnitTest.java | 12 +++-- .../core/ModulithMetadataUnitTest.java | 3 +- .../SpringBootModulithMetadataUnitTest.java | 47 +++++++++++++++++++ 6 files changed, 73 insertions(+), 17 deletions(-) rename spring-modulith-core/src/main/java/org/springframework/modulith/core/{DefaultModulithMetadata.java => SpringBootModulithMetadata.java} (83%) create mode 100644 spring-modulith-core/src/test/java/org/springframework/modulith/core/SpringBootModulithMetadataUnitTest.java diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java index 1760b055..ef738dbe 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java @@ -120,6 +120,7 @@ class AnnotationModulithMetadata implements ModulithMetadata { public Optional getSystemName() { return Optional.of(annotation.systemName()) // - .filter(StringUtils::hasText); + .filter(StringUtils::hasText) // + .or(() -> Optional.of(modulithType.getSimpleName())); } } diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java index 00043b30..d852d434 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java @@ -45,7 +45,7 @@ public interface ModulithMetadata { String.format(ANNOTATION_MISSING, annotated.getSimpleName(), Modulith.class.getSimpleName(), Modulithic.class.getSimpleName(), SpringTypes.AT_SPRING_BOOT_APPLICATION)); - Supplier withDefaults = () -> DefaultModulithMetadata.of(annotated).orElseThrow(exception); + Supplier withDefaults = () -> SpringBootModulithMetadata.of(annotated).orElseThrow(exception); return AnnotationModulithMetadata.of(annotated).orElseGet(withDefaults); } @@ -57,7 +57,7 @@ public interface ModulithMetadata { * @return will never be {@literal null}. */ public static ModulithMetadata of(String javaPackage) { - return DefaultModulithMetadata.of(javaPackage); + return SpringBootModulithMetadata.of(javaPackage); } /** diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/DefaultModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/SpringBootModulithMetadata.java similarity index 83% rename from spring-modulith-core/src/main/java/org/springframework/modulith/core/DefaultModulithMetadata.java rename to spring-modulith-core/src/main/java/org/springframework/modulith/core/SpringBootModulithMetadata.java index 6bcaf96b..63a75c60 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/DefaultModulithMetadata.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/SpringBootModulithMetadata.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.lang.NonNull; import org.springframework.modulith.Modulith; @@ -34,31 +35,33 @@ import org.springframework.util.Assert; * * @author Oliver Drotbohm */ -class DefaultModulithMetadata implements ModulithMetadata { +class SpringBootModulithMetadata implements ModulithMetadata { private static final Class AT_SPRING_BOOT_APPLICATION = Types .loadIfPresent(SpringTypes.AT_SPRING_BOOT_APPLICATION); private final @NonNull Object source; + private final String systemName; /** - * Creates a new {@link DefaultModulithMetadata} for the given source. + * Creates a new {@link SpringBootModulithMetadata} for the given source. * * @param source must not be {@literal null}. */ - private DefaultModulithMetadata(Object source) { + private SpringBootModulithMetadata(Object source, String systemName) { Assert.notNull(source, "Source must not be null!"); this.source = source; + this.systemName = systemName; } /** - * Creates a new {@link ModulithMetadata} representing the defaults of a class annotated but not customized with - * {@link Modulithic} or {@link Modulith}. + * Creates a new {@link ModulithMetadata} representing the defaults of a class annotated with + * {@link SpringBootApplication} but not customized with {@link Modulithic} or {@link Modulith}. * * @param annotated must not be {@literal null}. - * @return + * @return will never be {@literal null}. */ public static Optional of(Class annotated) { @@ -66,7 +69,7 @@ class DefaultModulithMetadata implements ModulithMetadata { return Optional.ofNullable(AT_SPRING_BOOT_APPLICATION) // .filter(it -> AnnotatedElementUtils.hasAnnotation(annotated, it)) // - .map(__ -> new DefaultModulithMetadata(annotated)); + .map(__ -> new SpringBootModulithMetadata(annotated, annotated.getSimpleName())); } /** @@ -79,7 +82,7 @@ class DefaultModulithMetadata implements ModulithMetadata { Assert.hasText(javaPackage, "Package name must not be null or empty!"); - return new DefaultModulithMetadata(javaPackage); + return new SpringBootModulithMetadata(javaPackage, null); } /* @@ -133,6 +136,6 @@ class DefaultModulithMetadata implements ModulithMetadata { */ @Override public Optional getSystemName() { - return Optional.empty(); + return Optional.ofNullable(systemName); } } diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/AnnotationModulithMetadataUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/AnnotationModulithMetadataUnitTest.java index 2b9547a1..ca212667 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/AnnotationModulithMetadataUnitTest.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/AnnotationModulithMetadataUnitTest.java @@ -22,7 +22,6 @@ import java.lang.annotation.RetentionPolicy; import org.junit.jupiter.api.Test; import org.springframework.modulith.Modulithic; -import org.springframework.modulith.core.AnnotationModulithMetadata; /** * Unit tests for {@link AnnotationModulithMetadata}. @@ -47,6 +46,14 @@ class AnnotationModulithMetadataUnitTest { }); } + @Test // #130 + void usesSimpleClassNameAsDefaultSystemName() { + + assertThat(AnnotationModulithMetadata.of(Sample.class)).hasValueSatisfying(it -> { + assertThat(it.getSystemName()).hasValue(Sample.class.getSimpleName()); + }); + } + @Modulithic(useFullyQualifiedModuleNames = true) static class Sample {} @@ -55,6 +62,5 @@ class AnnotationModulithMetadataUnitTest { @Retention(RetentionPolicy.RUNTIME) @Modulithic(useFullyQualifiedModuleNames = true) - @interface Intermediate { - } + @interface Intermediate {} } diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java index 175cd33e..b247e51b 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java @@ -23,7 +23,6 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.modulith.Modulith; import org.springframework.modulith.Modulithic; -import org.springframework.modulith.core.ModulithMetadata; /** * Unit tests for {@link ModulithMetadata}. @@ -53,7 +52,7 @@ class ModulithMetadataUnitTest { assertThat(metadata.getAdditionalPackages()).isEmpty(); assertThat(metadata.getSharedModuleNames()).isEmpty(); - assertThat(metadata.getSystemName()).isEmpty(); + assertThat(metadata.getSystemName()).hasValue(SpringBootApplicationAnnotated.class.getSimpleName()); assertThat(metadata.useFullyQualifiedModuleNames()).isFalse(); } diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/SpringBootModulithMetadataUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/SpringBootModulithMetadataUnitTest.java new file mode 100644 index 00000000..aa2ccfe8 --- /dev/null +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/SpringBootModulithMetadataUnitTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 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.core; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Unit tests for {@link SpringBootModulithMetadata}. + * + * @author Oliver Drotbohm + */ +class SpringBootModulithMetadataUnitTest { + + @Test // #130 + void usesClassNameAsSystemNameDefault() { + + var metadata = SpringBootModulithMetadata.of(SpringBootApp.class); + + assertThat(metadata).hasValueSatisfying(it -> { + assertThat(it.getSystemName()).hasValue(SpringBootApp.class.getSimpleName()); + }); + } + + @Test // #130 + void doesNotExposeASystemNameForPackageBasedMetadata() { + assertThat(SpringBootModulithMetadata.of("com.acme").getSystemName()).isEmpty(); + } + + @SpringBootApplication + private static class SpringBootApp {} +}