]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7647 Improve error log when there is a failure in a ProjectBuilder
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 7 Jul 2016 10:11:52 +0000 (12:11 +0200)
committerDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 7 Jul 2016 10:11:52 +0000 (12:11 +0200)
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectBuildersExecutor.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectBuildersExecutorTest.java [new file with mode: 0644]

index c7ba292f8769c222328515e97182ffa0ef75aec8..19fad3cfdfb972bc245a999832f3024db89df149 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.scanner.scan;
 
+import java.lang.reflect.Method;
+
 import org.sonar.api.batch.bootstrap.ProjectBuilder;
 import org.sonar.api.batch.bootstrap.ProjectReactor;
 import org.sonar.api.batch.bootstrap.internal.ProjectBuilderContext;
@@ -50,11 +52,28 @@ public class ProjectBuildersExecutor {
         try {
           projectBuilder.build(context);
         } catch (Exception e) {
-          throw MessageException.of("Failed to execute project builder: " + projectBuilder, e);
+          throw MessageException.of("Failed to execute project builder: " + getDescription(projectBuilder), e);
         }
       }
       profiler.stopInfo();
     }
+  }
 
+  private static String getDescription(ProjectBuilder projectBuilder) {
+    if (projectBuilder == null) {
+      return null;
+    }
+    Method toString;
+    try {
+      toString = projectBuilder.getClass().getMethod("toString");
+    } catch (Exception e) {
+      // should never happen as every class has toString
+      return projectBuilder.toString();
+    }
+    if (toString.getDeclaringClass() != Object.class) {
+      return projectBuilder.toString();
+    } else {
+      return projectBuilder.getClass().getName();
+    }
   }
 }
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectBuildersExecutorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectBuildersExecutorTest.java
new file mode 100644 (file)
index 0000000..960e0c2
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-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.scanner.scan;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.batch.bootstrap.ProjectBuilder;
+import org.sonar.api.batch.bootstrap.ProjectBuilder.Context;
+import org.sonar.api.batch.bootstrap.ProjectReactor;
+import org.sonar.api.utils.MessageException;
+
+public class ProjectBuildersExecutorTest {
+  private ProjectReactor reactor;
+
+  @Rule
+  public ExpectedException exception = ExpectedException.none();
+
+  @Before
+  public void setUp() {
+    reactor = mock(ProjectReactor.class);
+  }
+
+  @Test
+  public void testProjectBuilderFailsWithToString() {
+    ProjectBuilder builder = mock(ProjectBuilder.class);
+    doThrow(new IllegalStateException()).when(builder).build(any(Context.class));
+    ProjectBuilder[] projectBuilders = {builder};
+
+    exception.expectMessage("Failed to execute project builder: Mock for ProjectBuilder");
+    exception.expect(MessageException.class);
+    new ProjectBuildersExecutor(projectBuilders).execute(reactor);
+  }
+
+  @Test
+  public void testProjectBuilderFailsWithoutToString() {
+
+    ProjectBuilder[] projectBuilders = {new MyProjectBuilder()};
+
+    exception.expectMessage("Failed to execute project builder: org.sonar.scanner.scan.ProjectBuildersExecutorTest$MyProjectBuilder");
+    exception.expect(MessageException.class);
+    new ProjectBuildersExecutor(projectBuilders).execute(reactor);
+  }
+
+  class MyProjectBuilder extends ProjectBuilder {
+    @Override
+    public void build(Context context) {
+      throw new IllegalStateException();
+    }
+  }
+}