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

io.sealights.agents.plugin.mojos.DefaultScannerMojo Maven / Gradle / Ivy

package io.sealights.agents.plugin.mojos;

import io.sealights.agents.plugin.ScannerMojo;
import io.sealights.agents.plugin.Utils.PathUtils;
import io.sealights.agents.plugin.Utils.StringUtils;
import io.sealights.agents.plugin.upgrade.BuildScannerUpgradeManager;
import io.sealights.agents.plugin.upgrade.services.UpgradeProxy;
import org.apache.maven.model.Build;
import org.apache.maven.plugin.MojoExecutionException;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DefaultScannerMojo {

    protected ScannerMojo mojo;

    public DefaultScannerMojo(ScannerMojo scannerMojo) {
        this.mojo = scannerMojo;
    }

    public void execute() throws MojoExecutionException {

        if (mojo == null){
            throw new MojoExecutionException("Listener mojo is null!");
        }

        if (!mojo.checkConfiguration()){
            return;
        }

        mojo.log.info("Initializing SeaLights Build Scanner.");
        mojo.init();

        // Discover the relative path from user.dir to the source code
        setBaseSourceFolder();

        String buildScannerJar = resolveBuildScannerPath();
        if (buildScannerJar == null){
            return;
        }

        List buildSessionArgs = createBuildSessionArgs();
        prepareArgumentsAndRunScanner(buildSessionArgs);
    }

    private void prepareArgumentsAndRunScanner(List buildSessionArgs) {
        List logArgs = prepareLogArgs();
        String[] commandLine = prepareExecutionCommand(logArgs, buildSessionArgs, mojo.buildScannerJar);
        logCommandLine(commandLine);
        if (mojo.project.getBasedir() != null) {
            runScanner(mojo.project.getBasedir().getAbsolutePath(), commandLine);
        }else {
            mojo.log.error("Failed to get project.basedir. Build Scanner will not run.");
        }
    }

    private String resolveBuildScannerPath() {
        String buildScannerJar;
        try {
            buildScannerJar = trySetBuildScannerPath(mojo.buildScannerJar);
            if (StringUtils.isNullOrEmpty(buildScannerJar)) {
                mojo.log.error("Failed setting the path to the build scanner. Path is null or empty. Sealights is disabled.");
                return null;
            }
        } catch (Exception e) {
            mojo.log.error("Failed setting the path to the build scanner. Sealights is disabled. Reason:", e);
            return null;
        }

        return buildScannerJar;
    }

    /**
     * sending ‘baseSourceFolder’ to the build scanner in order for the build scanner to set the ‘repositoryUrl’
     * (maven has unique folder structure that can be modified - and we need to know about it).
     */
    private void setBaseSourceFolder() {
        String userDir = System.getProperty("user.dir");
        Build build = mojo.project.getBuild();
        if (build == null) {
            mojo.log.warn("Unable to get 'project.getBuild'. Returning base source folder as 'null'");
            return;
        }

        String buildSourceDirectory = build.getSourceDirectory();
        if (buildSourceDirectory == null) {
            mojo.log.warn("Unable to get 'project.getBuild.getSourceDirectory'. Returning base source folder as 'null'");
            return;
        }

        String baseSourceFolder = buildSourceDirectory.replace(userDir, "");
        baseSourceFolder = baseSourceFolder.replace("\\", "/");
        if (baseSourceFolder.startsWith("/")) {
            // Remove the first slash to get clear name.
            baseSourceFolder = baseSourceFolder.substring(1);
        }

        mojo.baseSourceFolder = baseSourceFolder;
    }

    private String trySetBuildScannerPath(String buildScannerJar) throws Exception {

        if (StringUtils.isNullOrEmpty(buildScannerJar)) {
            buildScannerJar = findOrCreateRecommendedJar();
            if (buildScannerJar == null) {
                throw new Exception("The upgrade process returned with Build Scanner 'null'.");
            }
        }

        if (!new File(buildScannerJar).isFile()) {
            String message = "Build Scanner JAR could not be found in path '" + buildScannerJar + "'.";
            throw new Exception(message);
        }

        return buildScannerJar;
    }

    /**
     * Asks the server for the most recent version of the Build Scanner JAR.
     * Unless that jar is already present locally, downloads it and saves it to the files storage.
     *
     * @return path to the found/downloaded jar with recent version.
     * @throws Exception when the upgrade process fails.
     */
    private String findOrCreateRecommendedJar() throws Exception {
        UpgradeProxy upgradeProxy = new UpgradeProxy(mojo.upgradeConfiguration, mojo.userMessageHelper);
        BuildScannerUpgradeManager testListenerUpgradeManager
                = new BuildScannerUpgradeManager(upgradeProxy, mojo.upgradeConfiguration, mojo.userMessageHelper);
        return testListenerUpgradeManager.ensureLatestAgentPresentLocally();
    }

    private void runScanner(String workingDirectory, String[] buildScannerCommand) {
        try {
            //Invoke the build scanner and wait for the process to end.
            ProcessBuilder pb = new ProcessBuilder(buildScannerCommand);
            pb.directory(new File(workingDirectory));
            pb.inheritIO();
            Process p = pb.start();
            p.waitFor();


        } catch (Exception e) {
            mojo.log.error("Execution of SeaLights Build Scanner failed due to an error. Error: ", e);
        }
    }

    private List prepareLogArgs() {
        List logArgs = new ArrayList();

        if (mojo.logEnabled) {
            logArgs.add("-Dsl.log.enabled=true");
            if (StringUtils.isNullOrEmpty(mojo.logLevel)) {
                logArgs.add("-Dsl.log.level=info");
            } else {
                logArgs.add("-Dsl.log.level=" + mojo.logLevel);
            }

            if (mojo.logToFile) {
                logArgs.add("-Dsl.log.toFile=true");
                logArgs.add("-Dsl.log.filename=build-scanner");
                if (!StringUtils.isNullOrEmpty(mojo.logFolder)) {
                    String dir = PathUtils.join(mojo.logFolder, "scanner");
                    logArgs.add("-Dsl.log.folder=\"" + dir + "\"");
                }
            } else {
                logArgs.add("-Dsl.log.toConsole=true");
            }
        }

        return logArgs;
    }

    protected List createBuildSessionArgs() {
        List argsList = new ArrayList();
        if (!StringUtils.isNullOrEmpty(mojo.appName)) {
            addArgumentToList("-appname", mojo.appName, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.branch)) {
            addArgumentToList("-branch", mojo.branch, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.build)) {
            addArgumentToList("-build", mojo.build, argsList);
        } else {
            addArgumentToList("-build", mojo.project.getVersion(), argsList);
        }
        if (!StringUtils.isNullOrEmpty(mojo.buildScannerPackagesincluded)) {
            addArgumentToList("-packagesincluded", mojo.buildScannerPackagesincluded, argsList);
        } else if (!StringUtils.isNullOrEmpty(mojo.packagesincluded)) {
            addArgumentToList("-packagesincluded", mojo.packagesincluded, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.buildScannerPackagesexcluded)) {
            addArgumentToList("-packagesexcluded", mojo.buildScannerPackagesexcluded, argsList);
        } else if (!StringUtils.isNullOrEmpty(mojo.packagesexcluded)) {
            addArgumentToList("-packagesexcluded", mojo.packagesexcluded, argsList);
        }

        String metaAsJson = mojo.createTmpMetaJsonFile();
        if (!StringUtils.isNullOrEmpty(metaAsJson)) {
            addArgumentToList("-pathToMetaJson", "\"" + metaAsJson + "\"", argsList);
        }

        return argsList;
    }

    private String[] prepareExecutionCommand(
            List logArgs, List buildSessionArgs, String scannerJarPath) {

        List argsList = new ArrayList();

        argsList.add(mojo.javaPath);

        argsList.addAll(logArgs);
        //Disable upgrade process in build scanner since this plugin will do it.
        argsList.add("-Dsl.enableUpgrade=false");

        argsList.add("-jar");
        argsList.add(scannerJarPath);

        argsList.add("-scan");

        if (!StringUtils.isNullOrEmpty(mojo.token)){
            addArgumentToList("-token", mojo.token, argsList);
        }else{
            if (!StringUtils.isNullOrEmpty(mojo.customerid)) {
                addArgumentToList("-customerid", mojo.customerid, argsList);
            }

            if (!StringUtils.isNullOrEmpty(mojo.server)) {
                addArgumentToList("-server", mojo.server, argsList);
            }
        }

        if (!StringUtils.isNullOrEmpty(mojo.proxy)) {
            addArgumentToList("-proxy", mojo.proxy, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.workspacepath)) {
            addArgumentToList("-workspacepath", mojo.workspacepath, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.moduleName)) {
            addArgumentToList("-moduleName", mojo.moduleName, argsList);
        }


        if (!StringUtils.isNullOrEmpty(mojo.filesincluded)) {
            addArgumentToList("-filesincluded", mojo.filesincluded, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.filesexcluded)) {
            addArgumentToList("-filesexcluded", mojo.filesexcluded, argsList);
        }

        if (!StringUtils.isNullOrEmpty(mojo.baseSourceFolder)) {
            addArgumentToList("-baseSourceFolder", mojo.baseSourceFolder, argsList);
        }

        if (mojo.recursive) {
            argsList.add("-recursive");
        }

        if (mojo.enableNoneZeroErrorCode) {
            argsList.add("-enableNoneZeroErrorCode");
        }

        argsList.addAll(buildSessionArgs);

        String[] returnedArgs = new String[argsList.size()];
        returnedArgs = argsList.toArray(returnedArgs);

        return returnedArgs;
    }

    protected void addArgumentToList(String argName, String argVal, List args) {
        args.add(argName);
        args.add(argVal);
    }

    private void logCommandLine(String[] commandLine) {
        mojo.log.debug("------------SeaLights Build Scanner command line------------");
        for (String s : commandLine) {
            mojo.log.debug(s);
        }
        mojo.log.debug("------------SeaLights Build Scanner command line------------");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy