From c6a07ed234630e419d6ec0b3314b102626d2f575 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Thu, 10 Jun 2021 13:50:44 -0400 Subject: [PATCH] Support new delimiters in spring.config.location (#1904) --- .../NativeEnvironmentRepository.java | 90 +++++++++++------- ...EnvironmentRepositoryIntegrationTests.java | 14 +++ .../ordering-repo/git/COMMIT_EDITMSG | 1 + .../src/test/resources/ordering-repo/git/HEAD | 1 + .../test/resources/ordering-repo/git/config | 7 ++ .../resources/ordering-repo/git/description | 1 + .../test/resources/ordering-repo/git/index | Bin 0 -> 309 bytes .../resources/ordering-repo/git/info/exclude | 6 ++ .../resources/ordering-repo/git/logs/HEAD | 1 + .../ordering-repo/git/logs/refs/heads/master | 1 + .../02/09d6d392d65f4ad734b9cb938889ddd40683f4 | Bin 0 -> 49 bytes .../1c/cddaee9468c2f249e75dc81e50877935955866 | Bin 0 -> 90 bytes .../7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 | Bin 0 -> 43 bytes .../82/65220d6be7d73011cbc98382b499e5d7169fe7 | 2 + .../ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 | Bin 0 -> 37 bytes .../fc/4aeb82a374f50cae0654d8db79dda083eff3d7 | Bin 0 -> 65 bytes .../ordering-repo/git/refs/heads/master | 1 + .../ordering-repo/project/application.yml | 3 + .../project/sub/application-test.yml | 2 + 19 files changed, 93 insertions(+), 37 deletions(-) create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/COMMIT_EDITMSG create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/HEAD create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/config create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/description create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/index create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/info/exclude create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/HEAD create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/refs/heads/master create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/02/09d6d392d65f4ad734b9cb938889ddd40683f4 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/1c/cddaee9468c2f249e75dc81e50877935955866 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/82/65220d6be7d73011cbc98382b499e5d7169fe7 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/fc/4aeb82a374f50cae0654d8db79dda083eff3d7 create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/refs/heads/master create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/project/application.yml create mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/project/sub/application-test.yml diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java index 5f05761c..a49835d6 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java @@ -17,6 +17,7 @@ package org.springframework.cloud.config.server.environment; import java.io.File; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -224,7 +225,7 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc map.put("spring.config.name", config); // map.put("encrypt.failOnError=" + this.failOnError); map.put("spring.config.location", - StringUtils.arrayToCommaDelimitedString(getLocations(application, profile, label).getLocations())); + StringUtils.arrayToDelimitedString(getLocations(application, profile, label).getLocations(), ";")); // globally ignore config files that are not found map.put("spring.config.on-not-found", "IGNORE"); environment.getPropertySources().addFirst(new MapPropertySource("config-data-setup", map)); @@ -245,7 +246,7 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc if (this.environment.getPropertySources().contains(name)) { continue; } - String location = null; + String[] locations = null; PropertySourceConfigData configData = propertySourceToConfigData.get(source.getOriginalPropertySource()); // try and get information directly from ConfigData @@ -253,17 +254,16 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc StandardConfigDataResource configDataResource = (StandardConfigDataResource) configData.resource; // use StandardConfigDataResource as that format is expected still name = configDataResource.toString(); - location = configData.location.toString(); + locations = configDataLocations(configData.location.split()); } else { // if not, try and parse Matcher matcher = RESOURCE_PATTERN.matcher(name); if (matcher.find()) { name = matcher.group(1); - location = matcher.group(2); + locations = new String[] { matcher.group(2) }; } } - // TODO: needed anymore? name = name.replace("applicationConfig: [", ""); name = name.replace("file [", "file:"); if (name.indexOf('[') < 0) { @@ -271,38 +271,7 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc name = name.replace("]", ""); } if (this.searchLocations != null) { - boolean matches = false; - String normal = name; - if (normal.startsWith("file:")) { - normal = StringUtils.cleanPath(new File(normal.substring("file:".length())).getAbsolutePath()); - } - String profile = result.getProfiles() == null ? null - : StringUtils.arrayToCommaDelimitedString(result.getProfiles()); - for (String pattern : getLocations(result.getName(), profile, result.getLabel()).getLocations()) { - if (!pattern.contains(":")) { - pattern = "file:" + pattern; - } - if (pattern.startsWith("file:")) { - pattern = StringUtils.cleanPath(new File(pattern.substring("file:".length())).getAbsolutePath()) - + "/"; - } - if (logger.isTraceEnabled()) { - logger.trace("Testing pattern: " + pattern + " with property source: " + name); - } - if (normal.startsWith(pattern) && !normal.substring(pattern.length()).contains("/")) { - matches = true; - break; - } - if (location != null && location.startsWith("file:")) { - location = StringUtils - .cleanPath(new File(location.substring("file:".length())).getAbsolutePath()) + "/"; - } - if (location != null && location.startsWith(pattern) - && !location.substring(pattern.length()).contains("/")) { - matches = true; - break; - } - } + boolean matches = matchesLocation(locations, name, result); if (!matches) { // Don't include this one: it wasn't matched by our search locations if (logger.isDebugEnabled()) { @@ -324,6 +293,53 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc return result; } + private String[] configDataLocations(ConfigDataLocation[] locations) { + String[] stringLocations = new String[locations.length]; + for (int i = 0; i < locations.length; i++) { + stringLocations[i] = locations[i].toString(); + } + return stringLocations; + } + + private boolean matchesLocation(String[] locations, String name, Environment result) { + boolean matches = false; + String normal = name; + if (normal.startsWith("file:")) { + normal = StringUtils.cleanPath(new File(normal.substring("file:".length())).getAbsolutePath()); + } + String profile = result.getProfiles() == null ? null + : StringUtils.arrayToCommaDelimitedString(result.getProfiles()); + for (String pattern : getLocations(result.getName(), profile, result.getLabel()).getLocations()) { + if (!pattern.contains(":")) { + pattern = "file:" + pattern; + } + if (pattern.startsWith("file:")) { + pattern = StringUtils.cleanPath(new File(pattern.substring("file:".length())).getAbsolutePath()) + "/"; + } + final String finalPattern = pattern; + if (logger.isTraceEnabled()) { + logger.trace("Testing pattern: " + finalPattern + " with property source: " + name); + } + if (normal.startsWith(finalPattern) && !normal.substring(finalPattern.length()).contains("/")) { + matches = true; + break; + } + if (locations != null) { + return !Arrays.stream(locations).map(this::cleanFileLocation) + .noneMatch(location -> location.startsWith(finalPattern) + && !location.substring(finalPattern.length()).contains("/")); + } + } + return matches; + } + + private String cleanFileLocation(String location) { + if (location.startsWith("file:")) { + return StringUtils.cleanPath(new File(location.substring("file:".length())).getAbsolutePath()) + "/"; + } + return location; + } + public String[] getSearchLocations() { return this.searchLocations; } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index c77b9c09..0da8da47 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -219,6 +219,20 @@ public class JGitEnvironmentRepositoryIntegrationTests { assertThat(environment.getPropertySources().size()).isEqualTo(3); } + @Test + public void verifyPropertySourceOrdering() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo("ordering-repo"); + this.context = new SpringApplicationBuilder(TestConfiguration.class).web(WebApplicationType.NONE) + .run("--spring.cloud.config.server.git.uri=" + uri, "--spring.cloud.config.server.git.searchPaths=**"); + EnvironmentRepository repository = this.context.getBean(EnvironmentRepository.class); + Environment environment = repository.findOne("application", "test", "master"); + assertThat(environment.getPropertySources().size()).isEqualTo(2); + assertThat(environment.getPropertySources().get(0).getName()) + .isEqualTo("file:././target/repos/ordering-repo//project/sub/application-test.yml"); + assertThat(environment.getPropertySources().get(1).getName()) + .isEqualTo("file:././target/repos/ordering-repo//project/application.yml"); + } + @Test public void nestedWithProfilePlaceholders() throws IOException { String uri = ConfigServerTestUtils.prepareLocalRepo("nested-repo"); diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/COMMIT_EDITMSG b/spring-cloud-config-server/src/test/resources/ordering-repo/git/COMMIT_EDITMSG new file mode 100644 index 00000000..80260766 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/COMMIT_EDITMSG @@ -0,0 +1 @@ +initial commit diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/HEAD b/spring-cloud-config-server/src/test/resources/ordering-repo/git/HEAD new file mode 100644 index 00000000..cb089cd8 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/config b/spring-cloud-config-server/src/test/resources/ordering-repo/git/config new file mode 100644 index 00000000..6c9406b7 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/config @@ -0,0 +1,7 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/description b/spring-cloud-config-server/src/test/resources/ordering-repo/git/description new file mode 100644 index 00000000..498b267a --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/index b/spring-cloud-config-server/src/test/resources/ordering-repo/git/index new file mode 100644 index 0000000000000000000000000000000000000000..9636a1b19f4a796e197c7d4ab700de5cedfe3dc0 GIT binary patch literal 309 zcmZ?q402{*U|<5_goE-$T#QOjV)L%(8hW!FU}RumZ^CBMe)u``V)O6{2cF_aCHU+n7PHJNyujFmZTP! zKr9Fea&-k-6UtzuV93S9dF}F~Yw=#!O?IB1+|haW3S09Rs1aa!nX|XvP02X)$@6*a z3AupwO4F$kX+WbH3>6Hx{&>A^T3qs#XB}I}joX!X7c{^Be4UZ6{;zxUFAF8xsW;+p L2iOZ_E|UZRj019g literal 0 HcmV?d00001 diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/info/exclude b/spring-cloud-config-server/src/test/resources/ordering-repo/git/info/exclude new file mode 100644 index 00000000..a5196d1b --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/HEAD b/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/HEAD new file mode 100644 index 00000000..6cc2571d --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 8265220d6be7d73011cbc98382b499e5d7169fe7 Ryan Baxter 1623269485 -0400 commit (initial): initial commit diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/refs/heads/master b/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/refs/heads/master new file mode 100644 index 00000000..6cc2571d --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 8265220d6be7d73011cbc98382b499e5d7169fe7 Ryan Baxter 1623269485 -0400 commit (initial): initial commit diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/02/09d6d392d65f4ad734b9cb938889ddd40683f4 b/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/02/09d6d392d65f4ad734b9cb938889ddd40683f4 new file mode 100644 index 0000000000000000000000000000000000000000..23f4a161288cdea2c1f97ac21ec768167108bc18 GIT binary patch literal 49 zcmV-10M7q-0V^p=O;s>9VK6ZO0)>L2{H)aE5(b&Gx86<3IP}T$dF%AW-v4`Ff%bxNGvGG$xKcx$;{8wtIW+|sLEKf`vkYkq4tV8 wWw!tGuirC06JlZj1PaBaNeq9yUN4XUNP;%eUfEP)N(qw^B$-EaECkEVoi9DJo6n0sy?O3Z$+9 B5~2VA literal 0 HcmV?d00001 diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/82/65220d6be7d73011cbc98382b499e5d7169fe7 b/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/82/65220d6be7d73011cbc98382b499e5d7169fe7 new file mode 100644 index 00000000..7c01b9a0 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/82/65220d6be7d73011cbc98382b499e5d7169fe7 @@ -0,0 +1,2 @@ +xA +0E]seiD#xI@HEo/uYB7N8Z$ J'28('r1F!~6y tlpli{yVP ` c{&o_הh~C: \ No newline at end of file diff --git a/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 b/spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 new file mode 100644 index 0000000000000000000000000000000000000000..ba0830da5137e65197b5863b829ee51bd4b84068 GIT binary patch literal 37 vcmV+=0NVd}0ZYosPf{>4WXQ}*%eUfEP)N(qw^Ar5%1_J8N#z0ngA)ksO