From 288a588644d835ffe4a3c13d2880cf13057acc7b Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Tue, 25 Mar 2025 17:54:55 +0100
Subject: [PATCH] OZG-7609 flatten PropertySource

---
 pom.xml                                       |  6 ++++
 .../setting/SettingEnvironmentRepository.java |  6 ++--
 ...gationMappingEnvironmentSettingITCase.java | 34 +++++++++----------
 ...actory.java => PropertiesTestFactory.java} |  6 ++--
 .../setting/SettingEnvironmentITCase.java     | 10 +++---
 .../SettingEnvironmentRepositoryTest.java     |  9 +++--
 .../settings/aggregation.json.tmpl            |  1 +
 .../settings/aggregation.yaml.tmpl            | 21 ------------
 8 files changed, 43 insertions(+), 50 deletions(-)
 rename src/test/java/de/ozgcloud/admin/setting/{YamlTestFactory.java => PropertiesTestFactory.java} (97%)
 create mode 100644 src/test/resources/yamlTemplates/settings/aggregation.json.tmpl
 delete mode 100644 src/test/resources/yamlTemplates/settings/aggregation.yaml.tmpl

diff --git a/pom.xml b/pom.xml
index edad1443..30345bd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,7 @@
 
 		<zufi-manager.version>1.6.0</zufi-manager.version>
 		<shedlock.version>5.16.0</shedlock.version>
+		<spring-vault-core.version>3.1.2</spring-vault-core.version>
 	</properties>
 
 	<dependencies>
@@ -149,6 +150,11 @@
 			<artifactId>mapstruct-processor</artifactId>
 			<version>${mapstruct.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.vault</groupId>
+			<artifactId>spring-vault-core</artifactId>
+			<version>${spring-vault-core.version}</version>
+		</dependency>
 
 		<!-- commons -->
 		<dependency>
diff --git a/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java b/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
index a6e74eac..82193473 100644
--- a/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
+++ b/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
@@ -33,6 +33,7 @@ import org.springframework.cloud.config.environment.Environment;
 import org.springframework.cloud.config.environment.PropertySource;
 import org.springframework.cloud.config.server.environment.EnvironmentRepository;
 import org.springframework.stereotype.Component;
+import org.springframework.vault.support.JsonMapFlattener;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -74,8 +75,9 @@ public class SettingEnvironmentRepository implements EnvironmentRepository {
 	}
 
 	PropertySource transformToPropertySource(ApplicationSettingDTO settingDTO) {
-		return new PropertySource(StringUtils.EMPTY, objectMapper.convertValue(settingDTO, new TypeReference<Map<String, Object>>() {
-		}));
+		return new PropertySource(StringUtils.EMPTY,
+				JsonMapFlattener.flatten(objectMapper.convertValue(settingDTO, new TypeReference<Map<String, Object>>() {
+				})));
 	}
 
 }
diff --git a/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingEnvironmentSettingITCase.java b/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingEnvironmentSettingITCase.java
index d65fc2db..197adf56 100644
--- a/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingEnvironmentSettingITCase.java
+++ b/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingEnvironmentSettingITCase.java
@@ -36,7 +36,7 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 
-import de.ozgcloud.admin.setting.YamlTestFactory;
+import de.ozgcloud.admin.setting.PropertiesTestFactory;
 import de.ozgcloud.common.test.DataITCase;
 import lombok.SneakyThrows;
 
@@ -63,36 +63,36 @@ public class AggregationMappingEnvironmentSettingITCase {
 			var result = getAggregationSettings();
 
 			assertThat(result.andReturn().getResponse().getContentAsString())
-					.isEqualTo(YamlTestFactory.createAggregationYaml());
+					.isEqualTo(PropertiesTestFactory.createAggregationProperties());
 		}
 
 		private ResultActions getAggregationSettings() throws Exception {
-			return mockMvc.perform(get("/configserver/OzgCloud_AggregationManager-any.yaml"))
+			return mockMvc.perform(get("/configserver/OzgCloud_AggregationManager/default"))
 					.andExpect(status().isOk());
 		}
 
 		private void fillDbWithAggregationMappings() {
 			var aggregationMapping1 = AggregationMapping.builder()
 					.formIdentifier(AggregationMapping.FormIdentifier.builder()
-							.formEngineName(YamlTestFactory.FORM_ENGINE_NAME_1)
-							.formId(YamlTestFactory.FORM_ID_1)
+							.formEngineName(PropertiesTestFactory.FORM_ENGINE_NAME_1)
+							.formId(PropertiesTestFactory.FORM_ID_1)
 							.build())
-					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(YamlTestFactory.SOURCE_PATH_1_1)
-							.targetPath(YamlTestFactory.TARGET_PATH_1_1).build())
-					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(YamlTestFactory.SOURCE_PATH_1_2)
-							.targetPath(YamlTestFactory.TARGET_PATH_1_2).build())
-					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(YamlTestFactory.SOURCE_PATH_1_3)
-							.targetPath(YamlTestFactory.TARGET_PATH_1_3).build())
+					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(PropertiesTestFactory.SOURCE_PATH_1_1)
+							.targetPath(PropertiesTestFactory.TARGET_PATH_1_1).build())
+					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(PropertiesTestFactory.SOURCE_PATH_1_2)
+							.targetPath(PropertiesTestFactory.TARGET_PATH_1_2).build())
+					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(PropertiesTestFactory.SOURCE_PATH_1_3)
+							.targetPath(PropertiesTestFactory.TARGET_PATH_1_3).build())
 					.build();
 			var aggregationMapping2 = AggregationMapping.builder()
 					.formIdentifier(AggregationMapping.FormIdentifier.builder()
-							.formEngineName(YamlTestFactory.FORM_ENGINE_NAME_2)
-							.formId(YamlTestFactory.FORM_ID_2)
+							.formEngineName(PropertiesTestFactory.FORM_ENGINE_NAME_2)
+							.formId(PropertiesTestFactory.FORM_ID_2)
 							.build())
