From 3ca23c866d898b1c90f74e0d641aa18345b9fa81 Mon Sep 17 00:00:00 2001 From: slandelle Date: Wed, 14 Feb 2024 19:24:10 +0100 Subject: [PATCH] chore: simplify simulations detection --- .../java/io/gatling/mojo/GatlingMojo.java | 107 +----------------- .../io/gatling/mojo/SimulationClassUtils.java | 107 +++++------------- 2 files changed, 28 insertions(+), 186 deletions(-) diff --git a/src/main/java/io/gatling/mojo/GatlingMojo.java b/src/main/java/io/gatling/mojo/GatlingMojo.java index 9ae9e99..39036bb 100644 --- a/src/main/java/io/gatling/mojo/GatlingMojo.java +++ b/src/main/java/io/gatling/mojo/GatlingMojo.java @@ -27,25 +27,17 @@ import java.io.BufferedWriter; import java.io.File; import java.io.IOException; -import java.lang.reflect.Modifier; -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.*; import java.util.stream.Collectors; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.*; import org.apache.maven.project.MavenProject; import org.apache.maven.toolchain.Toolchain; -import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.ExceptionUtils; -import org.codehaus.plexus.util.SelectorUtils; /** Mojo to execute Gatling. */ @Execute(phase = LifecyclePhase.TEST_COMPILE) @@ -342,8 +334,7 @@ private List simulations() throws MojoFailureException { } else { List simulations = - SimulationClassUtils.resolveSimulations( - mavenProject, compiledClassesFolder, includes, excludes); + SimulationClassUtils.resolveSimulations(mavenProject, includes, excludes); if (simulations.isEmpty()) { getLog().error("No simulations to run"); @@ -388,100 +379,4 @@ private List gatlingArgs(String simulationClass) throws Exception { return args; } - - private Optional> loadJavaSimulationClass(ClassLoader testClassLoader) { - try { - return Optional.of(testClassLoader.loadClass("io.gatling.javaapi.core.Simulation")); - } catch (ClassNotFoundException e) { - // ignore - return Optional.empty(); - } - } - - /** - * Resolve simulation files to execute from the simulation folder. - * - * @return a comma separated String of simulation class names. - */ - private List resolveSimulations() { - - try { - ClassLoader testClassLoader = new URLClassLoader(testClassPathUrls()); - - Class scalaSimulationClass = - testClassLoader.loadClass("io.gatling.core.scenario.Simulation"); - Optional> javaSimulationClass = loadJavaSimulationClass(testClassLoader); - - List includes = MojoUtils.arrayAsListEmptyIfNull(this.includes); - List excludes = MojoUtils.arrayAsListEmptyIfNull(this.excludes); - - List simulationsClasses = new ArrayList<>(); - - for (String classFile : compiledClassFiles()) { - String className = pathToClassName(classFile); - - boolean isIncluded = includes.isEmpty() || match(includes, className); - boolean isExcluded = !excludes.isEmpty() && match(excludes, className); - - if (isIncluded && !isExcluded) { - // check if the class is a concrete Simulation - Class clazz = testClassLoader.loadClass(className); - if (isConcreteClass(clazz) - && (javaSimulationClass - .map(simClass -> simClass.isAssignableFrom(clazz)) - .orElse(false) - || scalaSimulationClass.isAssignableFrom(clazz))) { - simulationsClasses.add(className); - } - } - } - - return simulationsClasses; - - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private static boolean match(List patterns, String string) { - for (String pattern : patterns) { - if (pattern != null && SelectorUtils.match(pattern, string)) { - return true; - } - } - return false; - } - - private URL[] testClassPathUrls() - throws DependencyResolutionRequiredException, MalformedURLException { - - List testClasspathElements = mavenProject.getTestClasspathElements(); - - URL[] urls = new URL[testClasspathElements.size()]; - for (int i = 0; i < testClasspathElements.size(); i++) { - String testClasspathElement = testClasspathElements.get(i); - URL url = Paths.get(testClasspathElement).toUri().toURL(); - urls[i] = url; - } - - return urls; - } - - private String[] compiledClassFiles() throws IOException { - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir(compiledClassesFolder.getCanonicalPath()); - scanner.setIncludes(new String[] {"**/*.class"}); - scanner.scan(); - String[] files = scanner.getIncludedFiles(); - Arrays.sort(files); - return files; - } - - private String pathToClassName(String path) { - return path.substring(0, path.length() - ".class".length()).replace(File.separatorChar, '.'); - } - - private boolean isConcreteClass(Class clazz) { - return !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers()); - } } diff --git a/src/main/java/io/gatling/mojo/SimulationClassUtils.java b/src/main/java/io/gatling/mojo/SimulationClassUtils.java index 288c3b3..4928e53 100644 --- a/src/main/java/io/gatling/mojo/SimulationClassUtils.java +++ b/src/main/java/io/gatling/mojo/SimulationClassUtils.java @@ -16,20 +16,13 @@ */ package io.gatling.mojo; +import io.gatling.scanner.SimulationScanResult; +import io.gatling.scanner.SimulationScanner; import java.io.File; -import java.io.IOException; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Optional; -import org.apache.maven.artifact.DependencyResolutionRequiredException; +import java.util.stream.Collectors; import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.SelectorUtils; public final class SimulationClassUtils { @@ -42,83 +35,41 @@ private SimulationClassUtils() {} * @return a list of simulation class names. */ public static List resolveSimulations( - MavenProject mavenProject, File compiledClassesFolder, String[] includes, String[] excludes) { - + MavenProject mavenProject, String[] includes, String[] excludes) { try { - ClassLoader testClassLoader = new URLClassLoader(testClassPathUrls(mavenProject)); - - Class scalaSimulationClass = - testClassLoader.loadClass("io.gatling.core.scenario.Simulation"); - Optional> javaSimulationClass = loadJavaSimulationClass(testClassLoader); - - List includesList = MojoUtils.arrayAsListEmptyIfNull(includes); - List excludesList = MojoUtils.arrayAsListEmptyIfNull(excludes); - - List simulationsClasses = new ArrayList<>(); - - for (String classFile : compiledClassFiles(compiledClassesFolder)) { - String className = pathToClassName(classFile); + List testClasspathElements = mavenProject.getTestClasspathElements(); - boolean isIncluded = includesList.isEmpty() || match(includesList, className); - boolean isExcluded = !excludesList.isEmpty() && match(excludesList, className); + List dependencies = new ArrayList<>(); + List classDirectories = new ArrayList<>(); - if (isIncluded && !isExcluded) { - // check if the class is a concrete Simulation - Class clazz = testClassLoader.loadClass(className); - if (isConcreteClass(clazz) - && (javaSimulationClass - .map(simClass -> simClass.isAssignableFrom(clazz)) - .orElse(false) - || scalaSimulationClass.isAssignableFrom(clazz))) { - simulationsClasses.add(className); - } + for (String testClasspathElement : testClasspathElements) { + File file = new File(testClasspathElement); + if (file.isDirectory()) { + classDirectories.add(file); + } else if (file.isFile()) { + dependencies.add(file); } } - return simulationsClasses; - } catch (Exception e) { - throw new RuntimeException(e); - } - } + SimulationScanResult simulationScanResult = + SimulationScanner.scan(dependencies, classDirectories); - private static URL[] testClassPathUrls(MavenProject mavenProject) - throws DependencyResolutionRequiredException, MalformedURLException { - - List testClasspathElements = mavenProject.getTestClasspathElements(); - - URL[] urls = new URL[testClasspathElements.size()]; - for (int i = 0; i < testClasspathElements.size(); i++) { - String testClasspathElement = testClasspathElements.get(i); - URL url = Paths.get(testClasspathElement).toUri().toURL(); - urls[i] = url; - } - - return urls; - } + List includesList = MojoUtils.arrayAsListEmptyIfNull(includes); + List excludesList = MojoUtils.arrayAsListEmptyIfNull(excludes); - private static Optional> loadJavaSimulationClass(ClassLoader testClassLoader) { - try { - return Optional.of(testClassLoader.loadClass("io.gatling.javaapi.core.Simulation")); - } catch (ClassNotFoundException e) { - // ignore - return Optional.empty(); + return simulationScanResult.getSimulationClasses().stream() + .filter( + className -> { + boolean isIncluded = includesList.isEmpty() || match(includesList, className); + boolean isExcluded = !excludesList.isEmpty() && match(excludesList, className); + return isIncluded && !isExcluded; + }) + .collect(Collectors.toList()); + } catch (Exception e) { + throw new RuntimeException(e); } } - private static String[] compiledClassFiles(File compiledClassesFolder) throws IOException { - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir(compiledClassesFolder.getCanonicalPath()); - scanner.setIncludes(new String[] {"**/*.class"}); - scanner.scan(); - String[] files = scanner.getIncludedFiles(); - Arrays.sort(files); - return files; - } - - private static String pathToClassName(String path) { - return path.substring(0, path.length() - ".class".length()).replace(File.separatorChar, '.'); - } - private static boolean match(List patterns, String string) { for (String pattern : patterns) { if (pattern != null && SelectorUtils.match(pattern, string)) { @@ -127,8 +78,4 @@ private static boolean match(List patterns, String string) { } return false; } - - private static boolean isConcreteClass(Class clazz) { - return !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers()); - } }