]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1800: Fix issue with ClassLoader for Maven 3.x and Java 1.5
authorEvgeny Mandrikov <mandrikov@gmail.com>
Fri, 28 Jan 2011 20:59:48 +0000 (23:59 +0300)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Fri, 28 Jan 2011 21:42:29 +0000 (00:42 +0300)
* Restore context ClassLoader after execution of Maven plugin.

* Add abstract implementation of MavenPluginExecutor to reduce duplications
  in concrete implementations for different Maven versions.

sonar-batch/src/main/java/org/sonar/batch/AbstractMavenPluginExecutor.java [new file with mode: 0644]
sonar-batch/src/test/java/org/sonar/batch/AbstractMavenPluginExecutorTest.java [new file with mode: 0644]
sonar-core-maven-plugin/src/main/java/org/sonar/maven2/Maven2PluginExecutor.java
sonar-core-maven-plugin/src/test/java/org/sonar/maven2/Maven2PluginExecutorTest.java [deleted file]
sonar-maven-plugin/src/main/java/org/sonar/maven/Maven2PluginExecutor.java
sonar-maven3-plugin/src/main/java/org/sonar/maven3/Maven3PluginExecutor.java

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 (file)
index 0000000..7e7bf73
--- /dev/null
@@ -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 (file)
index 0000000..e86516f
--- /dev/null
@@ -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) {
+    }
+  }
+
+}
index 858f2e52a952fbc5d8408530388bbedcd4021741..3e0099a4a94652c7503ee9088442531904bc6d19 100644 (file)
  */
 package org.sonar.maven2;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.ReactorManager;
 import org.apache.maven.lifecycle.LifecycleExecutor;
-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.batch.MavenPluginExecutor;
+import org.apache.maven.project.MavenProject;
+import org.sonar.batch.AbstractMavenPluginExecutor;
 
 import java.util.Arrays;
 
