From 488d9adccc2697d24e2cc5f134312198523bcc8e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 25 May 2022 12:10:57 +0200 Subject: [PATCH] Removed the spring cloud function java compiler usage; fixes gh-1782 --- pom.xml | 20 ------- spring-cloud-contract-verifier/pom.xml | 4 -- .../util/ContractVerifierDslConverter.java | 60 ++++++++++++------- .../verifier/util/SyntaxChecker.groovy | 3 - 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/pom.xml b/pom.xml index 341a038967..c3eb36561c 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ 4.0.0-SNAPSHOT 4.0.0-SNAPSHOT 4.0.0-SNAPSHOT - 3.0.6.RELEASE 5.0.4 3.2.11 2.2-M1-groovy-4.0 @@ -101,25 +100,6 @@ pom import - - org.springframework.cloud - spring-cloud-function-compiler - ${spring-cloud-functiondonotreplace.version} - - - org.springframework.cloud - spring-cloud-function-core - - - org.apache.maven - * - - - org.eclipse.aether - * - - - org.apache.camel.springboot camel-spring-boot-starter diff --git a/spring-cloud-contract-verifier/pom.xml b/spring-cloud-contract-verifier/pom.xml index 49e36fd754..3deba738ae 100644 --- a/spring-cloud-contract-verifier/pom.xml +++ b/spring-cloud-contract-verifier/pom.xml @@ -249,10 +249,6 @@ spring-boot-starter-jersey test --> - - org.springframework.cloud - spring-cloud-function-compiler - org.mdkt.compiler InMemoryJavaCompiler diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.java index a4babc3579..f3a5db19b6 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.java @@ -24,14 +24,24 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; +import java.util.List; +import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.tools.DiagnosticCollector; +import javax.tools.JavaCompiler; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; import groovy.lang.GroovyShell; import org.codehaus.groovy.control.CompilerConfiguration; @@ -40,8 +50,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.spec.ContractConverter; -import org.springframework.cloud.function.compiler.java.CompilationResult; -import org.springframework.cloud.function.compiler.java.RuntimeJavaCompiler; +import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; /** @@ -65,7 +74,7 @@ public class ContractVerifierDslConverter implements ContractConverter convertAsCollection(File rootFolder, String dsl) { ClassLoader classLoader = ContractVerifierDslConverter.class.getClassLoader(); @@ -128,12 +137,6 @@ public class ContractVerifierDslConverter implements ContractConverter classConstructor(File dsl) throws IllegalAccessException, IOException, NoSuchMethodException { - String classText = Files.lines(Paths.get(dsl.getAbsolutePath())).collect(Collectors.joining("\n")); - String fqn = fqn(classText); - CompilationResult compilationResult = COMPILER.compile(fqn, classText); - if (!compilationResult.wasSuccessful()) { - throw new IllegalStateException("Exceptions occurred while trying to compile the file " - + compilationResult.getCompilationMessages()); + try (StandardJavaFileManager fileManager = COMPILER.getStandardFileManager(null, null, null)) { + try (Stream lines = Files.lines(Paths.get(dsl.getAbsolutePath()))) { + String classText = lines.collect(Collectors.joining("\n")); + String fqn = fqn(classText); + Path directory = Files.createTempDirectory(fqn); + fileManager.setLocation(StandardLocation.CLASS_OUTPUT, List.of(directory.toFile())); + // Compile the file + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + JavaCompiler.CompilationTask task = COMPILER.getTask(null, fileManager, diagnostics, null, null, + fileManager.getJavaFileObjectsFromFiles(List.of(dsl))); + boolean success = task.call(); + if (!success) { + throw new IllegalStateException("Exceptions occurred while trying to compile the file \n" + + diagnostics.getDiagnostics().stream() + .map(d -> "Error " + d.getMessage(Locale.getDefault()) + "on line " + + d.getLineNumber() + " in " + d.getSource()) + .collect(Collectors.joining("\n"))); + } + try { + Class clazz = ClassUtils.forName(fqn, null); + Constructor constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + return constructor; + } + catch (ClassNotFoundException e) { + throw new IllegalStateException("Class with name [" + fqn + "] not found"); + } + } } - Class clazz = compilationResult.getCompiledClasses().stream().filter(it -> it.getName().equals(fqn)) - .findFirst().orElseThrow(() -> new IllegalStateException("Class with name [" + fqn + "] not found")); - Constructor constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible(true); - return constructor; } private static boolean isJava(File dsl) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy index 98a6b98611..ceb01b0187 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy @@ -45,7 +45,6 @@ import org.springframework.cloud.contract.verifier.messaging.internal.ContractVe import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper import org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil -import org.springframework.cloud.function.compiler.java.RuntimeJavaCompiler import org.springframework.util.ReflectionUtils /** * checking the syntax of produced scripts @@ -54,8 +53,6 @@ import org.springframework.util.ReflectionUtils @Commons class SyntaxChecker { - public static final RuntimeJavaCompiler COMPILER = new RuntimeJavaCompiler() - private static final String[] DEFAULT_IMPORTS = [ Contract.name, "io.restassured.response.ResponseOptions",