diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java index f116b96aa115efa246f204953d3989f4dab402c4..0bd3bd6174d9ea7f450a4c2b933cfdc16f60af6e 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java @@ -23,11 +23,7 @@ */ package de.ozgcloud.aggregation; -import de.ozgcloud.aggregation.transformation.AggregationMapping; - public interface AggregationDataLoader { void loadIntoTarget(Aggregation aggregation); - - boolean supportsScope(AggregationMapping.Scope scope); } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java index 363333bf882b8b3bd9075a9aa97b564a3818fa1c..4d7e2ff3ad1732f0466745d7d0e0c571335a9159 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java @@ -23,12 +23,8 @@ */ package de.ozgcloud.aggregation; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.function.Predicate; - -import javax.annotation.PostConstruct; +import java.util.Optional; import org.springframework.stereotype.Component; @@ -40,24 +36,13 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class AggregationDataLoaderRegistry { - private final List<AggregationDataLoader> loaders; - private final Map<AggregationMapping.Scope, AggregationDataLoader> scopeToLoader = new HashMap<>(); - - @PostConstruct - void buildLoadersMap() { - - } + private final Map<String, AggregationDataLoader> loaders; public boolean hasLoader(AggregationMapping.Scope scope) { - return loaders.stream().anyMatch(supportsScope(scope)); + return loaders.containsKey(scope.name()); } public AggregationDataLoader getLoader(AggregationMapping.Scope scope) { - return loaders.stream().filter(supportsScope(scope)).findFirst() - .orElseThrow(() -> new TechnicalException("No loader found for scope " + scope)); - } - - private Predicate<AggregationDataLoader> supportsScope(AggregationMapping.Scope scope) { - return loader -> loader.supportsScope(scope); + return Optional.ofNullable(loaders.get(scope.name())).orElseThrow(() -> new TechnicalException("No data loader for scope " + scope)); } } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java index 569497590106706c3f317447b85c723b497f7b1d..51ead0e4fb25e567f36884adfe1d26f63af6c344 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java @@ -24,19 +24,21 @@ package de.ozgcloud.aggregation; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.aggregation.warehouse.DocumentEntry; import de.ozgcloud.aggregation.warehouse.WarehouseRepository; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Component +@Qualifier(AggregationWarehouseDataLoader.SCOPE) @RequiredArgsConstructor @Log4j2 public class AggregationWarehouseDataLoader implements AggregationDataLoader { + static final String SCOPE = "INTERN"; private final WarehouseRepository repository; @Override @@ -49,9 +51,4 @@ public class AggregationWarehouseDataLoader implements AggregationDataLoader { String getCollectionName(Aggregation aggregation) { return StringUtils.isNotBlank(aggregation.aggregationName()) ? aggregation.aggregationName() : DocumentEntry.COLLECTION; } - - @Override - public boolean supportsScope(AggregationMapping.Scope scope) { - return AggregationMapping.Scope.INTERN.equals(scope); - } } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java index 29ed0db32a2350c56855ff308c163b3a80e35d5a..12a9e4d3768c6fa65f3b7a85730939754cc195cc 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java @@ -25,22 +25,24 @@ package de.ozgcloud.aggregation.extern; import java.util.concurrent.ExecutionException; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import de.ozgcloud.aggregation.Aggregation; import de.ozgcloud.aggregation.AggregationDataLoader; -import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Component +@Qualifier(AggregationRemoteDataLoader.SCOPE) @ConditionalOnProperty("grpc.client.aggregation-manager.address") @RequiredArgsConstructor @Log4j2 public class AggregationRemoteDataLoader implements AggregationDataLoader { + static final String SCOPE = "EXTERN"; private final AggregationDataRemoteService service; @Override @@ -54,8 +56,4 @@ public class AggregationRemoteDataLoader implements AggregationDataLoader { throw new TechnicalException("Error on sending aggregation data.", e); } } - - public boolean supportsScope(AggregationMapping.Scope scope) { - return AggregationMapping.Scope.EXTERN.equals(scope); - } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java index cd7127ddd5373694f3396be73a9985e10731f063..02d5b4b8148153d830a25beb552548e9ccfa5082 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java @@ -26,7 +26,6 @@ package de.ozgcloud.aggregation; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -36,58 +35,36 @@ import org.mockito.Mock; import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.common.test.ReflectionTestUtils; class AggregationDataLoaderRegistryTest { + private static final String SCOPE_KEY = AggregationWarehouseDataLoader.SCOPE; + private final AggregationMapping.Scope registeredScope = AggregationMapping.Scope.INTERN; + private final AggregationMapping.Scope notRegisteredScope = AggregationMapping.Scope.EXTERN; + + @Mock private AggregationDataLoader loader; private AggregationDataLoaderRegistry registry; @BeforeEach void init() { - registry = spy(new AggregationDataLoaderRegistry(List.of(loader))); - } - - @Nested - class TestBuildLoadersMap { - - @Test - void shouldAddLoader() { - } - - @SuppressWarnings("unchecked") - private Map<AggregationMapping.Scope, AggregationDataLoader> getScopeToLoader() { - return ReflectionTestUtils.getField(registry, "scopeToLoader", Map.class); - } + registry = spy(new AggregationDataLoaderRegistry(Map.of(SCOPE_KEY, loader))); } @Nested class TestHasLoader { - @Test - void shouldCheckIfLoaderSupportsScope() { - var scope = AggregationMapping.Scope.INTERN; - - registry.hasLoader(scope); - - verify(loader).supportsScope(scope); - } - @Test void shouldReturnFalseIfNoLoaderRegisteredForScope() { - when(loader.supportsScope(any())).thenReturn(false); - - var hasLoader = registry.hasLoader(AggregationMapping.Scope.INTERN); + var hasLoader = registry.hasLoader(notRegisteredScope); assertThat(hasLoader).isFalse(); } @Test void shouldReturnTrueIfLoaderRegisteredForScope() { - when(loader.supportsScope(any())).thenReturn(true); - - var hasLoader = registry.hasLoader(AggregationMapping.Scope.INTERN); + var hasLoader = registry.hasLoader(registeredScope); assertThat(hasLoader).isTrue(); } @@ -96,31 +73,16 @@ class AggregationDataLoaderRegistryTest { @Nested class TestGetLoader { - private final AggregationMapping.Scope scope = AggregationMapping.Scope.INTERN; - - @Test - void shouldCheckIfLoaderSupportsScope() { - when(loader.supportsScope(any())).thenReturn(true); - - registry.getLoader(scope); - - verify(loader).supportsScope(scope); - } - @Test void shouldReturnLoaderThatSupportsScope() { - when(loader.supportsScope(any())).thenReturn(true); - - var loaderSupportingScope = registry.getLoader(scope); + var loaderSupportingScope = registry.getLoader(registeredScope); assertThat(loaderSupportingScope).isSameAs(loader); } @Test void shouldThrowExceptionIfNoLoaderRegisteredForScope() { - when(loader.supportsScope(any())).thenReturn(false); - - assertThatThrownBy(() -> registry.getLoader(scope)).isInstanceOf(TechnicalException.class); + assertThatThrownBy(() -> registry.getLoader(notRegisteredScope)).isInstanceOf(TechnicalException.class); } } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java index 27ce28c5be43d187bff45a2416c9e668141d0bee..9cd225c7ed6cc017c204016dca415b6c52295093 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java @@ -32,13 +32,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Qualifier; import com.thedeanda.lorem.LoremIpsum; @@ -111,21 +111,13 @@ class AggregationWarehouseDataLoaderTest { } @Nested - class TestSupportsScope { - - @ParameterizedTest - @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "INTERN") - void shouldReturnFalse(AggregationMapping.Scope scope) { - var supported = loader.supportsScope(scope); - - assertThat(supported).isFalse(); - } + class TestQualifier { @Test - void shouldReturnTrue() { - var supported = loader.supportsScope(AggregationMapping.Scope.INTERN); + void shouldBeIntern() { + var qualifierValue = AggregationWarehouseDataLoader.class.getAnnotation(Qualifier.class).value(); - assertThat(supported).isTrue(); + assertThat(qualifierValue).isEqualTo(AggregationMapping.Scope.INTERN.name()); } } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java index e76d39f9490f47e1f9c6441df3b28060584ad44e..49e0b0703265f2a01c344c53e0e590ca0a1822ff 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java @@ -34,11 +34,10 @@ import java.util.concurrent.Future; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Qualifier; import de.ozgcloud.aggregation.Aggregation; import de.ozgcloud.aggregation.AggregationTestFactory; @@ -129,21 +128,13 @@ class AggregationRemoteDataLoaderTest { } @Nested - class TestSupportsScope { - - @ParameterizedTest - @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "EXTERN") - void shouldReturnFalse(AggregationMapping.Scope scope) { - var supported = loader.supportsScope(scope); - - assertThat(supported).isFalse(); - } + class TestQualifier { @Test - void shouldReturnTrue() { - var supported = loader.supportsScope(AggregationMapping.Scope.EXTERN); + void shouldBeExtern() { + var qualifierValue = AggregationRemoteDataLoader.class.getAnnotation(Qualifier.class).value(); - assertThat(supported).isTrue(); + assertThat(qualifierValue).isEqualTo(AggregationMapping.Scope.EXTERN.name()); } } }