-					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(YamlTestFactory.SOURCE_PATH_2_1)
-							.targetPath(YamlTestFactory.TARGET_PATH_2_1).build())
-					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(YamlTestFactory.SOURCE_PATH_2_2)
-							.targetPath(YamlTestFactory.TARGET_PATH_2_2).build())
+					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(PropertiesTestFactory.SOURCE_PATH_2_1)
+							.targetPath(PropertiesTestFactory.TARGET_PATH_2_1).build())
+					.mapping(AggregationMapping.FieldMapping.builder().sourcePath(PropertiesTestFactory.SOURCE_PATH_2_2)
+							.targetPath(PropertiesTestFactory.TARGET_PATH_2_2).build())
 					.build();
 
 			mongoOperations.dropCollection(AggregationMapping.COLLECTION_NAME);
diff --git a/src/test/java/de/ozgcloud/admin/setting/YamlTestFactory.java b/src/test/java/de/ozgcloud/admin/setting/PropertiesTestFactory.java
similarity index 97%
rename from src/test/java/de/ozgcloud/admin/setting/YamlTestFactory.java
rename to src/test/java/de/ozgcloud/admin/setting/PropertiesTestFactory.java
index 40ac3f16..3c149bd9 100644
--- a/src/test/java/de/ozgcloud/admin/setting/YamlTestFactory.java
+++ b/src/test/java/de/ozgcloud/admin/setting/PropertiesTestFactory.java
@@ -31,7 +31,7 @@ import de.ozgcloud.admin.setting.postfach.PostfachSettingBody;
 import de.ozgcloud.admin.setting.postfach.PostfachSettingBodyTestFactory;
 import de.ozgcloud.common.test.TestUtils;
 
-public class YamlTestFactory {
+public class PropertiesTestFactory {
 
 	public static final PostfachSettingBody POSTFACH = PostfachSettingBodyTestFactory.create();
 	public static final String FORM_ENGINE_NAME_1 = LoremIpsum.getInstance().getWords(1);
@@ -72,8 +72,8 @@ public class YamlTestFactory {
 		return TestUtils.loadTextFile("yamlTemplates/settings/initial.yaml.tmpl");
 	}
 
-	public static String createAggregationYaml() {
-		return TestUtils.loadTextFile("yamlTemplates/settings/aggregation.yaml.tmpl",
+	public static String createAggregationProperties() {
+		return TestUtils.loadTextFile("yamlTemplates/settings/aggregation.json.tmpl",
 				FORM_ENGINE_NAME_1,
 				FORM_ID_1,
 				SOURCE_PATH_1_1,
diff --git a/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentITCase.java b/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentITCase.java
index 4fe44a5e..455c4825 100644
--- a/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentITCase.java
+++ b/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentITCase.java
@@ -80,7 +80,8 @@ class SettingEnvironmentITCase {
 			void shouldHandleEmptySetting() {
 				var result = getAlfaSettings();
 
-				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString())).isEqualTo(YamlTestFactory.createInitialYaml());
+				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString()))
+						.isEqualTo(PropertiesTestFactory.createInitialYaml());
 			}
 		}
 
@@ -97,7 +98,7 @@ class SettingEnvironmentITCase {
 			void shouldReturnValuesForAlfa() {
 				var result = getAlfaSettings();
 
-				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString())).isEqualTo(YamlTestFactory.createAlfaYaml());
+				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString())).isEqualTo(PropertiesTestFactory.createAlfaYaml());
 			}
 		}
 