-public class Maven2PluginExecutor implements MavenPluginExecutor {
+public class Maven2PluginExecutor extends AbstractMavenPluginExecutor {
 
   private LifecycleExecutor lifecycleExecutor;
   private MavenSession mavenSession;
@@ -41,18 +37,10 @@ public class Maven2PluginExecutor implements MavenPluginExecutor {
     this.mavenSession = mavenSession;
   }
 
-  public 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 void execute(Project project, String goal) {
-    try {
-      ReactorManager reactor = new ReactorManager(Arrays.asList(project.getPom()));
-      MavenSession clonedSession = new MavenSession(mavenSession.getContainer(),
+  @Override
+  public void concreteExecute(MavenProject pom, String goal) throws Exception {
+    ReactorManager reactor = new ReactorManager(Arrays.asList(pom));
+    MavenSession clonedSession = new MavenSession(mavenSession.getContainer(),
           mavenSession.getSettings(),
           mavenSession.getLocalRepository(),
           mavenSession.getEventDispatcher(),
@@ -60,22 +48,8 @@ public class Maven2PluginExecutor implements MavenPluginExecutor {
           Arrays.asList(goal),
           mavenSession.getExecutionRootDirectory(),
           mavenSession.getExecutionProperties(),
-          mavenSession.getStartTime()
-      );
-      lifecycleExecutor.execute(clonedSession, reactor, clonedSession.getEventDispatcher());
-
-    } catch (Exception e) {
-      throw new SonarException("Unable to execute maven plugin", e);
-
-    }
+          mavenSession.getStartTime());
+    lifecycleExecutor.execute(clonedSession, reactor, clonedSession.getEventDispatcher());
   }
 
-  protected static String getGoal(String groupId, String artifactId, String version, String goal) {
-    return new StringBuilder()
-        .append(groupId).append(":")
-        .append(artifactId).append(":")
-        .append(StringUtils.defaultString(version, "")).append(":")
-        .append(goal)
-        .toString();
-  }
 }
diff --git a/sonar-core-maven-plugin/src/test/java/org/sonar/maven2/Maven2PluginExecutorTest.java b/sonar-core-maven-plugin/src/test/java/org/sonar/maven2/Maven2PluginExecutorTest.java
deleted file mode 100644 (file)
index f59f98d..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2009 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar 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.
- *
- * Sonar 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 Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
- */
-package org.sonar.maven2;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import org.junit.Test;
-import org.sonar.api.batch.maven.MavenPlugin;
-import org.sonar.api.batch.maven.MavenPluginHandler;
-import org.sonar.api.resources.Project;
-
-public class Maven2PluginExecutorTest {
-
-  @Test
-  public void pluginVersionIsOptional() {
-    assertThat(Maven2PluginExecutor.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) {
-
-    }
-  }
-}
index e39a64415d6655b80df83beb395be08f8a57a817..c39c4ebedd26341fee89d0cda5451f1cbb6a9a87 100644 (file)
@@ -22,15 +22,12 @@ package org.sonar.maven;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.ReactorManager;
 import org.apache.maven.lifecycle.LifecycleExecutor;
-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.batch.MavenPluginExecutor;
+import org.apache.maven.project.MavenProject;
+import org.sonar.batch.AbstractMavenPluginExecutor;
 
 import java.util.Arrays;
 
-public class Maven2PluginExecutor implements MavenPluginExecutor {
+public class Maven2PluginExecutor extends AbstractMavenPluginExecutor {
 
   private LifecycleExecutor lifecycleExecutor;
   private MavenSession mavenSession;
@@ -40,43 +37,19 @@ public class Maven2PluginExecutor implements MavenPluginExecutor {
     this.mavenSession = mavenSession;
   }
 
-  public 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;
+  @Override
+  public void concreteExecute(MavenProject pom, String goal) throws Exception {
+    ReactorManager reactor = new ReactorManager(Arrays.asList(pom));
+    MavenSession clonedSession = new MavenSession(mavenSession.getContainer(),
+        mavenSession.getSettings(),
+        mavenSession.getLocalRepository(),
+        mavenSession.getEventDispatcher(),
+        reactor,
+        Arrays.asList(goal),
+        mavenSession.getExecutionRootDirectory(),
+        mavenSession.getExecutionProperties(),
+        mavenSession.getStartTime());
+    lifecycleExecutor.execute(clonedSession, reactor, clonedSession.getEventDispatcher());
   }
 
-  public void execute(Project project, String goal) {
-    try {
-      ReactorManager reactor = new ReactorManager(Arrays.asList(project.getPom()));
-      MavenSession clonedSession = new MavenSession(mavenSession.getContainer(),
-          mavenSession.getSettings(),
-          mavenSession.getLocalRepository(),
-          mavenSession.getEventDispatcher(),
-          reactor,
-          Arrays.asList(goal),
-          mavenSession.getExecutionRootDirectory(),
-          mavenSession.getExecutionProperties(),
-          mavenSession.getStartTime()
-      );
-      lifecycleExecutor.execute(clonedSession, reactor, clonedSession.getEventDispatcher());
-
-    } catch (Exception e) {
-      throw new SonarException("Unable to execute maven plugin", e);
-
-    }
-  }
-
-  protected 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();
-  }
 }
index b72710b13f965efa2b6cc47cc519eded075bbfa9..31fdb5f875be2de1f19b7c2673606015f1cfdb96 100644 (file)
@@ -21,16 +21,12 @@ package org.sonar.maven3;
 
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.lifecycle.LifecycleExecutor;
-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;
-import org.sonar.batch.MavenPluginExecutor;
+import org.apache.maven.project.MavenProject;
+import org.sonar.batch.AbstractMavenPluginExecutor;
 
 import java.util.Arrays;
 
-public class Maven3PluginExecutor implements MavenPluginExecutor {
+public class Maven3PluginExecutor extends AbstractMavenPluginExecutor {
 
   private LifecycleExecutor lifecycleExecutor;
   private MavenSession mavenSession;
@@ -40,42 +36,16 @@ public class Maven3PluginExecutor implements MavenPluginExecutor {
     this.mavenSession = mavenSession;
   }
 
-  public 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;
+  @Override
+  public void concreteExecute(MavenProject pom, String goal) {
+    MavenSession projectSession = mavenSession.clone();
+    projectSession.setCurrentProject(pom);
+    projectSession.setProjects(Arrays.asList(pom));
+    projectSession.getRequest().setRecursive(false);
+    projectSession.getRequest().setPom(pom.getFile());
+    projectSession.getRequest().setGoals(Arrays.asList(goal));
+    projectSession.getRequest().setInteractiveMode(false);
+    lifecycleExecutor.execute(projectSession);
   }
 
-  public void execute(Project project, String goalOrPhase) {
-    TimeProfiler profiler = new TimeProfiler().start("Execute " + goalOrPhase);
-    try {
-      MavenSession projectSession = mavenSession.clone();
-      projectSession.setCurrentProject(project.getPom());
-      projectSession.setProjects(Arrays.asList(project.getPom()));
-      projectSession.getRequest().setRecursive(false);
-      projectSession.getRequest().setPom(project.getPom().getFile());
-      projectSession.getRequest().setGoals(Arrays.asList(goalOrPhase));
-      projectSession.getRequest().setInteractiveMode(false);
-      lifecycleExecutor.execute(projectSession);
-
-    } catch (Exception e) {
-      throw new SonarException("Unable to execute maven plugin", e);
-
-    } finally {
-      profiler.stop();
-    }
-  }
-
-  protected 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();
-  }
 }