diff options
author | Evgeny Mandrikov <mandrikov@gmail.com> | 2011-01-28 23:59:48 +0300 |
---|---|---|
committer | Evgeny Mandrikov <mandrikov@gmail.com> | 2011-01-29 00:42:29 +0300 |
commit | dfbaa4c9d060f5dd32b0c49470d11d8cf51c50f7 (patch) | |
tree | 2aae714608edef95a2d46c178ea5d0ae92231d10 /sonar-batch | |
parent | 73e6ee80edae3e5f2a543df88776e1039b425462 (diff) | |
download | sonarqube-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.java | 50 | ||||
-rw-r--r-- | sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java | 43 |
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) { + } + } + +} |