diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy index 1ddc638d68..62424fae42 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/TestGenerator.groovy @@ -20,7 +20,10 @@ import java.nio.charset.StandardCharsets import java.nio.file.Path import java.util.concurrent.atomic.AtomicInteger +import groovy.transform.CompileStatic import groovy.transform.PackageScope +import org.apache.commons.logging.Log +import org.apache.commons.logging.LogFactory import wiremock.com.google.common.collect.ListMultimap import org.springframework.cloud.contract.spec.ContractVerifierException @@ -37,13 +40,16 @@ import static org.springframework.cloud.contract.verifier.util.NamesUtil.beforeL import static org.springframework.cloud.contract.verifier.util.NamesUtil.convertIllegalPackageChars import static org.springframework.cloud.contract.verifier.util.NamesUtil.directoryToPackage import static org.springframework.cloud.contract.verifier.util.NamesUtil.toLastDot + /** * @author Jakub Kubrynski, codearte.io */ +@CompileStatic class TestGenerator { private static final String DEFAULT_CLASS_PREFIX = "ContractVerifier" private static final String DEFAULT_TEST_PACKAGE = "org.springframework.cloud.contract.verifier.tests" + private static final Log log = LogFactory.getLog(TestGenerator) private final ContractVerifierConfigProperties configProperties private AtomicInteger counter = new AtomicInteger() @@ -101,7 +107,7 @@ class TestGenerator { } } - private String relativizeContractPath(Map.Entry> entry) { + private String relativizeContractPath(Map.Entry> entry) { Path relativePath = configProperties.contractsDslDir.toPath().relativize(entry.getKey()) if (StringUtils.isEmpty(relativePath.toString())) { return DEFAULT_CLASS_PREFIX @@ -111,8 +117,11 @@ class TestGenerator { private void processIncludedDirectory( final String includedDirectoryRelativePath, Collection contracts, final String basePackageNameForClass) { + if (log.isDebugEnabled()) { + log.debug("Included directory relative path is [${includedDirectoryRelativePath}]") + } if (contracts.size()) { - def className = afterLast(includedDirectoryRelativePath.toString(), File.separator) + resolveNameSuffix() + def className = afterLast(includedDirectoryRelativePath, File.separator) + resolveNameSuffix() def convertedClassName = convertIllegalPackageChars(className) def packageName = buildPackage(basePackageNameForClass, includedDirectoryRelativePath) def classBytes = generator.buildClass(configProperties, contracts, convertedClassName, packageName, includedDirectoryRelativePath).getBytes(StandardCharsets.UTF_8) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy index 12a6f66799..5e25c6bab4 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilder.groovy @@ -18,6 +18,9 @@ package org.springframework.cloud.contract.verifier.builder import groovy.transform.CompileStatic import groovy.transform.PackageScope +import org.apache.commons.logging.Log +import org.apache.commons.logging.LogFactory + import org.springframework.cloud.contract.verifier.config.TestFramework import org.springframework.cloud.contract.verifier.util.NamesUtil import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties @@ -33,6 +36,8 @@ import org.springframework.cloud.contract.verifier.config.ContractVerifierConfig @PackageScope class ClassBuilder { + private static final Log log = LogFactory.getLog(ClassBuilder) + private static final String SEPARATOR = "_REPLACEME_" private final String className @@ -72,11 +77,15 @@ class ClassBuilder { } protected static String retrieveBaseClass(ContractVerifierConfigProperties properties, String includedDirectoryRelativePath) { + String contractPathAsPackage = includedDirectoryRelativePath.replace(File.separator, ".") String contractPackage = includedDirectoryRelativePath.replace(File.separator, SEPARATOR) // package mapping takes super precedence if (properties.baseClassMappings) { Map.Entry mapping = properties.baseClassMappings.find { String pattern, String fqn -> - return contractPackage.matches(pattern) + return contractPathAsPackage.matches(pattern) + } + if (log.isDebugEnabled()) { + log.debug("Matching pattern for contract package [${contractPathAsPackage}] with setup ${properties.baseClassMappings} is [${mapping}]") } if (mapping) { return mapping.value diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy index 5c7020876e..7181fe45c3 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ClassBuilderSpec.groovy @@ -1,5 +1,7 @@ package org.springframework.cloud.contract.verifier.builder +import spock.lang.Issue + import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties import spock.lang.Specification @@ -49,6 +51,16 @@ class ClassBuilderSpec extends Specification { ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass' } + @Issue("701") + def "should match base class when mapping regex has multiple folders"() { + given: + ContractVerifierConfigProperties props = new ContractVerifierConfigProperties( + baseClassMappings: ['.*bar.baz.some.*' : 'com.example.base.SuperClass']) + String contractRelativeFolder = 'foo/bar/baz/some/package'.split("/").join(File.separator) + expect: + ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass' + } + def "should return the first matching base class when provided mapping doesn't match"() { given: ContractVerifierConfigProperties props = new ContractVerifierConfigProperties(