diff options
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) { + } + } + +} |