From 4440775661f997758f76235e767042385387bcf1 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 8 Mar 2023 14:28:26 -0500 Subject: [PATCH] Support brackets in yaml keys. Fixes #2197 (#2238) Co-authored-by: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> --- .../environment/EnvironmentController.java | 18 +++++++++++++++--- .../EnvironmentControllerTests.java | 13 +++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java index 196a116d..cde7f35d 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java @@ -482,6 +482,7 @@ public class EnvironmentController { private String getKey() { // Consider initial value or previous char '.' or '[' int start = this.currentPos + 1; + int openingBracketPosition = -1; for (int i = start; i < this.propertyKey.length(); i++) { char currentChar = this.propertyKey.charAt(i); if (currentChar == '.') { @@ -490,9 +491,20 @@ public class EnvironmentController { break; } else if (currentChar == '[') { - this.valueType = NodeType.ARRAY; - this.currentPos = i; - break; + openingBracketPosition = i; + } + else if (currentChar == ']') { + String bracketContents = this.propertyKey.substring(openingBracketPosition + 1, i); + try { + Integer.parseInt(bracketContents); + this.valueType = NodeType.ARRAY; + this.currentPos = openingBracketPosition; + break; + } + catch (NumberFormatException e) { + // This means the key contains a [ and a ] but the contents were + // not an integer so it's not an array + } } } // If there's no delimiter then it's a key of a leaf diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerTests.java index ccf15c84..415a33bd 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerTests.java @@ -182,6 +182,19 @@ class EnvironmentControllerTests { assertThat(yaml).isEqualTo("a:\n b:\n - c\n - d\n"); } + @Test + public void yamlWithBrackets() throws Exception { + Map map = new LinkedHashMap(); + map.put("a.test", "e"); + map.put("a.b[hello]", "c"); + map.put("a.b[world]", "d"); + map.put("a.b[world]d", "f"); + this.environment.add(new PropertySource("one", map)); + when(this.repository.findOne("foo", "bar", null, false)).thenReturn(this.environment); + String yaml = this.controller.yaml("foo", "bar", false).getBody(); + assertThat(yaml).isEqualTo("a:\n test: e\n b[hello]: c\n b[world]: d\n b[world]d: f\n"); + } + @Test public void arrayOverridenInEnvironment() throws Exception { // Add original values first source