diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java index cac6d28b48..93271f7b3e 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockConfiguration.java @@ -113,20 +113,22 @@ public class WireMockConfiguration implements SmartLifecycle { } private void registerFiles(com.github.tomakehurst.wiremock.core.WireMockConfiguration factory) throws IOException { + List resources = new ArrayList<>(); for (String files : this.wireMock.getFiles()) { if (StringUtils.hasText(files)) { PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver( this.resourceLoader); - List resources = new ArrayList<>(); for (Resource resource : resolver.getResources(files)) { if (resource.exists()) { resources.add(resource); } } - ResourcesFileSource fileSource = new ResourcesFileSource(resources.toArray(new Resource[0])); - factory.fileSource(fileSource); } } + if (!resources.isEmpty()) { + ResourcesFileSource fileSource = new ResourcesFileSource(resources.toArray(new Resource[0])); + factory.fileSource(fileSource); + } } @Override diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java index 918a0bcf4a..52b3a709fb 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java @@ -34,28 +34,37 @@ import com.github.tomakehurst.wiremock.common.TextFile; /** * @author Dave Syer - * + * @author Pei-Tang Huang */ public class ResourcesFileSource implements FileSource { private final FileSource[] sources; - public ResourcesFileSource(Resource[] resources) { - this.sources = new FileSource[resources.length]; + public ResourcesFileSource(Resource... resources) { + this(toSources(resources)); + } + + private ResourcesFileSource(FileSource... sources) { + this.sources = sources; + } + + private static FileSource[] toSources(Resource[] resources) { + FileSource[] sources = new FileSource[resources.length]; for (int i = 0; i < resources.length; i++) { Resource resource = resources[i]; if (resource instanceof ClassPathResource) { ClassPathResource classes = (ClassPathResource) resource; - this.sources[i] = new ClasspathFileSource(classes.getPath()); + sources[i] = new ClasspathFileSource(classes.getPath()); } else if (resource instanceof FileSystemResource) { FileSystemResource files = (FileSystemResource) resource; - this.sources[i] = new SingleRootFileSource(files.getFile()); + sources[i] = new SingleRootFileSource(files.getFile()); } else { throw new IllegalArgumentException("Unsupported resource type for file source: " + resource.getClass()); } } + return sources; } @Override @@ -94,17 +103,21 @@ public class ResourcesFileSource implements FileSource { @Override public FileSource child(String subDirectoryName) { + List childSources = new ArrayList<>(); for (FileSource resource : this.sources) { try { UrlResource uri = new UrlResource(resource.child(subDirectoryName).getUri()); if (uri.createRelative(subDirectoryName).exists()) { - return resource.child(subDirectoryName); + childSources.add(resource.child(subDirectoryName)); } } catch (IOException e) { // Ignore } } + if (!childSources.isEmpty()) { + return new ResourcesFileSource(childSources.toArray(new FileSource[0])); + } return this.sources[0].child(subDirectoryName); } diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java index de7e88d1d8..79a0ad2314 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/AutoConfigureWireMockStubsAndMultipleFilesApplicationTests.java @@ -13,7 +13,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes=WiremockTestsApplication.class, properties="app.baseUrl=http://localhost:${wiremock.server.port}", webEnvironment=WebEnvironment.NONE) @DirtiesContext -@AutoConfigureWireMock(port=0, files={"classpath:/nonexistent/", "classpath:/root/"}, stubs="file:src/test/resources/io.stubs/mappings") +@AutoConfigureWireMock(port=0, files={"classpath:/", "classpath:/root/", "classpath:/nonexistent/"}, stubs="file:src/test/resources/io.stubs/mappings") public class AutoConfigureWireMockStubsAndMultipleFilesApplicationTests { @Autowired