diff --git a/spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/FileMonitorConfiguration.java b/spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/FileMonitorConfiguration.java index 902923e57..c82519a7d 100644 --- a/spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/FileMonitorConfiguration.java +++ b/spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/FileMonitorConfiguration.java @@ -202,7 +202,7 @@ private Set getFileRepo() { } Resource resource = this.resourceLoader.getResource(repositoryUri); if (resource instanceof FileSystemResource || resource instanceof FileUrlResource) { - paths.add(Paths.get(resource.getURI())); + paths.add(resolvePath(resource)); } } return paths; @@ -217,7 +217,7 @@ private Set getFileRepo() { Resource resource = this.resourceLoader.getResource(path); if (resource.exists()) { try { - paths.add(Paths.get(resource.getURI())); + paths.add(resolvePath(resource)); } catch (Exception e) { log.error("Cannot resolve URI for path: " + path); @@ -229,6 +229,13 @@ private Set getFileRepo() { return null; } + private Path resolvePath(Resource resource) throws IOException { + if (resource instanceof FileSystemResource || resource instanceof FileUrlResource) { + return resource.getFile().toPath().toAbsolutePath().normalize(); + } + return Paths.get(resource.getURI()); + } + private Set filesFromEvents() { Set files = new LinkedHashSet(); if (this.watcher == null) { diff --git a/spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java b/spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java index e4cb9c18f..633c8b30c 100644 --- a/spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java +++ b/spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java @@ -16,7 +16,9 @@ package org.springframework.cloud.config.monitor; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -26,6 +28,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository; import org.springframework.cloud.config.server.environment.JGitEnvironmentProperties; @@ -54,6 +57,9 @@ public class FileMonitorConfigurationTest { private List repositories = new ArrayList<>(); + @TempDir + private Path tempDir; + @BeforeEach public void setup() { fileMonitorConfiguration.setResourceLoader(new FileSystemResourceLoader()); @@ -89,6 +95,22 @@ public void testStart_withNativeEnvironmentRepository() { assertOnDirectory(1); } + @Test + public void testStart_withNativeEnvironmentRepositoryAndRelativeFileUri() throws Exception { + // given + Path relativeLocation = Paths.get("target", "file-monitor", tempDir.getFileName().toString(), "config.d"); + Files.createDirectories(relativeLocation); + NativeEnvironmentRepository repository = createNativeEnvironmentRepository("file:" + relativeLocation); + ReflectionTestUtils.setField(fileMonitorConfiguration, "nativeEnvironmentRepository", repository); + + // when + fileMonitorConfiguration.start(); + + // then + Set directory = getDirectory(); + assertThat(directory).containsExactly(relativeLocation.toAbsolutePath()); + } + @Test public void testStart_withOneScmRepository() { // given @@ -203,9 +225,13 @@ private void addScmRepository(AbstractScmEnvironmentRepository... repository) { } private NativeEnvironmentRepository createNativeEnvironmentRepository() { + return createNativeEnvironmentRepository("classpath:pathsamples"); + } + + private NativeEnvironmentRepository createNativeEnvironmentRepository(String... searchLocations) { ConfigurableEnvironment environment = createConfigurableEnvironment(); NativeEnvironmentProperties properties = new NativeEnvironmentProperties(); - properties.setSearchLocations(new String[] { "classpath:pathsamples" }); + properties.setSearchLocations(searchLocations); return new NativeEnvironmentRepository(environment, properties, ObservationRegistry.NOOP); }