@@ -122,7 +123,8 @@ class SettingEnvironmentITCase {
 			void shouldHandleEmptySetting() {
 				var result = getVorgangManagerSettings();
 
-				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString())).isEqualTo(YamlTestFactory.createInitialYaml());
+				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString()))
+						.isEqualTo(PropertiesTestFactory.createInitialYaml());
 			}
 		}
 
@@ -140,7 +142,7 @@ class SettingEnvironmentITCase {
 				var result = getVorgangManagerSettings();
 
 				assertThat(formatLineBreaks(result.andReturn().getResponse().getContentAsString()))
-						.isEqualTo(YamlTestFactory.createVorgangManagerYaml());
+						.isEqualTo(PropertiesTestFactory.createVorgangManagerYaml());
 			}
 		}
 
diff --git a/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentRepositoryTest.java b/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentRepositoryTest.java
index b59b5edc..25e1a2ac 100644
--- a/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentRepositoryTest.java
+++ b/src/test/java/de/ozgcloud/admin/setting/SettingEnvironmentRepositoryTest.java
@@ -199,7 +199,10 @@ class SettingEnvironmentRepositoryTest {
             @Getter
             private ApplicationSettingDTO attribute = new ApplicationSettingDTO() {
                 @Getter
-                private String nestedAttribute = "innerValue";
+                private ApplicationSettingDTO nestedAttribute = new ApplicationSettingDTO() {
+                    @Getter
+                    private String nestedAttribute = "innerValue";
+                };
             };
         };
 
@@ -213,8 +216,8 @@ class SettingEnvironmentRepositoryTest {
         }
 
         @Test
-        void shouldReturnPropertySourceOfNestedObject() {
-            var expectedPropertySource = new PropertySource(StringUtils.EMPTY, Map.of("attribute.nestedAttribute", "innerValue"));
+        void shouldReturnPropertySourceOfFlattenedNestedObject() {
+            var expectedPropertySource = new PropertySource(StringUtils.EMPTY, Map.of("attribute.nestedAttribute.nestedAttribute", "innerValue"));
 
             var resultPropertySource = repository.transformToPropertySource(nestedSettingDTO);
 
diff --git a/src/test/resources/yamlTemplates/settings/aggregation.json.tmpl b/src/test/resources/yamlTemplates/settings/aggregation.json.tmpl
new file mode 100644
index 00000000..b4db7c45
--- /dev/null
+++ b/src/test/resources/yamlTemplates/settings/aggregation.json.tmpl
@@ -0,0 +1 @@
+{"name":"OzgCloud_AggregationManager","profiles":["default"],"label":null,"version":null,"state":null,"propertySources":[{"name":"","source":{"ozgcloud.aggregation.aggregationMappings[0].formIdentifier.formEngineName":"%s","ozgcloud.aggregation.aggregationMappings[0].formIdentifier.formId":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[0].sourcePath":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[0].targetPath":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[1].sourcePath":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[1].targetPath":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[2].sourcePath":"%s","ozgcloud.aggregation.aggregationMappings[0].fieldMappings[2].targetPath":"%s","ozgcloud.aggregation.aggregationMappings[1].formIdentifier.formEngineName":"%s","ozgcloud.aggregation.aggregationMappings[1].formIdentifier.formId":"%s","ozgcloud.aggregation.aggregationMappings[1].fieldMappings[0].sourcePath":"%s","ozgcloud.aggregation.aggregationMappings[1].fieldMappings[0].targetPath":"%s","ozgcloud.aggregation.aggregationMappings[1].fieldMappings[1].sourcePath":"%s","ozgcloud.aggregation.aggregationMappings[1].fieldMappings[1].targetPath":"%s"}}]}
\ No newline at end of file
diff --git a/src/test/resources/yamlTemplates/settings/aggregation.yaml.tmpl b/src/test/resources/yamlTemplates/settings/aggregation.yaml.tmpl
deleted file mode 100644
index 0b8a9c51..00000000
--- a/src/test/resources/yamlTemplates/settings/aggregation.yaml.tmpl
+++ /dev/null
@@ -1,21 +0,0 @@
-ozgcloud:
-  aggregation:
-    aggregationMappings:
-    - formIdentifier:
-        formEngineName: %s
-        formId: %s
-      fieldMappings:
-      - sourcePath: %s
-        targetPath: %s
-      - sourcePath: %s
-        targetPath: %s
-      - sourcePath: %s
-        targetPath: %s
-    - formIdentifier:
-        formEngineName: %s
-        formId: %s
-      fieldMappings:
-      - sourcePath: %s
-        targetPath: %s
-      - sourcePath: %s
-        targetPath: %s
-- 
GitLab