From 1d6a79e5221587c98f451b233b99eeea7d66f4d7 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Thu, 15 Sep 2016 16:24:36 +0200 Subject: SQSCANNER-23 Support the new 'MessageException' unchecked exception and log by default the error stack trace only when a non-MessageException is thrown --- src/main/java/org/sonarsource/scanner/cli/Cli.java | 12 ++----- .../java/org/sonarsource/scanner/cli/Main.java | 31 +++++++---------- .../utils/MessageException/MessageException.java | 26 ++++++++++++++ .../java/org/sonarsource/scanner/cli/CliTest.java | 8 +++-- .../java/org/sonarsource/scanner/cli/MainTest.java | 40 ++++++++++++++-------- 5 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 src/test/java/org/sonar/api/utils/MessageException/MessageException.java (limited to 'src') diff --git a/src/main/java/org/sonarsource/scanner/cli/Cli.java b/src/main/java/org/sonarsource/scanner/cli/Cli.java index 784f6c1..cdada21 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Cli.java +++ b/src/main/java/org/sonarsource/scanner/cli/Cli.java @@ -26,7 +26,6 @@ class Cli { private boolean debugEnabled = false; private boolean displayVersionOnly = false; - private boolean displayStackTrace = false; private final Properties props = new Properties(); private final Exit exit; private final Logs logger; @@ -44,10 +43,6 @@ class Cli { return displayVersionOnly; } - boolean isDisplayStackTrace() { - return displayStackTrace; - } - Properties properties() { return props; } @@ -66,10 +61,9 @@ class Cli { } else if ("-v".equals(arg) || "--version".equals(arg)) { displayVersionOnly = true; - + } else if ("-e".equals(arg) || "--errors".equals(arg)) { - displayStackTrace = true; - logger.setDisplayStackTrace(true); + logger.info("Option -e/--errors is no longer supported and will be ignored"); } else if ("-X".equals(arg) || "--debug".equals(arg)) { props.setProperty("sonar.verbose", "true"); @@ -100,7 +94,6 @@ class Cli { private void reset() { props.clear(); debugEnabled = false; - displayStackTrace = false; displayVersionOnly = false; } @@ -130,7 +123,6 @@ class Cli { logger.info(""); logger.info("Options:"); logger.info(" -D,--define Define property"); - logger.info(" -e,--errors Produce execution error messages"); logger.info(" -h,--help Display help information"); logger.info(" -v,--version Display version information"); logger.info(" -X,--debug Produce execution debug output"); diff --git a/src/main/java/org/sonarsource/scanner/cli/Main.java b/src/main/java/org/sonarsource/scanner/cli/Main.java index 4c26e90..b8b6e68 100644 --- a/src/main/java/org/sonarsource/scanner/cli/Main.java +++ b/src/main/java/org/sonarsource/scanner/cli/Main.java @@ -74,7 +74,7 @@ public class Main { runAnalysis(stats, p); } catch (Exception e) { displayExecutionResult(stats, "FAILURE"); - showError("Error during SonarQube Scanner execution", e, cli.isDisplayStackTrace() || cli.isDebugEnabled()); + showError("Error during SonarQube Scanner execution", e, cli.isDebugEnabled()); exit.exit(Exit.ERROR); } @@ -95,10 +95,6 @@ public class Main { exit.exit(Exit.SUCCESS); } - if (cli.isDisplayStackTrace()) { - logger.info("Error stacktraces are turned on."); - } - runner = runnerFactory.create(p); } @@ -109,10 +105,6 @@ public class Main { logger.setDebugEnabled(true); logger.setDisplayStackTrace(true); } - - if (cli.isDisplayStackTrace()) { - logger.setDisplayStackTrace(true); - } } private void runAnalysis(Stats stats, Properties p) { @@ -128,13 +120,9 @@ public class Main { logger.info(SEPARATOR); } - private void showError(String message, Throwable e, boolean showStackTrace) { - if (showStackTrace) { + private void showError(String message, Throwable e, boolean debug) { + if (showStackTrace(e, debug)) { logger.error(message, e); - if (!cli.isDebugEnabled()) { - logger.error(""); - suggestDebugMode(); - } } else { logger.error(message); if (e != null) { @@ -147,13 +135,18 @@ public class Main { previousMsg = cause.getMessage(); } } + } + + if (!cli.isDebugEnabled()) { logger.error(""); - logger.error("To see the full stack trace of the errors, re-run SonarQube Scanner with the -e switch."); - if (!cli.isDebugEnabled()) { - suggestDebugMode(); - } + suggestDebugMode(); } } + + private static boolean showStackTrace(Throwable e, boolean debug) { + // class not available at compile time (loaded by isolated classloader) + return debug || "org.sonar.api.utils.MessageException".equals(e.getClass().getName()); + } private void suggestDebugMode() { logger.error("Re-run SonarQube Scanner using the -X switch to enable full debug logging."); diff --git a/src/test/java/org/sonar/api/utils/MessageException/MessageException.java b/src/test/java/org/sonar/api/utils/MessageException/MessageException.java new file mode 100644 index 0000000..163fc0f --- /dev/null +++ b/src/test/java/org/sonar/api/utils/MessageException/MessageException.java @@ -0,0 +1,26 @@ +/* + * SonarQube Scanner + * Copyright (C) 2011-2016 SonarSource SA + * mailto:contact 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.sonar.api.utils.MessageException; + +public class MessageException extends RuntimeException { + public MessageException(String msg) { + super(msg); + } +} diff --git a/src/test/java/org/sonarsource/scanner/cli/CliTest.java b/src/test/java/org/sonarsource/scanner/cli/CliTest.java index 840f35b..640ca8d 100644 --- a/src/test/java/org/sonarsource/scanner/cli/CliTest.java +++ b/src/test/java/org/sonarsource/scanner/cli/CliTest.java @@ -35,7 +35,6 @@ public class CliTest { cli.parse(new String[0]); assertThat(cli.properties()).isNotEmpty(); assertThat(cli.isDebugEnabled()).isFalse(); - assertThat(cli.isDisplayStackTrace()).isFalse(); assertThat(cli.isDisplayVersionOnly()).isFalse(); } @@ -47,6 +46,11 @@ public class CliTest { assertThat(cli.properties().get("boolean")).isEqualTo("true"); } + @Test + public void should_not_fail_with_errors_option() { + cli.parse(new String[] {"-e"}); + } + @Test public void should_parse_optional_task() { cli.parse(new String[] {"-D", "foo=bar"}); @@ -67,7 +71,6 @@ public class CliTest { public void should_enable_stacktrace_log() { cli.parse(new String[] {"-e"}); assertThat(cli.isDebugEnabled()).isFalse(); - assertThat(cli.isDisplayStackTrace()).isTrue(); assertThat(cli.properties().get("sonar.verbose")).isNull(); } @@ -75,7 +78,6 @@ public class CliTest { public void should_disable_debug_mode_and_stacktrace_log_by_default() { cli.parse(new String[0]); assertThat(cli.isDebugEnabled()).isFalse(); - assertThat(cli.isDisplayStackTrace()).isFalse(); assertThat(cli.properties().get("sonar.verbose")).isNull(); } diff --git a/src/test/java/org/sonarsource/scanner/cli/MainTest.java b/src/test/java/org/sonarsource/scanner/cli/MainTest.java index 450d0a7..dc4b77d 100644 --- a/src/test/java/org/sonarsource/scanner/cli/MainTest.java +++ b/src/test/java/org/sonarsource/scanner/cli/MainTest.java @@ -28,6 +28,7 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.sonar.api.utils.MessageException.MessageException; import org.sonarsource.scanner.api.EmbeddedScanner; import org.sonarsource.scanner.api.ScanProperties; @@ -95,33 +96,34 @@ public class MainTest { } @Test - public void show_error_stacktrace() { - Exception e = show_error(false, true); - verify(logs).error("Error during SonarQube Scanner execution", e); + public void show_error() { + Exception e = createException(false, false); + testException(e, false); + + verify(logs).error("Error during SonarQube Scanner execution"); verify(logs).error("Re-run SonarQube Scanner using the -X switch to enable full debug logging."); } @Test - public void show_error_debug() { - Exception e = show_error(true, false); + public void show_error_MessageException() { + Exception e = createException(false, true); + testException(e, false); - verify(logs).error("Error during SonarQube Scanner execution", e); - verify(logs, never()).error("Re-run SonarQube Scanner using the -X switch to enable full debug logging."); + verify(logs).error("Error during SonarQube Scanner execution"); + verify(logs).error("Re-run SonarQube Scanner using the -X switch to enable full debug logging."); } @Test - public void show_error_debug_stack() { - Exception e = show_error(true, true); + public void show_error_debug() { + Exception e = createException(true, false); + testException(e, true); verify(logs).error("Error during SonarQube Scanner execution", e); verify(logs, never()).error("Re-run SonarQube Scanner using the -X switch to enable full debug logging."); } - private Exception show_error(boolean debugEnabled, boolean stackTraceEnabled) { - Exception e = new NullPointerException("NPE"); - e = new IllegalStateException("Error", e); + private void testException(Exception e, boolean debugEnabled) { when(cli.isDebugEnabled()).thenReturn(debugEnabled); - when(cli.isDisplayStackTrace()).thenReturn(stackTraceEnabled); EmbeddedScanner runner = mock(EmbeddedScanner.class); doThrow(e).when(runner).runAnalysis(any(Properties.class)); @@ -132,6 +134,16 @@ public class MainTest { verify(runner).stop(); verify(exit).exit(Exit.ERROR); + } + + private Exception createException(boolean debugEnabled, boolean messageException) { + Exception e; + if (messageException) { + e = new MessageException("my message"); + } else { + e = new IllegalStateException("Error", new NullPointerException("NPE")); + } + return e; } @@ -151,7 +163,7 @@ public class MainTest { inOrder.verify(runnerFactory, times(1)).create(p); inOrder.verify(exit, times(1)).exit(Exit.SUCCESS); } - + @Test public void should_skip() throws IOException { Properties p = new Properties(); -- cgit v1.2.3