All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.semla.maven.plugin.MethodRunnerMojo Maven / Gradle / Ivy

There is a newer version: 1.2.2
Show newest version
package io.semla.maven.plugin;

import org.apache.commons.lang3.ClassUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.apache.maven.plugins.annotations.ResolutionScope.TEST;

@Mojo(
    name = "generate",
    requiresDependencyResolution = TEST,
    requiresDependencyCollection = TEST
)
public class MethodRunnerMojo extends AbstractMojo {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Parameter(readonly = true, defaultValue = "${project}")
    private MavenProject project;

    @Parameter(property = "classname")
    private String classname;

    @Parameter(property = "methodname")
    private String methodname;

    @Parameter(property = "parameters")
    private Map parameters;

    @Override
    public void execute() {
        try {
            logger.info("invoking: " + classname + "." + methodname + "(" + parameters + ")");
            Method addUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            addUrl.setAccessible(true);
            Set jarList = project.getCompileClasspathElements().stream().map(File::new).collect(Collectors.toSet());
            jarList.addAll(project.getTestClasspathElements().stream().map(File::new).collect(Collectors.toSet()));
            for (File file : jarList) {
                addUrl.invoke(ClassLoader.getSystemClassLoader(), file.toURI().toURL());
            }
            Class clazz = ClassLoader.getSystemClassLoader().loadClass(classname);
            Method method = Stream.of(clazz.getDeclaredMethods())
                .filter(m -> m.getName().equals(methodname) && m.getParameterCount() == parameters.size())
                .filter(m -> Arrays.stream(m.getParameters(), 0, m.getParameterCount())
                    .allMatch(parameter -> ClassUtils.isAssignable(parameters.get(parameter.getName()).getClass(), parameter.getType())))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("didn't find any method matching parameters: " + parameters));
            Object[] args = Stream.of(method.getParameters())
                .map(parameter -> parameters.get(parameter.getName()))
                .toArray();
            method.invoke(null, args);
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy