From a98fb25aca0f0fbbe72b12b58869541cd9b9d96d Mon Sep 17 00:00:00 2001
From: Henry Borasch <Henry.Borasch@sinc.de>
Date: Wed, 8 Mar 2023 11:39:16 +0100
Subject: [PATCH] * added config attribute for providing schema folder path *
 load schema from specified path on initiation * fixed and adjusted tests

---
 .../api/config/ApplicationConfig.java         |  2 ++
 .../fitconnect/api/config/SchemaConfig.java   |  9 +-------
 .../api/domain/schema/SchemaResources.java    |  2 +-
 .../client/factory/ClientFactory.java         | 12 +++++-----
 .../core/schema/SchemaResourceProvider.java   | 22 ++++++++++++++-----
 .../events/SecurityEventTokenServiceTest.java |  6 ++---
 .../schema/SchemaResourceProviderTest.java    | 13 +++++------
 .../DefaultValidationServiceTest.java         | 10 ++++-----
 .../s00000096_1.0.schema.json                 |  0
 .../submission_data_schema_local.json         |  0
 .../submission_data_schema_remote.json        |  0
 11 files changed, 39 insertions(+), 37 deletions(-)
 rename core/src/{main/resources/submission-data-schema => test/resources/submission-data-test-schema}/s00000096_1.0.schema.json (100%)
 rename core/src/test/resources/{ => submission-data-test-schema}/submission_data_schema_local.json (100%)
 rename core/src/test/resources/{ => submission-data-test-schema}/submission_data_schema_remote.json (100%)

