diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractScanner.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractScanner.groovy deleted file mode 100644 index 7da17e2413..0000000000 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractScanner.groovy +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.contract.verifier.util - -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import java.nio.file.SimpleFileVisitor -import java.nio.file.attribute.BasicFileAttributes -import java.util.function.Predicate - -import groovy.transform.CompileStatic -import org.apache.commons.logging.Log -import org.apache.commons.logging.LogFactory - -import org.springframework.cloud.contract.spec.Contract -import org.springframework.cloud.contract.spec.ContractConverter -import org.springframework.cloud.contract.verifier.converter.YamlContractConverter -import org.springframework.core.io.support.SpringFactoriesLoader - -/** - * Scans through the given directory and converts all files for - * contract definitions. - * - * @author Marcin Grzejszczak - * @since 2.1.0 - */ -@CompileStatic -final class ContractScanner { - - private static final Log log = LogFactory.getLog(ContractScanner.class) - - /** - * Traverses through the directories, applies converters - * to files that match them and converts the files to {@link Contract}. - * No additional file filtering takes place. - * - * @param rootDirectory - directory to traverse through - * @return collection of converted contracts - */ - @SuppressWarnings("unchecked") - static Collection collectContractDescriptors( - final File rootDirectory) { - return collectContractDescriptors(rootDirectory, { true }) - } - - /** - * Traverses through the directories, applies converters - * to files that match them and converts the files to {@link Contract}. - * Filters out files not matching a predicate. - * - * @param rootDirectory - directory to traverse through - * @param predicate - test applied against a file - * @return collection of converted contracts - */ - @SuppressWarnings("unchecked") - static Collection collectContractDescriptors( - final File rootDirectory, Predicate predicate) { - final List contractDescriptors = new ArrayList<>() - try { - Files.walkFileTree(Paths.get(rootDirectory.toURI()), - new SimpleFileVisitor() { - @Override - FileVisitResult visitFile(Path path, - BasicFileAttributes attrs) throws IOException { - File file = path.toFile() - ContractConverter converter = contractConverter(file) - if (predicate.test(file)) { - if (isContractDescriptor(file)) { - contractDescriptors - .addAll(ContractVerifierDslConverter - .convertAsCollection( - file.getParentFile(), file).findAll { it }) - } - else if (converter != null - && converter.isAccepted(file)) { - contractDescriptors - .addAll(converter.convertFrom(file)) - } - else if (YamlContractConverter.INSTANCE - .isAccepted(file)) { - contractDescriptors - .addAll(YamlContractConverter.INSTANCE - .convertFrom(file)) - } - } - return super.visitFile(path, attrs) - } - }) - } - catch (IOException e) { - log.warn("Exception occurred while trying to parse file", e) - } - return contractDescriptors - } - - private static ContractConverter contractConverter(File file) { - for (ContractConverter converter : SpringFactoriesLoader - .loadFactories(ContractConverter.class, null)) { - if (converter.isAccepted(file)) { - return converter - } - } - return null - } - - private static boolean isContractDescriptor(File file) { - return ContractVerifierDslConverter.INSTANCE.isAccepted(file) - } -} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentType.groovy b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContentType.java similarity index 64% rename from spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentType.groovy rename to spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContentType.java index a6d635a52c..3004aac542 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentType.groovy +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContentType.java @@ -14,25 +14,48 @@ * limitations under the License. */ -package org.springframework.cloud.contract.verifier.util +package org.springframework.cloud.contract.verifier.util; + /** * Represents content type. Used to pick the way bodies are parsed. * * @since 1.0.0 */ -enum ContentType { +public enum ContentType { + /** + * application/json. + */ JSON("application/json"), + /** + * application/xml. + */ XML("application/xml"), + /** + * text/plain. + */ TEXT("text/plain"), + /** + * application/x-www-form-urlencoded. + */ FORM("application/x-www-form-urlencoded"), - // the content-type was defined and we don't want to override it + /** + * The content-type was defined and we don't want to override it. + */ DEFINED(""), - UNKNOWN("application/octet-stream") + /** + * application/octet-stream. + */ + UNKNOWN("application/octet-stream"); - final String mimeType + private final String mimeType; ContentType(String mimeType) { - this.mimeType = mimeType + this.mimeType = mimeType; } + + public final String getMimeType() { + return mimeType; + } + } diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractScanner.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractScanner.java new file mode 100644 index 0000000000..68ecb11aaa --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractScanner.java @@ -0,0 +1,106 @@ +/* + * Copyright 2013-2020 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 + * + * https://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.contract.verifier.util; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.cloud.contract.spec.Contract; +import org.springframework.cloud.contract.spec.ContractConverter; +import org.springframework.cloud.contract.verifier.converter.YamlContractConverter; +import org.springframework.core.io.support.SpringFactoriesLoader; + +/** + * Scans through the given directory and converts all files for contract definitions. + * + * @author Marcin Grzejszczak + * @author Anatolii Zhmaiev + * @since 2.1.0 + */ +public final class ContractScanner { + + private static final Log log = LogFactory.getLog(ContractScanner.class); + + private ContractScanner() { + throw new IllegalStateException("Can't instantiate an utility class"); + } + + /** + * Traverses through the directories, applies converters to files that match them and + * converts the files to {@link Contract}. No additional file filtering takes place. + * @param rootDirectory - directory to traverse through + * @return collection of converted contracts + */ + public static Collection collectContractDescriptors(File rootDirectory) { + return collectContractDescriptors(rootDirectory, (file) -> true); + } + + /** + * Traverses through the directories, applies converters to files that match them and + * converts the files to {@link Contract}. Filters out files not matching a predicate. + * @param rootDirectory - directory to traverse through + * @param predicate - test applied against a file + * @return collection of converted contracts + */ + public static Collection collectContractDescriptors(File rootDirectory, + Predicate predicate) { + try { + return Files.walk(rootDirectory.toPath()).map(Path::toFile) + .filter(file -> !file.isDirectory()).filter(predicate) + .map(ContractScanner::doCollectContractDescriptors) + .flatMap(Collection::stream).collect(Collectors.toList()); + } + catch (IOException e) { + log.warn("Exception occurred while trying to parse file", e); + return Collections.emptyList(); + } + } + + private static Collection doCollectContractDescriptors(File file) { + if (isContractDescriptor(file)) { + return ContractVerifierDslConverter.convertAsCollection(file.getParentFile(), + file); + } + ContractConverter converter = contractConverter(file); + if (converter != null && converter.isAccepted(file)) { + return converter.convertFrom(file); + } + if (YamlContractConverter.INSTANCE.isAccepted(file)) { + return YamlContractConverter.INSTANCE.convertFrom(file); + } + return Collections.emptyList(); + } + + private static ContractConverter contractConverter(File file) { + return SpringFactoriesLoader.loadFactories(ContractConverter.class, null).stream() + .filter(converter -> converter.isAccepted(file)).findFirst().orElse(null); + } + + private static boolean isContractDescriptor(File file) { + return ContractVerifierDslConverter.INSTANCE.isAccepted(file); + } + +} diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DslParseException.groovy b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/DslParseException.java similarity index 69% rename from spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DslParseException.groovy rename to spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/DslParseException.java index 68fb0d88dc..7bd68b2c18 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DslParseException.groovy +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/DslParseException.java @@ -14,16 +14,22 @@ * limitations under the License. */ -package org.springframework.cloud.contract.verifier.util - -import groovy.transform.InheritConstructors +package org.springframework.cloud.contract.verifier.util; /** - * Exception occurring when we're trying to parse the DSL + * Exception occurring when we're trying to parse the DSL. * * @author Marcin Grzejszczak * @since 1.1.0 */ -@InheritConstructors -class DslParseException extends RuntimeException { +public class DslParseException extends RuntimeException { + + public DslParseException(String message) { + super(message); + } + + public DslParseException(Throwable cause) { + super(cause); + } + } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonPaths.groovy b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/JsonPaths.java similarity index 79% rename from spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonPaths.groovy rename to spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/JsonPaths.java index 6bff8a63a2..d230bff85b 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonPaths.groovy +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/JsonPaths.java @@ -14,16 +14,15 @@ * limitations under the License. */ -package org.springframework.cloud.contract.verifier.util +package org.springframework.cloud.contract.verifier.util; -import groovy.transform.CompileStatic +import java.util.LinkedHashSet; /** - * Represents a set of Strings - set of method calls to assert a JSON + * Represents a set of Strings - set of method calls to assert a JSON. * * @since 1.0.0 */ -@CompileStatic -class JsonPaths extends LinkedHashSet { -} +public class JsonPaths extends LinkedHashSet { +}