diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2013-06-24 11:53:07 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2013-06-24 12:09:16 +0200 |
commit | 08ce13911a8cd0ee89184f98bcc07597d01ecf35 (patch) | |
tree | d47106119a4b4a4b32aef55bb22b23e3ab32e047 /plugins/sonar-maven-batch-plugin/src | |
parent | 7c3abd3f7749ab7c332da92965f131d4ae80b178 (diff) | |
download | sonarqube-08ce13911a8cd0ee89184f98bcc07597d01ecf35.tar.gz sonarqube-08ce13911a8cd0ee89184f98bcc07597d01ecf35.zip |
SONAR-4433 New ProjectBootstrapper extension point
Diffstat (limited to 'plugins/sonar-maven-batch-plugin/src')
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenBatchPlugin.java | 2 | ||||
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectBootstrapper.java (renamed from plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/SonarMavenProjectBuilder.java) | 12 | ||||
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectConverter.java | 17 | ||||
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/package-info.java | 28 | ||||
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/MavenProjectConverterTest.java | 18 | ||||
-rw-r--r-- | plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/SonarMavenProjectBuilderTest.java | 29 |
6 files changed, 60 insertions, 46 deletions
diff --git a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenBatchPlugin.java b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenBatchPlugin.java index aac1e709fbf..a86881c6036 100644 --- a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenBatchPlugin.java +++ b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenBatchPlugin.java @@ -27,6 +27,6 @@ import java.util.List; public final class MavenBatchPlugin extends SonarPlugin { public List getExtensions() { - return ImmutableList.of(SonarMavenProjectBuilder.class, RealMavenPluginExecutor.class, MavenProjectConverter.class); + return ImmutableList.of(MavenProjectBootstrapper.class, RealMavenPluginExecutor.class, MavenProjectConverter.class); } } diff --git a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/SonarMavenProjectBuilder.java b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectBootstrapper.java index d2a648f71c3..48fbdb91058 100644 --- a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/SonarMavenProjectBuilder.java +++ b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectBootstrapper.java @@ -22,24 +22,24 @@ package org.sonar.plugins.maven; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.sonar.api.batch.SupportedEnvironment; -import org.sonar.api.batch.bootstrap.ProjectBuilder; -import org.sonar.api.batch.bootstrap.ProjectBuilderContext; +import org.sonar.api.batch.bootstrap.ProjectBootstrapper; +import org.sonar.api.batch.bootstrap.ProjectReactor; import java.util.List; @SupportedEnvironment("maven") -public class SonarMavenProjectBuilder extends ProjectBuilder { +public class MavenProjectBootstrapper extends ProjectBootstrapper { private MavenSession session; private MavenProjectConverter mavenProjectConverter; - public SonarMavenProjectBuilder(MavenSession session, MavenProjectConverter mavenProjectConverter) { + public MavenProjectBootstrapper(MavenSession session, MavenProjectConverter mavenProjectConverter) { this.session = session; this.mavenProjectConverter = mavenProjectConverter; } @Override - public void build(ProjectBuilderContext context) { + public ProjectReactor bootstrap() { // Don't use session.getTopLevelProject or session.getProjects to keep compatibility with Maven 2 List<MavenProject> sortedProjects = session.getSortedProjects(); MavenProject topLevelProject = null; @@ -49,7 +49,7 @@ public class SonarMavenProjectBuilder extends ProjectBuilder { break; } } - mavenProjectConverter.configure(context.getProjectReactor().getRoot(), sortedProjects, topLevelProject); + return new ProjectReactor(mavenProjectConverter.configure(sortedProjects, topLevelProject)); } } diff --git a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectConverter.java b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectConverter.java index 3e5a900e2a5..c6ac61c728d 100644 --- a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectConverter.java +++ b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/MavenProjectConverter.java @@ -29,11 +29,10 @@ import org.apache.maven.model.CiManagement; import org.apache.maven.model.IssueManagement; import org.apache.maven.model.Scm; import org.apache.maven.project.MavenProject; -import org.sonar.api.BatchExtension; import org.sonar.api.CoreProperties; -import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.batch.maven.MavenUtils; +import org.sonar.api.task.TaskExtension; import org.sonar.api.utils.SonarException; import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem; import org.sonar.java.api.JavaUtils; @@ -44,19 +43,12 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -@InstantiationStrategy(InstantiationStrategy.PER_BATCH) -public class MavenProjectConverter implements BatchExtension { +public class MavenProjectConverter implements TaskExtension { private static final String UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE = "Unable to determine structure of project." + " Probably you use Maven Advanced Reactor Options, which is not supported by Sonar and should not be used."; - public ProjectDefinition convert(List<MavenProject> poms, MavenProject root) { - ProjectDefinition def = ProjectDefinition.create(); - configure(def, poms, root); - return def; - } - - public void configure(ProjectDefinition rootProjectDefinition, List<MavenProject> poms, MavenProject root) { + public ProjectDefinition configure(List<MavenProject> poms, MavenProject root) { // projects by canonical path to pom.xml Map<String, MavenProject> paths = Maps.newHashMap(); Map<MavenProject, ProjectDefinition> defs = Maps.newHashMap(); @@ -64,7 +56,7 @@ public class MavenProjectConverter implements BatchExtension { try { for (MavenProject pom : poms) { paths.put(pom.getFile().getCanonicalPath(), pom); - ProjectDefinition def = pom == root ? rootProjectDefinition : ProjectDefinition.create(); + ProjectDefinition def = ProjectDefinition.create(); merge(pom, def); defs.put(pom, def); } @@ -95,6 +87,7 @@ public class MavenProjectConverter implements BatchExtension { if (rootProject == null) { throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE); } + return rootProject; } private static MavenProject findMavenProject(final File modulePath, Map<String, MavenProject> paths) throws IOException { diff --git a/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/package-info.java b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/package-info.java new file mode 100644 index 00000000000..2ba97cb031b --- /dev/null +++ b/plugins/sonar-maven-batch-plugin/src/main/java/org/sonar/plugins/maven/package-info.java @@ -0,0 +1,28 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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. + */ + +/** + * This package is a part of bootstrap process, so we should take care about backward compatibility. + */ +@ParametersAreNonnullByDefault +package org.sonar.plugins.maven; + +import javax.annotation.ParametersAreNonnullByDefault; + diff --git a/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/MavenProjectConverterTest.java b/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/MavenProjectConverterTest.java index 604a9bf82c1..4c25ec45c40 100644 --- a/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/MavenProjectConverterTest.java +++ b/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/MavenProjectConverterTest.java @@ -64,7 +64,7 @@ public class MavenProjectConverterTest { root.getModules().add("module/pom.xml"); try { - mavenProjectConverter.convert(Arrays.asList(root), root); + mavenProjectConverter.configure(Arrays.asList(root), root); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage(), containsString("Advanced Reactor Options")); @@ -84,7 +84,7 @@ public class MavenProjectConverterTest { module.setFile(new File(basedir, "module/pom.xml")); module.getBuild().setDirectory("target"); module.getBuild().setOutputDirectory("target/classes"); - ProjectDefinition project = mavenProjectConverter.convert(Arrays.asList(root, module), root); + ProjectDefinition project = mavenProjectConverter.configure(Arrays.asList(root, module), root); assertThat(project.getSubProjects().size(), is(1)); } @@ -124,7 +124,7 @@ public class MavenProjectConverterTest { MavenProject module1 = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/module1/pom.xml", false); MavenProject module2 = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/module2/pom.xml", false); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(parent, module1, module2), parent); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(parent, module1, module2), parent); assertThat(rootDef.getSubProjects().size(), Is.is(2)); assertThat(rootDef.getKey(), Is.is("org.test:parent")); @@ -145,7 +145,7 @@ public class MavenProjectConverterTest { MavenProject module1 = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/path1/pom.xml", false); MavenProject module2 = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/path2/pom.xml", false); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(parent, module1, module2), parent); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(parent, module1, module2), parent); assertThat(rootDef.getSubProjects().size(), is(2)); assertThat(rootDef.getKey(), is("org.test:parent")); @@ -165,7 +165,7 @@ public class MavenProjectConverterTest { MavenProject parent = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml", true); MavenProject module = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml", false); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(parent, module), parent); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(parent, module), parent); assertThat(rootDef.getSubProjects().size(), Is.is(1)); assertThat(rootDef.getKey(), Is.is("org.test:parent")); @@ -184,7 +184,7 @@ public class MavenProjectConverterTest { File rootDir = TestUtils.getResource("/org/sonar/plugins/maven/MavenProjectConverterTest/singleProjectWithoutModules/"); MavenProject pom = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/singleProjectWithoutModules/pom.xml", true); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(pom), pom); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(pom), pom); assertThat(rootDef.getKey(), is("org.test:parent")); assertThat(rootDef.getSubProjects().size(), is(0)); @@ -196,7 +196,7 @@ public class MavenProjectConverterTest { public void shouldConvertLinksToProperties() throws Exception { MavenProject pom = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/projectWithLinks/pom.xml", true); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(pom), pom); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(pom), pom); Properties props = rootDef.getProperties(); assertThat(props.getProperty(CoreProperties.LINKS_HOME_PAGE)).isEqualTo("http://home.com"); @@ -210,7 +210,7 @@ public class MavenProjectConverterTest { public void shouldNotConvertLinksToPropertiesIfPropertyAlreadyDefined() throws Exception { MavenProject pom = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/projectWithLinksAndProperties/pom.xml", true); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(pom), pom); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(pom), pom); Properties props = rootDef.getProperties(); @@ -228,7 +228,7 @@ public class MavenProjectConverterTest { public void shouldLoadSourceEncoding() throws Exception { MavenProject pom = loadPom("/org/sonar/plugins/maven/MavenProjectConverterTest/sourceEncoding/pom.xml", true); - ProjectDefinition rootDef = mavenProjectConverter.convert(Arrays.asList(pom), pom); + ProjectDefinition rootDef = mavenProjectConverter.configure(Arrays.asList(pom), pom); assertThat(rootDef.getProperties().getProperty(CoreProperties.ENCODING_PROPERTY)).isEqualTo("Shift_JIS"); } diff --git a/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/SonarMavenProjectBuilderTest.java b/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/SonarMavenProjectBuilderTest.java index d631b60e617..f99b4e32b47 100644 --- a/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/SonarMavenProjectBuilderTest.java +++ b/plugins/sonar-maven-batch-plugin/src/test/java/org/sonar/plugins/maven/SonarMavenProjectBuilderTest.java @@ -23,14 +23,13 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.sonar.api.batch.bootstrap.ProjectBuilderContext; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.bootstrap.ProjectReactor; import java.util.Arrays; import java.util.List; import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -46,17 +45,14 @@ public class SonarMavenProjectBuilderTest { when(session.getSortedProjects()).thenReturn(Arrays.asList(rootProject)); MavenProjectConverter mavenProjectConverter = mock(MavenProjectConverter.class); - SonarMavenProjectBuilder builder = new SonarMavenProjectBuilder(session, mavenProjectConverter); + ProjectDefinition projectDefinition = ProjectDefinition.create(); + when(mavenProjectConverter.configure(any(List.class), any(MavenProject.class))).thenReturn(projectDefinition); + MavenProjectBootstrapper builder = new MavenProjectBootstrapper(session, mavenProjectConverter); - ProjectBuilderContext context = mock(ProjectBuilderContext.class); - ProjectDefinition root = ProjectDefinition.create(); - ProjectReactor reactor = new ProjectReactor(root); - when(context.getProjectReactor()).thenReturn(reactor); - - builder.build(context); + assertThat(builder.bootstrap().getRoot()).isEqualTo(projectDefinition); ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class); - verify(mavenProjectConverter).configure(eq(root), argument.capture(), eq(rootProject)); + verify(mavenProjectConverter).configure(argument.capture(), eq(rootProject)); assertThat(argument.getValue()).contains(rootProject); } @@ -72,17 +68,14 @@ public class SonarMavenProjectBuilderTest { when(session.getSortedProjects()).thenReturn(Arrays.asList(module1, module2, rootProject)); MavenProjectConverter mavenProjectConverter = mock(MavenProjectConverter.class); - SonarMavenProjectBuilder builder = new SonarMavenProjectBuilder(session, mavenProjectConverter); - - ProjectBuilderContext context = mock(ProjectBuilderContext.class); - ProjectDefinition root = ProjectDefinition.create(); - ProjectReactor reactor = new ProjectReactor(root); - when(context.getProjectReactor()).thenReturn(reactor); + ProjectDefinition projectDefinition = ProjectDefinition.create(); + when(mavenProjectConverter.configure(any(List.class), any(MavenProject.class))).thenReturn(projectDefinition); + MavenProjectBootstrapper builder = new MavenProjectBootstrapper(session, mavenProjectConverter); - builder.build(context); + assertThat(builder.bootstrap().getRoot()).isEqualTo(projectDefinition); ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class); - verify(mavenProjectConverter).configure(eq(root), argument.capture(), eq(rootProject)); + verify(mavenProjectConverter).configure(argument.capture(), eq(rootProject)); assertThat(argument.getValue()).contains(module1, module2, rootProject); } |