From b04cd6ba08a93a88553c1dfceaa725ced1ba381c Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Tue, 30 Apr 2024 14:59:03 +0200 Subject: SCANCLI-145 Update to the scanner library 3.0 --- src/main/java/org/sonarsource/scanner/cli/Cli.java | 6 +- .../java/org/sonarsource/scanner/cli/Conf.java | 6 +- .../java/org/sonarsource/scanner/cli/Logs.java | 34 +++++++++++ .../java/org/sonarsource/scanner/cli/Main.java | 52 +++++++---------- .../cli/ScannerEngineBootstrapperFactory.java | 51 ++++++++++++++++ .../sonarsource/scanner/cli/ScannerFactory.java | 67 ---------------------- 6 files changed, 111 insertions(+), 105 deletions(-) create mode 100644 src/main/java/org/sonarsource/scanner/cli/ScannerEngineBootstrapperFactory.java delete mode 100644 src/main/java/org/sonarsource/scanner/cli/ScannerFactory.java (limited to 'src/main') diff --git a/src/main/java/org/sonarsource/scanner/cli/Cli.java b/src/main/java/org/sonarsource/scanner/cli/Cli.java index aafed18..4de2a36 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Cli.java +++ b/src/main/java/org/sonarsource/scanner/cli/Cli.java @@ -20,7 +20,6 @@ package org.sonarsource.scanner.cli; import java.util.Properties; -import org.sonarsource.scanner.api.ScannerProperties; import static java.util.Arrays.asList; @@ -73,10 +72,7 @@ class Cli { private int processNextArg(String[] args, int pos) { String arg = args[pos]; - if (pos == 0 && arg.charAt(0) != '-') { - props.setProperty(ScannerProperties.TASK, arg); - - } else if (asList("-h", "--help").contains(arg)) { + if (asList("-h", "--help").contains(arg)) { printUsage(); exit.exit(Exit.SUCCESS); diff --git a/src/main/java/org/sonarsource/scanner/cli/Conf.java b/src/main/java/org/sonarsource/scanner/cli/Conf.java index 19b020e..4e9a53a 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Conf.java +++ b/src/main/java/org/sonarsource/scanner/cli/Conf.java @@ -31,7 +31,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; import javax.annotation.Nullable; -import org.sonarsource.scanner.api.Utils; +import org.sonarsource.scanner.lib.EnvironmentConfig; class Conf { private static final String SCANNER_HOME = "scanner.home"; @@ -79,8 +79,8 @@ class Conf { return resolver.resolve(); } - private Properties loadEnvironmentProperties() { - return Utils.loadEnvironmentProperties(env); + private Map loadEnvironmentProperties() { + return EnvironmentConfig.load(logger.getLogOutputAdapter()); } private Properties loadGlobalProperties() { diff --git a/src/main/java/org/sonarsource/scanner/cli/Logs.java b/src/main/java/org/sonarsource/scanner/cli/Logs.java index 038e78f..f8b4ce3 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Logs.java +++ b/src/main/java/org/sonarsource/scanner/cli/Logs.java @@ -22,6 +22,7 @@ package org.sonarsource.scanner.cli; import java.io.PrintStream; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import org.sonarsource.scanner.lib.LogOutput; public class Logs { private DateTimeFormatter timeFormatter; @@ -77,4 +78,37 @@ public class Logs { stream.println(msg); } } + + /** + * Adapter for the scanner library. + */ + public LogOutput getLogOutputAdapter() { + return new LogOutputAdapter(this); + } + + static class LogOutputAdapter implements LogOutput { + private final Logs logs; + + public LogOutputAdapter(Logs logs) { + this.logs = logs; + } + + @Override + public void log(String formattedMessage, Level level) { + switch (level) { + case TRACE, DEBUG: + logs.debug(formattedMessage); + break; + case ERROR: + logs.error(formattedMessage); + break; + case WARN: + logs.warn(formattedMessage); + break; + case INFO: + default: + logs.info(formattedMessage); + } + } + } } diff --git a/src/main/java/org/sonarsource/scanner/cli/Main.java b/src/main/java/org/sonarsource/scanner/cli/Main.java index ff7f96f..787cc80 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Main.java +++ b/src/main/java/org/sonarsource/scanner/cli/Main.java @@ -19,11 +19,11 @@ */ package org.sonarsource.scanner.cli; -import java.util.Locale; import java.util.Map; import java.util.Properties; -import org.sonarsource.scanner.api.EmbeddedScanner; -import org.sonarsource.scanner.api.ScanProperties; +import org.sonarsource.scanner.lib.ScanProperties; +import org.sonarsource.scanner.lib.ScannerEngineBootstrapper; +import org.sonarsource.scanner.lib.ScannerEngineFacade; /** * Arguments : @@ -42,15 +42,15 @@ public class Main { private final Exit exit; private final Cli cli; private final Conf conf; - private EmbeddedScanner embeddedScanner; - private final ScannerFactory runnerFactory; + private ScannerEngineBootstrapper scannerEngineBootstrapper; + private final ScannerEngineBootstrapperFactory bootstrapperFactory; private final Logs logger; - Main(Exit exit, Cli cli, Conf conf, ScannerFactory runnerFactory, Logs logger) { + Main(Exit exit, Cli cli, Conf conf, ScannerEngineBootstrapperFactory bootstrapperFactory, Logs logger) { this.exit = exit; this.cli = cli; this.conf = conf; - this.runnerFactory = runnerFactory; + this.bootstrapperFactory = bootstrapperFactory; this.logger = logger; } @@ -58,11 +58,11 @@ public class Main { Logs logs = new Logs(System.out, System.err); Exit exit = new Exit(); Cli cli = new Cli(exit, logs).parse(args); - Main main = new Main(exit, cli, new Conf(cli, logs, System.getenv()), new ScannerFactory(logs), logs); - main.execute(); + Main main = new Main(exit, cli, new Conf(cli, logs, System.getenv()), new ScannerEngineBootstrapperFactory(logs), logs); + main.analyze(); } - void execute() { + void analyze() { Stats stats = new Stats(logger).start(); int status = Exit.INTERNAL_ERROR; @@ -71,15 +71,12 @@ public class Main { checkSkip(p); configureLogging(p); init(p); - embeddedScanner.start(); - if (isSonarCloud(p)) { - logger.info("Analyzing on SonarCloud"); - } else { - String serverVersion = embeddedScanner.serverVersion(); - logger.info(String.format("Analyzing on SonarQube server %s", serverVersion)); + try (var engine = scannerEngineBootstrapper.bootstrap()) { + logServerType(engine); + engine.analyze((Map) p); + displayExecutionResult(stats, "SUCCESS"); + status = Exit.SUCCESS; } - execute(stats, p); - status = Exit.SUCCESS; } catch (Throwable e) { displayExecutionResult(stats, "FAILURE"); showError("Error during SonarScanner execution", e, cli.isDebugEnabled()); @@ -89,13 +86,13 @@ public class Main { } } - static boolean isSonarCloud(Properties props) { - String hostUrl = props.getProperty(Conf.PROPERTY_SONAR_HOST_URL); - if (hostUrl != null) { - return hostUrl.toLowerCase(Locale.ENGLISH).contains("sonarcloud"); + private void logServerType(ScannerEngineFacade engine) { + if (engine.isSonarCloud()) { + logger.info("Analyzing on SonarCloud"); + } else { + String serverVersion = engine.getServerVersion(); + logger.info(String.format("Analyzing on SonarQube server %s", serverVersion)); } - - return false; } private void checkSkip(Properties properties) { @@ -111,7 +108,7 @@ public class Main { exit.exit(Exit.SUCCESS); } - embeddedScanner = runnerFactory.create(p, cli.getInvokedFrom()); + scannerEngineBootstrapper = bootstrapperFactory.create(p, cli.getInvokedFrom()); } private void configureLogging(Properties props) { @@ -122,11 +119,6 @@ public class Main { } } - private void execute(Stats stats, Properties p) { - embeddedScanner.execute((Map) p); - displayExecutionResult(stats, "SUCCESS"); - } - private void displayExecutionResult(Stats stats, String resultMsg) { logger.info(SEPARATOR); logger.info("EXECUTION " + resultMsg); diff --git a/src/main/java/org/sonarsource/scanner/cli/ScannerEngineBootstrapperFactory.java b/src/main/java/org/sonarsource/scanner/cli/ScannerEngineBootstrapperFactory.java new file mode 100644 index 0000000..b67254c --- /dev/null +++ b/src/main/java/org/sonarsource/scanner/cli/ScannerEngineBootstrapperFactory.java @@ -0,0 +1,51 @@ +/* + * SonarScanner CLI + * Copyright (C) 2011-2024 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonarsource.scanner.cli; + +import java.util.Map; +import java.util.Properties; +import org.sonarsource.scanner.lib.ScannerEngineBootstrapper; + +class ScannerEngineBootstrapperFactory { + + private final Logs logger; + + public ScannerEngineBootstrapperFactory(Logs logger) { + this.logger = logger; + } + + ScannerEngineBootstrapper create(Properties props, String isInvokedFrom) { + String appName = "ScannerCLI"; + String appVersion = ScannerVersion.version(); + if (isInvokedFrom.contains("/")) { + appName = isInvokedFrom.split("/")[0]; + appVersion = isInvokedFrom.split("/")[1]; + } + + return newScannerEngineBootstrapper(appName, appVersion) + .addBootstrapProperties((Map) props); + } + + ScannerEngineBootstrapper newScannerEngineBootstrapper(String appName, String appVersion) { + return new ScannerEngineBootstrapper(appName, appVersion, logger.getLogOutputAdapter()); + } + + +} diff --git a/src/main/java/org/sonarsource/scanner/cli/ScannerFactory.java b/src/main/java/org/sonarsource/scanner/cli/ScannerFactory.java deleted file mode 100644 index d27165e..0000000 --- a/src/main/java/org/sonarsource/scanner/cli/ScannerFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SonarScanner CLI - * Copyright (C) 2011-2024 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonarsource.scanner.cli; - -import java.util.Map; -import java.util.Properties; -import org.sonarsource.scanner.api.EmbeddedScanner; -import org.sonarsource.scanner.api.LogOutput; - -class ScannerFactory { - - private final Logs logger; - - public ScannerFactory(Logs logger) { - this.logger = logger; - } - - EmbeddedScanner create(Properties props, String isInvokedFrom) { - String appName = "ScannerCLI"; - String appVersion = ScannerVersion.version(); - if (!isInvokedFrom.equals("") && isInvokedFrom.contains("/")) { - appName = isInvokedFrom.split("/")[0]; - appVersion = isInvokedFrom.split("/")[1]; - } - - return EmbeddedScanner.create(appName, appVersion, new DefaultLogOutput()) - .addGlobalProperties((Map) props); - } - - class DefaultLogOutput implements LogOutput { - @Override - public void log(String formattedMessage, Level level) { - switch (level) { - case TRACE: - case DEBUG: - logger.debug(formattedMessage); - break; - case ERROR: - logger.error(formattedMessage); - break; - case WARN: - logger.warn(formattedMessage); - break; - case INFO: - default: - logger.info(formattedMessage); - } - } - } -} -- cgit v1.2.3