
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