From 03c26d528d4b714067979f725f79ad1dea0c910b Mon Sep 17 00:00:00 2001 From: Gilles Robert Date: Thu, 7 Feb 2019 21:20:28 +0100 Subject: [PATCH] Allows multiple repos in FileMonitorConfiguration. (#1247) Fixes gh-1239 --- .../monitor/FileMonitorConfiguration.java | 26 +-- .../monitor/FileMonitorConfigurationTest.java | 156 ++++++++++++++++++ 2 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java 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 fe09af19..9b9de937 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 @@ -31,6 +31,7 @@ import java.nio.file.WatchService; import java.nio.file.attribute.BasicFileAttributes; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; @@ -57,6 +58,7 @@ import org.springframework.util.PatternMatchUtils; * (i.e. a git repository with a "file:" URI) or to a native repository. * * @author Dave Syer + * @author Gilles Robert * */ @Configuration @@ -66,13 +68,13 @@ public class FileMonitorConfiguration implements SmartLifecycle, ResourceLoaderA private static final Log log = LogFactory.getLog(FileMonitorConfiguration.class); @Autowired - PropertyPathEndpoint endpoint; + private PropertyPathEndpoint endpoint; @Autowired(required = false) - AbstractScmEnvironmentRepository scmRepository; + private List scmRepositories; @Autowired(required = false) - NativeEnvironmentRepository nativeEnvironmentRepository; + private NativeEnvironmentRepository nativeEnvironmentRepository; private boolean running; @@ -185,17 +187,21 @@ public class FileMonitorConfiguration implements SmartLifecycle, ResourceLoaderA } private Set getFileRepo() { - if (this.scmRepository != null) { + if (this.scmRepositories != null) { + String repositoryUri = null; + Set paths = new LinkedHashSet<>(); try { - - Resource resource = this.resourceLoader - .getResource(this.scmRepository.getUri()); - if (resource instanceof FileSystemResource) { - return Collections.singleton(Paths.get(resource.getURI())); + for (AbstractScmEnvironmentRepository repository : scmRepositories) { + repositoryUri = repository.getUri(); + Resource resource = this.resourceLoader.getResource(repositoryUri); + if (resource instanceof FileSystemResource) { + paths.add(Paths.get(resource.getURI())); + } } + return paths; } catch (IOException e) { - log.error("Cannot resolve URI for path: " + this.scmRepository.getUri()); + log.error("Cannot resolve URI for path: " + repositoryUri); } } if (this.nativeEnvironmentRepository != 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 new file mode 100644 index 00000000..310495ba --- /dev/null +++ b/spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java @@ -0,0 +1,156 @@ +/* + * Copyright 2015-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.config.monitor; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository; +import org.springframework.cloud.config.server.environment.JGitEnvironmentProperties; +import org.springframework.cloud.config.server.environment.JGitEnvironmentRepository; +import org.springframework.cloud.config.server.environment.NativeEnvironmentProperties; +import org.springframework.cloud.config.server.environment.NativeEnvironmentRepository; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.io.FileSystemResourceLoader; +import org.springframework.mock.env.MockEnvironment; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Gilles Robert + * + */ +public class FileMonitorConfigurationTest { + + private static final String SAMPLE_PATH = "resources/pathsamples"; + + private FileMonitorConfiguration fileMonitorConfiguration = new FileMonitorConfiguration(); + + private List repositories = new ArrayList<>(); + + @Before + public void setup() { + fileMonitorConfiguration.setResourceLoader(new FileSystemResourceLoader()); + } + + @After + public void tearDown() { + fileMonitorConfiguration.stop(); + } + + @Test + public void testStart_whenRepositoriesAreNull() { + // given + + // when + fileMonitorConfiguration.start(); + + // then + Set directory = getDirectory(); + assertThat(directory).isNull(); + } + + @Test + public void testStart_withNativeEnvironmentRepository() { + // given + NativeEnvironmentRepository repository = createNativeEnvironmentRepository(); + ReflectionTestUtils.setField(fileMonitorConfiguration, + "nativeEnvironmentRepository", repository); + + // when + fileMonitorConfiguration.start(); + + // then + assertOnDirectory(1); + } + + @Test + public void testStart_withOneScmRepository() { + // given + AbstractScmEnvironmentRepository repository = createScmEnvironmentRepository( + SAMPLE_PATH); + addScmRepository(repository); + + // when + fileMonitorConfiguration.start(); + + // then + assertOnDirectory(1); + } + + @Test + public void testStart_withTwoScmRepositories() { + // given + AbstractScmEnvironmentRepository repository = createScmEnvironmentRepository( + SAMPLE_PATH); + AbstractScmEnvironmentRepository secondRepository = createScmEnvironmentRepository( + "anotherPath"); + addScmRepository(repository); + addScmRepository(secondRepository); + + // when + fileMonitorConfiguration.start(); + + // then + assertOnDirectory(2); + } + + private void addScmRepository(AbstractScmEnvironmentRepository... repository) { + repositories.addAll(Arrays.asList(repository)); + ReflectionTestUtils.setField(fileMonitorConfiguration, "scmRepositories", + repositories); + } + + private NativeEnvironmentRepository createNativeEnvironmentRepository() { + ConfigurableEnvironment environment = createConfigurableEnvironment(); + NativeEnvironmentProperties properties = new NativeEnvironmentProperties(); + properties.setSearchLocations(new String[] { "classpath:pathsamples" }); + return new NativeEnvironmentRepository(environment, properties); + } + + private AbstractScmEnvironmentRepository createScmEnvironmentRepository(String uri) { + ConfigurableEnvironment environment = createConfigurableEnvironment(); + JGitEnvironmentProperties properties = new JGitEnvironmentProperties(); + properties.setUri(uri); + return new JGitEnvironmentRepository(environment, properties); + } + + private void assertOnDirectory(int expectedDirectorySize) { + Set directory = getDirectory(); + assertThat(directory).isNotNull(); + assertThat(directory).hasSize(expectedDirectorySize); + } + + private ConfigurableEnvironment createConfigurableEnvironment() { + return new MockEnvironment(); + } + + @SuppressWarnings("unchecked") + private Set getDirectory() { + return (Set) ReflectionTestUtils.getField(fileMonitorConfiguration, + "directory"); + } + +}