summaryrefslogtreecommitdiffstats
path: root/sonar-batch
diff options
context:
space:
mode:
authorEvgeny Mandrikov <mandrikov@gmail.com>2011-01-28 23:59:48 +0300
committerEvgeny Mandrikov <mandrikov@gmail.com>2011-01-29 00:42:29 +0300
commitdfbaa4c9d060f5dd32b0c49470d11d8cf51c50f7 (patch)
tree2aae714608edef95a2d46c178ea5d0ae92231d10 /sonar-batch
parent73e6ee80edae3e5f2a543df88776e1039b425462 (diff)
downloadsonarqube-dfbaa4c9d060f5dd32b0c49470d11d8cf51c50f7.tar.gz
sonarqube-dfbaa4c9d060f5dd32b0c49470d11d8cf51c50f7.zip
SONAR-1800: Fix issue with ClassLoader for Maven 3.x and Java 1.5
* Restore context ClassLoader after execution of Maven plugin. * Add abstract implementation of MavenPluginExecutor to reduce duplications in concrete implementations for different Maven versions.
Diffstat (limited to 'sonar-batch')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/AbstractMavenPluginExecutor.java50
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java43
2 files changed, 93 insertions, 0 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/AbstractMavenPluginExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/AbstractMavenPluginExecutor.java
new file mode 100644
index 00000000000..7e7bf73b28f
--- /dev/null
+++ b/sonar-batch/src/main/java/org/sonar/batch/AbstractMavenPluginExecutor.java
@@ -0,0 +1,50 @@
+package org.sonar.batch;
+
+import org.apache.maven.project.MavenProject;
+import org.sonar.api.batch.maven.MavenPlugin;
+import org.sonar.api.batch.maven.MavenPluginHandler;
+import org.sonar.api.resources.Project;
+import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.TimeProfiler;
+
+/**
+ * Abstract implementation of {@link MavenPluginExecutor} to reduce duplications in concrete implementations for different Maven versions.
+ */
+public abstract class AbstractMavenPluginExecutor implements MavenPluginExecutor {
+
+ public final MavenPluginHandler execute(Project project, MavenPluginHandler handler) {
+ for (String goal : handler.getGoals()) {
+ MavenPlugin plugin = MavenPlugin.getPlugin(project.getPom(), handler.getGroupId(), handler.getArtifactId());
+ execute(project, getGoal(handler.getGroupId(), handler.getArtifactId(), plugin.getPlugin().getVersion(), goal));
+ }
+ return handler;
+ }
+
+ public final void execute(Project project, String goal) {
+ TimeProfiler profiler = new TimeProfiler().start("Execute " + goal);
+ ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ concreteExecute(project.getPom(), goal);
+ } catch (Exception e) {
+ throw new SonarException("Unable to execute maven plugin", e);
+ } finally {
+ // Reset original ClassLoader that may have been changed during Maven Execution (see SONAR-1800)
+ Thread.currentThread().setContextClassLoader(currentClassLoader);
+ profiler.stop();
+ }
+ }
+
+ public abstract void concreteExecute(MavenProject pom, String goal) throws Exception;
+
+ static String getGoal(String groupId, String artifactId, String version, String goal) {
+ String defaultVersion = (version == null ? "" : version);
+ return new StringBuilder()
+ .append(groupId).append(":")
+ .append(artifactId).append(":")
+ .append(defaultVersion)
+ .append(":")
+ .append(goal)
+ .toString();
+ }
+
+}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java b/sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java
new file mode 100644
index 00000000000..e86516f0284
--- /dev/null
+++ b/sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java
@@ -0,0 +1,43 @@
+package org.sonar.batch;
+
+import org.junit.Test;
+import org.sonar.api.batch.maven.MavenPlugin;
+import org.sonar.api.batch.maven.MavenPluginHandler;
+import org.sonar.api.resources.Project;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class AbstractMavenPluginExecutorTest {
+
+ @Test
+ public void pluginVersionIsOptional() {
+ assertThat(AbstractMavenPluginExecutor.getGoal("group", "artifact", null, "goal"), is("group:artifact::goal"));
+ }
+
+ static class FakeCheckstyleMavenPluginHandler implements MavenPluginHandler {
+ public String getGroupId() {
+ return "org.apache.maven.plugins";
+ }
+
+ public String getArtifactId() {
+ return "maven-checkstyle-plugin";
+ }
+
+ public String getVersion() {
+ return "2.2";
+ }
+
+ public boolean isFixedVersion() {
+ return false;
+ }
+
+ public String[] getGoals() {
+ return new String[] { "checkstyle" };
+ }
+
+ public void configure(Project project, MavenPlugin plugin) {
+ }
+ }
+
+}