diff --git a/api/src/main/java/dev/fitko/fitconnect/api/config/ApplicationConfig.java b/api/src/main/java/dev/fitko/fitconnect/api/config/ApplicationConfig.java
index 5c57e4aa7..762597640 100644
--- a/api/src/main/java/dev/fitko/fitconnect/api/config/ApplicationConfig.java
+++ b/api/src/main/java/dev/fitko/fitconnect/api/config/ApplicationConfig.java
@@ -42,6 +42,8 @@ public class ApplicationConfig {
 
     private EnvironmentName activeEnvironment;
 
+    private String submissionDataSchemaPath;
+
     private Environment getEnvironmentByName(final EnvironmentName environmentName) {
         if (environments.containsKey(environmentName)) {
             return environments.get(environmentName);
diff --git a/api/src/main/java/dev/fitko/fitconnect/api/config/SchemaConfig.java b/api/src/main/java/dev/fitko/fitconnect/api/config/SchemaConfig.java
index 3250d7024..b1d3c0d49 100644
--- a/api/src/main/java/dev/fitko/fitconnect/api/config/SchemaConfig.java
+++ b/api/src/main/java/dev/fitko/fitconnect/api/config/SchemaConfig.java
@@ -15,8 +15,7 @@ public enum SchemaConfig {
     SET_V_1_0_1(SCHEMA_BASE_URL.schemaUri.resolve("set-payload/1.0.1/set-payload.schema.json"), "set_schema_1.0.1.json"),
     SET_V_1_0_0(SCHEMA_BASE_URL.schemaUri.resolve("set-payload/1.0.0/set-payload.schema.json"), "set_schema_1.0.0.json"),
     METADATA_V_1_0_0(SCHEMA_BASE_URL.schemaUri.resolve("metadata/1.0.0/metadata.schema.json"), "metadata_schema_1.0.0.json"),
-    XZUFI_DESTINATION_SCHEMA(SCHEMA_BASE_URL.schemaUri.resolve("xzufi/destination.schema.json"), "destination_schema.json"),
-    SUBMISSION_DATA_SCHEMA(URI.create("https://schema.fitko.de/fim/s00000096_1.0.schema.json"), "s00000096_1.0.schema.json");
+    XZUFI_DESTINATION_SCHEMA(SCHEMA_BASE_URL.schemaUri.resolve("xzufi/destination.schema.json"), "destination_schema.json");
 
     private final URI schemaUri;
 
@@ -50,12 +49,6 @@ public enum SchemaConfig {
                 .collect(Collectors.toList());
     }
 
-    public static List<String> getSubmissionDataSchemaPaths(final String submissionDataSchemaBaseDir) {
-        return Stream.of(SUBMISSION_DATA_SCHEMA.fileName)
-                .map(fileName -> submissionDataSchemaBaseDir + "/" + fileName)
-                .collect(Collectors.toList());
-    }
-
     @Override
     public String toString() {
         return schemaUri.toString();
diff --git a/api/src/main/java/dev/fitko/fitconnect/api/domain/schema/SchemaResources.java b/api/src/main/java/dev/fitko/fitconnect/api/domain/schema/SchemaResources.java
index f64692e17..4c53496cf 100644
--- a/api/src/main/java/dev/fitko/fitconnect/api/domain/schema/SchemaResources.java
+++ b/api/src/main/java/dev/fitko/fitconnect/api/domain/schema/SchemaResources.java
@@ -10,5 +10,5 @@ public class SchemaResources {
     List<String> setSchemaPaths;
     List<String> metadataSchemaPaths;
     List<String> destinationSchemaPaths;
-    List<String> submissionDataSchemaPaths;
+    String submissionDataSchemaPath;
 }
diff --git a/client/src/main/java/dev/fitko/fitconnect/client/factory/ClientFactory.java b/client/src/main/java/dev/fitko/fitconnect/client/factory/ClientFactory.java
index 24eff7a4a..975fb202a 100644
--- a/client/src/main/java/dev/fitko/fitconnect/client/factory/ClientFactory.java
+++ b/client/src/main/java/dev/fitko/fitconnect/client/factory/ClientFactory.java
@@ -61,7 +61,6 @@ public final class ClientFactory {
     private static final String SET_SCHEMA_DIR = "/set-schema";
     private static final String DESTINATION_SCHEMA_DIR = "/destination-schema";
     private static final String METADATA_SCHEMA_DIR = "/metadata-schema";
-    private static final String SUBMISSION_DATA_SCHEMA_DIR = "/submission-data-schema";
 
     private ClientFactory() {
     }
@@ -129,7 +128,7 @@ public final class ClientFactory {
     public static RoutingClient routingClient(final ApplicationConfig config) {
         LOGGER.info("Initializing routing client ...");
         final RestTemplate restTemplate = getRestTemplate(config, ApplicationConfigLoader.loadBuildInfo());
-        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate);
+        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate, config.getSubmissionDataSchemaPath());
         final OAuthService authService = getSenderConfiguredAuthService(config, restTemplate);
 
         final MessageDigestService messageDigestService = getMessageDigestService();
@@ -145,7 +144,7 @@ public final class ClientFactory {
 
     private static Sender getSender(final ApplicationConfig config, final BuildInfo buildInfo) {
         final RestTemplate restTemplate = getRestTemplate(config, buildInfo);
-        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate);
+        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate, config.getSubmissionDataSchemaPath());
         final MessageDigestService messageDigestService = getMessageDigestService();
 
         final CryptoService cryptoService = getCryptoService(messageDigestService);
@@ -162,7 +161,7 @@ public final class ClientFactory {
 
     private static Subscriber getSubscriber(final ApplicationConfig config, final BuildInfo buildInfo) {
         final RestTemplate restTemplate = getRestTemplate(config, buildInfo);
-        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate);
+        final SchemaProvider schemaProvider = getSchemaProvider(restTemplate, config.getSubmissionDataSchemaPath());
         final MessageDigestService messageDigestService = getMessageDigestService();
 
         final CryptoService cryptoService = getCryptoService(messageDigestService);
@@ -231,12 +230,11 @@ public final class ClientFactory {
         return new EventLogVerifier(keyService, validationService);
     }
 
-    private static SchemaProvider getSchemaProvider(RestTemplate restTemplate) {
+    private static SchemaProvider getSchemaProvider(RestTemplate restTemplate, String submissionDataSchemaPath) {
         final List<String> setSchemaFiles = SchemaConfig.getSetSchemaFilePaths(SET_SCHEMA_DIR);
         final List<String> metadataSchemaFiles = SchemaConfig.getMetadataSchemaFileNames(METADATA_SCHEMA_DIR);
         final List<String> destinationSchemaFiles = SchemaConfig.getDestinationSchemaPaths(DESTINATION_SCHEMA_DIR);
-        final List<String> submissionDataSchemaFiles = SchemaConfig.getSubmissionDataSchemaPaths(SUBMISSION_DATA_SCHEMA_DIR);
-        final SchemaResources schemaResources = new SchemaResources(setSchemaFiles, metadataSchemaFiles, destinationSchemaFiles, submissionDataSchemaFiles);
+        final SchemaResources schemaResources = new SchemaResources(setSchemaFiles, metadataSchemaFiles, destinationSchemaFiles, submissionDataSchemaPath);
         return new SchemaResourceProvider(restTemplate, schemaResources);
     }
 
diff --git a/core/src/main/java/dev/fitko/fitconnect/core/schema/SchemaResourceProvider.java b/core/src/main/java/dev/fitko/fitconnect/core/schema/SchemaResourceProvider.java
index cb81e6849..d753850ab 100644
--- a/core/src/main/java/dev/fitko/fitconnect/core/schema/SchemaResourceProvider.java
+++ b/core/src/main/java/dev/fitko/fitconnect/core/schema/SchemaResourceProvider.java
@@ -12,12 +12,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.web.client.RestTemplate;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URI;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -48,7 +47,7 @@ public class SchemaResourceProvider implements SchemaProvider {
         populateSetSchemas(schemaResources.getSetSchemaPaths());
         populateMetadataSchemas(schemaResources.getMetadataSchemaPaths());
         populateDestinationSchemas(schemaResources.getDestinationSchemaPaths());
-        populateSubmissionDataSchemas(schemaResources.getSubmissionDataSchemaPaths());
+        populateSubmissionDataSchemas(schemaResources.getSubmissionDataSchemaPath());
     }
 
     private void populateMetadataSchemas(final List<String> metadataSchemaPaths) {
@@ -66,9 +65,11 @@ public class SchemaResourceProvider implements SchemaProvider {
         getResourceFiles(destinationSchemaPaths).forEach(this::addDestinationSchema);
     }
 
-    private void populateSubmissionDataSchemas(final List<String> submissionDataSchemaPaths) {
+    private void populateSubmissionDataSchemas(final String submissionDataSchemaPath) {
         LOGGER.info("Initializing submission data schemas");
-        getResourceFiles(submissionDataSchemaPaths).forEach(this::addSubmissionDataSchema);
+        if (submissionDataSchemaPath != null && !submissionDataSchemaPath.isEmpty()) {
+            getResourceFiles(submissionDataSchemaPath).forEach(this::addSubmissionDataSchema);
+        }
     }
 
     @Override
@@ -156,6 +157,15 @@ public class SchemaResourceProvider implements SchemaProvider {
         return schemaFiles.stream().map(SchemaResourceProvider::readResourceToString).collect(Collectors.toList());
     }
 
+    private List<String> getResourceFiles(final String schemaPath) {
+
+        File schemaFolder = new File(Objects.requireNonNull(SchemaResourceProvider.class.getClassLoader().getResource(schemaPath)).getFile());
+
+        return Arrays.stream(Objects.requireNonNull(schemaFolder.listFiles()))
+                .map(file -> "/" + schemaPath + "/" + file.getName())
+                .map(SchemaResourceProvider::readResourceToString).collect(Collectors.toList());
+    }
+
     private static String readResourceToString(final String schemaFile) {
         try (final InputStream is = SchemaResourceProvider.class.getResourceAsStream(schemaFile);
              final BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
diff --git a/core/src/test/java/dev/fitko/fitconnect/core/events/SecurityEventTokenServiceTest.java b/core/src/test/java/dev/fitko/fitconnect/core/events/SecurityEventTokenServiceTest.java
index c894ac53a..dc93dc13a 100644
--- a/core/src/test/java/dev/fitko/fitconnect/core/events/SecurityEventTokenServiceTest.java
+++ b/core/src/test/java/dev/fitko/fitconnect/core/events/SecurityEventTokenServiceTest.java
@@ -11,8 +11,8 @@ import dev.fitko.fitconnect.api.config.ApplicationConfig;
 import dev.fitko.fitconnect.api.config.Environment;
 import dev.fitko.fitconnect.api.config.EnvironmentName;
 import dev.fitko.fitconnect.api.config.SchemaConfig;
-import dev.fitko.fitconnect.api.domain.model.event.EventPayload;
 import dev.fitko.fitconnect.api.domain.model.event.Event;
+import dev.fitko.fitconnect.api.domain.model.event.EventPayload;
 import dev.fitko.fitconnect.api.domain.model.event.problems.submission.AttachmentsMismatch;
 import dev.fitko.fitconnect.api.domain.model.submission.Submission;
 import dev.fitko.fitconnect.api.domain.schema.SchemaResources;
@@ -63,8 +63,8 @@ class SecurityEventTokenServiceTest {
         final List<String> setSchemas = SchemaConfig.getSetSchemaFilePaths("/set-schema");
         final List<String> metadataSchemas = SchemaConfig.getMetadataSchemaFileNames("/metadata-schema");
         final List<String> destinationSchemas = SchemaConfig.getDestinationSchemaPaths("/destination-schema");
-        final List<String> submissionDataSchemas = SchemaConfig.getSubmissionDataSchemaPaths("/submission-data-schema");
-        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataSchemas);
+        final String submissionDataSchemaPath = "submission-data-test-schema";
+        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataSchemaPath);
         final SchemaProvider schemaProvider = new SchemaResourceProvider(mock(RestTemplate.class), schemaResources);
 
         validationService = new DefaultValidationService(config, new HashService(), schemaProvider);
diff --git a/core/src/test/java/dev/fitko/fitconnect/core/schema/SchemaResourceProviderTest.java b/core/src/test/java/dev/fitko/fitconnect/core/schema/SchemaResourceProviderTest.java
index 10b954b6a..2a58d12bd 100644
--- a/core/src/test/java/dev/fitko/fitconnect/core/schema/SchemaResourceProviderTest.java
+++ b/core/src/test/java/dev/fitko/fitconnect/core/schema/SchemaResourceProviderTest.java
@@ -32,8 +32,8 @@ class SchemaResourceProviderTest {
         final List<String> setSchemas = SchemaConfig.getSetSchemaFilePaths("/set-schema");
         final List<String> metadataSchemas = SchemaConfig.getMetadataSchemaFileNames("/metadata-schema");
         final List<String> destinationSchemas = SchemaConfig.getDestinationSchemaPaths("/destination-schema");
-        final List<String> submissionDataSchemas = SchemaConfig.getSubmissionDataSchemaPaths("/submission-data-schema");
-        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataSchemas);
+        final String submissionDataPath = "submission-data-test-schema";
+        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataPath);
         underTest = new SchemaResourceProvider(mock(RestTemplate.class), schemaResources);
     }
 
@@ -108,7 +108,7 @@ class SchemaResourceProviderTest {
         when(restTemplate.getForEntity(eq(URI.create("https://test.json")), any())).thenReturn(ResponseEntity.ok("schema"));
 
         SchemaResourceProvider schemaResourceProvider = new SchemaResourceProvider(restTemplate,
-                new SchemaResources(List.of(), List.of(), List.of(), List.of()));
+                new SchemaResources(List.of(), List.of(), List.of(), null));
 
         String schema = schemaResourceProvider.loadSubmissionDataSchema(URI.create("https://test.json"));
 
@@ -122,7 +122,7 @@ class SchemaResourceProviderTest {
         when(restTemplate.getForEntity(eq(URI.create("https://test.json")), any())).thenThrow(new RuntimeException("Something went wrong!"));
 
         SchemaResourceProvider schemaResourceProvider = new SchemaResourceProvider(restTemplate,
-                new SchemaResources(List.of(), List.of(), List.of(), List.of()));
+                new SchemaResources(List.of(), List.of(), List.of(), null));
 
         Exception exception = assertThrows(SchemaNotFoundException.class,
                 () -> schemaResourceProvider.loadSubmissionDataSchema(URI.create("https://test.json")));
@@ -133,8 +133,7 @@ class SchemaResourceProviderTest {
     @Test
     void loadSubmissionDataSchemaFromMemory() {
 
-        SchemaResources schemaResources = new SchemaResources(List.of(), List.of(), List.of(),
-                List.of("/submission_data_schema_local.json"));
+        SchemaResources schemaResources = new SchemaResources(List.of(), List.of(), List.of(), "submission-data-test-schema");
 
         SchemaResourceProvider schemaResourceProvider = new SchemaResourceProvider(mock(RestTemplate.class), schemaResources);
 
@@ -146,7 +145,7 @@ class SchemaResourceProviderTest {
     @Test
     void loadSubmissionDataSchemaFromMemoryFailed() {
 
-        SchemaResources schemaResources = new SchemaResources(List.of(), List.of(), List.of(), List.of());
+        SchemaResources schemaResources = new SchemaResources(List.of(), List.of(), List.of(), null);
 
         SchemaResourceProvider schemaResourceProvider = new SchemaResourceProvider(mock(RestTemplate.class), schemaResources);
 
diff --git a/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java b/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java
index 0eb691a65..651a433cc 100644
--- a/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java
+++ b/core/src/test/java/dev/fitko/fitconnect/core/validation/DefaultValidationServiceTest.java
@@ -61,8 +61,8 @@ class DefaultValidationServiceTest {
         final List<String> setSchemas = SchemaConfig.getSetSchemaFilePaths("/set-schema");
         final List<String> metadataSchemas = SchemaConfig.getMetadataSchemaFileNames("/metadata-schema");
         final List<String> destinationSchemas = SchemaConfig.getDestinationSchemaPaths("/destination-schema");
-        final List<String> submissionDataSchemas = SchemaConfig.getSubmissionDataSchemaPaths("/submission-data-schema");
-        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataSchemas);
+        final String submissionDataSchemaPath = "submission-data-test-schema";
+        final SchemaResources schemaResources = new SchemaResources(setSchemas, metadataSchemas, destinationSchemas, submissionDataSchemaPath);
         schemaProvider = new SchemaResourceProvider(restTemplate, schemaResources);
         underTest = new DefaultValidationService(config, hashService, schemaProvider);
     }
@@ -449,7 +449,7 @@ class DefaultValidationServiceTest {
 
         // Given
         SchemaProvider schemaProvider = mock(SchemaProvider.class);
-        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission_data_schema_remote.json"));
+        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission-data-test-schema/submission_data_schema_remote.json"));
         DefaultValidationService defaultValidationService = new DefaultValidationService(getApplicationConfig(true, false), new HashService(), schemaProvider);
 
         final var invalidJson = "{ \"someString\": \"someStringValue\", \"someArray\": [\"someArrayValue\"] }";
@@ -467,7 +467,7 @@ class DefaultValidationServiceTest {
 
         // Given
         SchemaProvider schemaProvider = mock(SchemaProvider.class);
-        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission_data_schema_remote.json"));
+        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission-data-test-schema/submission_data_schema_remote.json"));
         DefaultValidationService defaultValidationService = new DefaultValidationService(getApplicationConfig(true, false), new HashService(), schemaProvider);
 
         final var invalidJson = "{ \"wrongString\": \"someStringValue\", \"someArray\": [\"someArrayValue\"] }";
@@ -486,7 +486,7 @@ class DefaultValidationServiceTest {
 
         // Given
         SchemaProvider schemaProvider = mock(SchemaProvider.class);
-        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission_data_schema_remote.json"));
+        when(schemaProvider.loadSubmissionDataSchema(any())).thenReturn(getResource("/submission-data-test-schema/submission_data_schema_remote.json"));
         DefaultValidationService defaultValidationService = new DefaultValidationService(getApplicationConfig(true, true), new HashService(), schemaProvider);
 
         final var invalidJson = "{ \"wrongString\": \"someStringValue\", \"someArray\": [\"someArrayValue\"] }";
diff --git a/core/src/main/resources/submission-data-schema/s00000096_1.0.schema.json b/core/src/test/resources/submission-data-test-schema/s00000096_1.0.schema.json
similarity index 100%
rename from core/src/main/resources/submission-data-schema/s00000096_1.0.schema.json
rename to core/src/test/resources/submission-data-test-schema/s00000096_1.0.schema.json
diff --git a/core/src/test/resources/submission_data_schema_local.json b/core/src/test/resources/submission-data-test-schema/submission_data_schema_local.json
similarity index 100%
rename from core/src/test/resources/submission_data_schema_local.json
rename to core/src/test/resources/submission-data-test-schema/submission_data_schema_local.json
diff --git a/core/src/test/resources/submission_data_schema_remote.json b/core/src/test/resources/submission-data-test-schema/submission_data_schema_remote.json
similarity index 100%
rename from core/src/test/resources/submission_data_schema_remote.json
rename to core/src/test/resources/submission-data-test-schema/submission_data_schema_remote.json
-- 
GitLab