From 6873826d723a9cb0b790332cf506fd17e24ca4ad Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 10 Nov 2020 17:51:01 +0100 Subject: [PATCH 1/2] Made the StubGenerators not check if they are applicable to a file --- .../contract/stubrunner/MappingGenerator.java | 3 +- .../converter/RecursiveFilesConverter.java | 6 ++-- .../verifier/converter/StubGenerator.java | 18 +++--------- .../converter/StubGeneratorProvider.java | 8 ----- .../wiremock/DslToWireMockConverter.java | 29 ------------------- .../main/resources/META-INF/spring.factories | 3 -- .../RecursiveFilesConverterSpec.groovy | 7 +---- 7 files changed, 9 insertions(+), 65 deletions(-) delete mode 100644 spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/MappingGenerator.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/MappingGenerator.java index c4bfb6fcd6..5bdb7e1a1c 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/MappingGenerator.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/MappingGenerator.java @@ -31,6 +31,7 @@ import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.verifier.converter.StubGenerator; import org.springframework.cloud.contract.verifier.converter.StubGeneratorProvider; import org.springframework.cloud.contract.verifier.file.ContractMetadata; +import org.springframework.cloud.contract.verifier.wiremock.DslToWireMockClientConverter; import org.springframework.util.StringUtils; final class MappingGenerator { @@ -45,7 +46,7 @@ final class MappingGenerator { File mappingsFolder) { StubGeneratorProvider provider = new StubGeneratorProvider(); Collection stubGenerators = provider - .converterForName(contractFile); + .allOrDefault(new DslToWireMockClientConverter()); if (log.isDebugEnabled()) { log.debug("Found following matching stub generators " + stubGenerators); } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.java index e3ea52bd7d..0d69f92f20 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverter.java @@ -128,10 +128,8 @@ public class RecursiveFilesConverter { log.debug("Will create a stub for contract [" + contract + "]"); } File sourceFile = contract.getPath().toFile(); - Collection stubGenerators = contract - .getConvertedContract() != null - ? holder.allOrDefault(new DslToWireMockClientConverter()) - : holder.converterForName(sourceFile); + Collection stubGenerators = holder + .allOrDefault(new DslToWireMockClientConverter()); try { String path = sourceFile.getPath(); if (excludeBuildFolders && (matchesPath(path, "target") diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java index bf2560a646..9ab3415956 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java @@ -16,7 +16,6 @@ package org.springframework.cloud.contract.verifier.converter; -import java.io.File; import java.util.Map; import org.springframework.cloud.contract.spec.Contract; @@ -30,23 +29,14 @@ import org.springframework.cloud.contract.verifier.file.ContractMetadata; public interface StubGenerator { /** - * @param fileName - file name + * @param contractFileName - file name * @return {@code true} if the converter can handle the file to convert it into a * stub. - * @deprecated use {@link StubGenerator#canHandleFileName(File)} + * @deprecated all present converters will be picked */ @Deprecated - default boolean canHandleFileName(String fileName) { - return fileName.endsWith(fileExtension()); - } - - /** - * @param file - file - * @return {@code true} if the converter can handle the file to convert it into a - * stub. - */ - default boolean canHandleFileName(File file) { - return file.getName().endsWith(fileExtension()); + default boolean canHandleFileName(String contractFileName) { + return contractFileName.endsWith(fileExtension()); } /** diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java index 44173ee131..babf98e21e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java @@ -16,12 +16,10 @@ package org.springframework.cloud.contract.verifier.converter; -import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -44,12 +42,6 @@ public class StubGeneratorProvider { this.converters.addAll(converters); } - public Collection converterForName(final File file) { - return this.converters.stream() - .filter(stubGenerator -> stubGenerator.canHandleFileName(file)) - .collect(Collectors.toList()); - } - public Collection allOrDefault(StubGenerator defaultStubGenerator) { return this.converters.isEmpty() ? Collections.singletonList(defaultStubGenerator) : this.converters; diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java index d50d956ab6..1fc0b9ea26 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java @@ -16,19 +16,7 @@ package org.springframework.cloud.contract.verifier.wiremock; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.nio.file.Files; - -import com.github.tomakehurst.wiremock.common.JsonException; -import com.github.tomakehurst.wiremock.stubbing.StubMapping; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import org.springframework.cloud.contract.verifier.converter.StubGenerator; -import org.springframework.util.StreamUtils; /** * WireMock implementation of the {@link StubGenerator}. @@ -37,8 +25,6 @@ import org.springframework.util.StreamUtils; */ public abstract class DslToWireMockConverter implements StubGenerator { - private static final Log log = LogFactory.getLog(DslToWireMockConverter.class); - @Override public String generateOutputFileNameForInput(String inputFileName) { return inputFileName.replaceAll(extension(inputFileName), "json"); @@ -52,19 +38,4 @@ public abstract class DslToWireMockConverter implements StubGenerator { return ""; } - @Override - public boolean canHandleFileName(File file) { - try (InputStream stream = Files.newInputStream(file.toPath())) { - StubMapping.buildFrom( - StreamUtils.copyToString(stream, Charset.forName("UTF-8"))); - return true; - } - catch (IOException | JsonException e) { - if (log.isDebugEnabled()) { - log.debug("Cannot read file", e); - } - return false; - } - } - } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 9c00e75f2b..0000000000 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -# Stub converters -org.springframework.cloud.contract.verifier.converter.StubGenerator=\ -org.springframework.cloud.contract.verifier.wiremock.DslToWireMockClientConverter diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy index 766c46200a..d0a469a25d 100755 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy @@ -194,12 +194,7 @@ org.springframework.cloud.contract.spec.Contract.make { private StubGenerator stubGenerator(String stub) { return new StubGenerator() { @Override - boolean canHandleFileName(String fileName) { - return true - } - - @Override - boolean canHandleFileName(File fileName) { + boolean canHandleFileName(String contractFileName) { return true } From 3477371021f075fe64aaec386b7d8b6d5b652d24 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 10 Nov 2020 22:07:02 +0100 Subject: [PATCH 2/2] Fixed naming --- .../verifier/converter/StubGenerator.java | 20 +++++++++--- .../converter/StubGeneratorProvider.java | 14 ++++++++ .../wiremock/DslToWireMockConverter.java | 32 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 ++ .../RecursiveFilesConverterSpec.groovy | 9 ++++-- 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java index 9ab3415956..3c1dccbaa8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java @@ -16,6 +16,7 @@ package org.springframework.cloud.contract.verifier.converter; +import java.io.File; import java.util.Map; import org.springframework.cloud.contract.spec.Contract; @@ -29,14 +30,22 @@ import org.springframework.cloud.contract.verifier.file.ContractMetadata; public interface StubGenerator { /** - * @param contractFileName - file name + * @param fileName - file name * @return {@code true} if the converter can handle the file to convert it into a * stub. - * @deprecated all present converters will be picked + * @deprecated use {@link StubGenerator#canReadStubMapping(File)} */ @Deprecated - default boolean canHandleFileName(String contractFileName) { - return contractFileName.endsWith(fileExtension()); + default boolean canReadStubMapping(String fileName) { + return fileName.endsWith(fileExtension()); + } + + /** + * @param mapping - potential stub mapping mapping + * @return {@code true} if this converter could have generated this mapping stub. + */ + default boolean canReadStubMapping(File mapping) { + return mapping.getName().endsWith(fileExtension()); } /** @@ -61,7 +70,8 @@ public interface StubGenerator { String generateOutputFileNameForInput(String inputFileName); /** - * Describes the file extension that this stub generator can handle. + * Describes the file extension of the generated mapping that this stub generator can + * handle. * @return string describing the file extension */ default String fileExtension() { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java index babf98e21e..da1651bf1c 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGeneratorProvider.java @@ -16,10 +16,12 @@ package org.springframework.cloud.contract.verifier.converter; +import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -42,6 +44,18 @@ public class StubGeneratorProvider { this.converters.addAll(converters); } + /** + * @param file - stub mapping file + * @return collection of stub generators matching the stub mapping + * @deprecated use {@link #allOrDefault(StubGenerator)} + */ + @Deprecated + public Collection converterForName(final File file) { + return this.converters.stream() + .filter(stubGenerator -> stubGenerator.canReadStubMapping(file)) + .collect(Collectors.toList()); + } + public Collection allOrDefault(StubGenerator defaultStubGenerator) { return this.converters.isEmpty() ? Collections.singletonList(defaultStubGenerator) : this.converters; diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java index 1fc0b9ea26..4f0f1260c5 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DslToWireMockConverter.java @@ -16,7 +16,19 @@ package org.springframework.cloud.contract.verifier.wiremock; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; + +import com.github.tomakehurst.wiremock.common.JsonException; +import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.cloud.contract.verifier.converter.StubGenerator; +import org.springframework.util.StreamUtils; /** * WireMock implementation of the {@link StubGenerator}. @@ -25,6 +37,8 @@ import org.springframework.cloud.contract.verifier.converter.StubGenerator; */ public abstract class DslToWireMockConverter implements StubGenerator { + private static final Log log = LogFactory.getLog(DslToWireMockConverter.class); + @Override public String generateOutputFileNameForInput(String inputFileName) { return inputFileName.replaceAll(extension(inputFileName), "json"); @@ -38,4 +52,22 @@ public abstract class DslToWireMockConverter implements StubGenerator { return ""; } + @Override + public boolean canReadStubMapping(File mapping) { + if (!mapping.getName().endsWith(".json")) { + return false; + } + try (InputStream stream = Files.newInputStream(mapping.toPath())) { + StubMapping.buildFrom( + StreamUtils.copyToString(stream, Charset.forName("UTF-8"))); + return true; + } + catch (IOException | JsonException e) { + if (log.isDebugEnabled()) { + log.debug("Cannot read file", e); + } + return false; + } + } + } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..9c00e75f2b --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Stub converters +org.springframework.cloud.contract.verifier.converter.StubGenerator=\ +org.springframework.cloud.contract.verifier.wiremock.DslToWireMockClientConverter diff --git a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy index d0a469a25d..57af2e1a00 100755 --- a/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/groovy/org/springframework/cloud/contract/verifier/converter/RecursiveFilesConverterSpec.groovy @@ -110,7 +110,7 @@ org.springframework.cloud.contract.spec.Contract.make { }""" and: StubGenerator stubGenerator = Stub(StubGenerator) - stubGenerator.canHandleFileName(_) >> { true } + stubGenerator.canReadStubMapping(_) >> { true } stubGenerator.convertContents(_, _) >> { throw new NullPointerException("Test conversion error") } @@ -194,7 +194,12 @@ org.springframework.cloud.contract.spec.Contract.make { private StubGenerator stubGenerator(String stub) { return new StubGenerator() { @Override - boolean canHandleFileName(String contractFileName) { + boolean canReadStubMapping(String fileName) { + return true + } + + @Override + boolean canReadStubMapping(File mapping) { return true }