From 3944edc8c87616e7b41daac6beefaa39bb9ce004 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Wed, 16 Jan 2013 11:36:24 +0100 Subject: [PATCH] SONAR-4069 Refactoring to fix issues with ProjectBuilder --- .../batch/bootstrap/AbstractTaskModule.java | 1 + .../batch/bootstrap/AnalyseProjectModule.java | 67 ------------------- .../batch/bootstrap/ExtensionInstaller.java | 15 ++++- .../sonar/batch/bootstrap/MetricProvider.java | 6 +- .../org/sonar/batch/bootstrap/Module.java | 2 +- .../batch/bootstrap/ProjectTaskModule.java | 1 + .../batch/bootstrap/TaskBootstrapModule.java | 6 +- .../InspectionModule.java} | 18 ++--- ...ion.java => InspectionTaskDefinition.java} | 4 +- ...cutor.java => InspectionTaskExecutor.java} | 22 ++++-- ...eTest.java => AbstractTaskModuleTest.java} | 27 ++++++-- .../bootstrap/ExtensionInstallerTest.java | 4 +- ...uleTest.java => InspectionModuleTest.java} | 11 ++- .../api/batch/bootstrap/ProjectBuilder.java | 8 +-- 14 files changed, 82 insertions(+), 110 deletions(-) delete mode 100644 sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java rename sonar-batch/src/main/java/org/sonar/batch/{bootstrap/ProjectModule.java => tasks/InspectionModule.java} (90%) rename sonar-batch/src/main/java/org/sonar/batch/tasks/{AnalyseProjectTaskDefinition.java => InspectionTaskDefinition.java} (92%) rename sonar-batch/src/main/java/org/sonar/batch/tasks/{AnalyseProjectTaskExecutor.java => InspectionTaskExecutor.java} (72%) rename sonar-batch/src/test/java/org/sonar/batch/bootstrap/{AnalyseProjectModuleTest.java => AbstractTaskModuleTest.java} (61%) rename sonar-batch/src/test/java/org/sonar/batch/bootstrap/{ProjectModuleTest.java => InspectionModuleTest.java} (86%) diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java index e01292dc88f..68562377449 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java @@ -109,6 +109,7 @@ public abstract class AbstractTaskModule extends Module { container.addSingleton(DefaultUserFinder.class); container.addSingleton(ResourceTypes.class); container.addSingleton(SemaphoresImpl.class); + container.addSingleton(MetricProvider.class); } private void registerDatabaseComponents() { diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java deleted file mode 100644 index 8257522b12b..00000000000 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * 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.batch.bootstrap; - -import org.sonar.api.batch.InstantiationStrategy; -import org.sonar.api.resources.Project; - -public class AnalyseProjectModule extends Module { - - private Project rootProject; - - public AnalyseProjectModule(Project rootProject) { - this.rootProject = rootProject; - } - - @Override - protected void configure() { - container.addSingleton(MetricProvider.class); - - registerPerBatchExtensions(); - } - - private void registerPerBatchExtensions() { - ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class); - installer.installBatchExtensions(container, InstantiationStrategy.PER_BATCH); - } - - /** - * Analyze project - */ - @Override - protected void doStart() { - analyze(rootProject); - } - - private void analyze(Project project) { - for (Project subProject : project.getModules()) { - analyze(subProject); - } - - ProjectModule projectModule = new ProjectModule(project); - try { - installChild(projectModule); - projectModule.start(); - } finally { - projectModule.stop(); - uninstallChild(); - } - } -} diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java index 396a60841d3..f34fe6276b7 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java @@ -19,6 +19,7 @@ */ package org.sonar.batch.bootstrap; +import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.BatchComponent; @@ -99,6 +100,7 @@ public class ExtensionInstaller implements BatchComponent { } public void installTaskExtensions(ComponentContainer container, boolean projectPresent) { + boolean dryRun = settings.getBoolean(CoreProperties.DRY_RUN); for (Map.Entry entry : pluginRepository.getPluginsByMetadata().entrySet()) { PluginMetadata metadata = entry.getKey(); Plugin plugin = entry.getValue(); @@ -106,12 +108,18 @@ public class ExtensionInstaller implements BatchComponent { container.addExtension(metadata, plugin); for (Object extension : plugin.getExtensions()) { installTaskExtension(container, metadata, extension, projectPresent); + if (projectPresent) { + installBatchExtension(container, metadata, extension, dryRun, InstantiationStrategy.PER_BATCH); + } } } List providers = container.getComponentsByType(ExtensionProvider.class); for (ExtensionProvider provider : providers) { executeTaskExtensionProvider(container, provider, projectPresent); + if (projectPresent) { + executeBatchExtensionProvider(container, InstantiationStrategy.PER_BATCH, dryRun, provider); + } } } @@ -146,7 +154,12 @@ public class ExtensionInstaller implements BatchComponent { return installed; } - public void installBatchExtensions(ComponentContainer container, String instantiationStrategy) { + public void installInspectionExtensions(ComponentContainer container) { + installBatchExtensions(container, InstantiationStrategy.PER_PROJECT); + } + + @VisibleForTesting + void installBatchExtensions(ComponentContainer container, String instantiationStrategy) { boolean dryRun = settings.getBoolean(CoreProperties.DRY_RUN); for (Map.Entry entry : pluginRepository.getPluginsByMetadata().entrySet()) { PluginMetadata metadata = entry.getKey(); diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java index 9df02c89559..0cf3af16bc2 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java @@ -21,17 +21,15 @@ package org.sonar.batch.bootstrap; import com.google.common.collect.Lists; import org.slf4j.LoggerFactory; -import org.sonar.api.BatchExtension; import org.sonar.api.ExtensionProvider; -import org.sonar.api.batch.InstantiationStrategy; +import org.sonar.api.TaskExtension; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metrics; import java.util.List; -@InstantiationStrategy(InstantiationStrategy.PER_BATCH) -public class MetricProvider extends ExtensionProvider implements BatchExtension { +public class MetricProvider extends ExtensionProvider implements TaskExtension { private Metrics[] factories; diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Module.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Module.java index 0b3bfb9c2d3..39398129bdd 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Module.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Module.java @@ -28,7 +28,7 @@ import org.sonar.api.platform.ComponentContainer; */ public abstract class Module { - ComponentContainer container; + protected ComponentContainer container; /** * @return this diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskModule.java index 124ac8b70bd..ab727f40fc8 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskModule.java @@ -48,4 +48,5 @@ public class ProjectTaskModule extends AbstractTaskModule { container.addSingleton(DryRunDatabase.class); } + } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskBootstrapModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskBootstrapModule.java index 57393008adf..d4489222d3e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskBootstrapModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskBootstrapModule.java @@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.batch.TaskDefinition; import org.sonar.api.batch.bootstrap.ProjectReactor; import org.sonar.api.utils.SonarException; -import org.sonar.batch.tasks.AnalyseProjectTaskDefinition; +import org.sonar.batch.tasks.InspectionTaskDefinition; import org.sonar.batch.tasks.ListTaskDefinition; import org.sonar.batch.tasks.TaskManager; @@ -46,7 +46,7 @@ public class TaskBootstrapModule extends Module { } private void registerCoreTaskDefinitions() { - container.addSingleton(AnalyseProjectTaskDefinition.class); + container.addSingleton(InspectionTaskDefinition.class); container.addSingleton(ListTaskDefinition.class); } @@ -57,7 +57,7 @@ public class TaskBootstrapModule extends Module { @Override protected void doStart() { - String command = StringUtils.isNotBlank(taskCommand) ? taskCommand : AnalyseProjectTaskDefinition.COMMAND; + String command = StringUtils.isNotBlank(taskCommand) ? taskCommand : InspectionTaskDefinition.COMMAND; TaskManager manager = container.getComponentByType(TaskManager.class); executeTask(manager.getTask(command)); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionModule.java similarity index 90% rename from sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java rename to sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionModule.java index a966646be5f..116db16216d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionModule.java @@ -17,12 +17,11 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.batch.bootstrap; +package org.sonar.batch.tasks; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.BatchExtensionDictionnary; -import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.profiles.RulesProfile; import org.sonar.api.resources.Languages; @@ -37,6 +36,10 @@ import org.sonar.batch.ProfileProvider; import org.sonar.batch.ProjectTree; import org.sonar.batch.ResourceFilters; import org.sonar.batch.ViolationFilters; +import org.sonar.batch.bootstrap.ExtensionInstaller; +import org.sonar.batch.bootstrap.Module; +import org.sonar.batch.bootstrap.ProjectSettings; +import org.sonar.batch.bootstrap.UnsupportedProperties; import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.batch.events.EventBus; import org.sonar.batch.index.DefaultIndex; @@ -48,11 +51,11 @@ import org.sonar.core.qualitymodel.DefaultModelFinder; import org.sonar.jpa.dao.ProfilesDao; import org.sonar.jpa.dao.RulesDao; -public class ProjectModule extends Module { - private static final Logger LOG = LoggerFactory.getLogger(ProjectModule.class); +public class InspectionModule extends Module { + private static final Logger LOG = LoggerFactory.getLogger(InspectionModule.class); private Project project; - public ProjectModule(Project project) { + public InspectionModule(Project project) { this.project = project; } @@ -109,12 +112,11 @@ public class ProjectModule extends Module { private void addPluginExtensions() { ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class); - installer.installBatchExtensions(container, InstantiationStrategy.PER_PROJECT); + installer.installInspectionExtensions(container); } private void logSettings() { - // TODO move these logs in a dedicated component - LOG.info("------------- Analyzing {}", project.getName()); + LOG.info("------------- Inspecting {}", project.getName()); } /** diff --git a/sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskDefinition.java b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskDefinition.java similarity index 92% rename from sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskDefinition.java rename to sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskDefinition.java index ba8b98dbed3..0978565af9c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskDefinition.java +++ b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskDefinition.java @@ -23,7 +23,7 @@ import org.sonar.api.batch.TaskDefinition; import org.sonar.api.batch.TaskDescriptor; import org.sonar.api.batch.TaskExecutor; -public class AnalyseProjectTaskDefinition implements TaskDefinition { +public class InspectionTaskDefinition implements TaskDefinition { public static final String COMMAND = "analyse-project"; @@ -36,7 +36,7 @@ public class AnalyseProjectTaskDefinition implements TaskDefinition { } public Class getExecutor() { - return AnalyseProjectTaskExecutor.class; + return InspectionTaskExecutor.class; } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskExecutor.java similarity index 72% rename from sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskExecutor.java rename to sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskExecutor.java index fa8936aaf2e..9fcb221dccf 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/tasks/AnalyseProjectTaskExecutor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/tasks/InspectionTaskExecutor.java @@ -22,28 +22,36 @@ package org.sonar.batch.tasks; import org.sonar.api.batch.RequiresProject; import org.sonar.api.batch.TaskExecutor; import org.sonar.api.platform.ComponentContainer; +import org.sonar.api.resources.Project; import org.sonar.batch.ProjectTree; -import org.sonar.batch.bootstrap.AnalyseProjectModule; @RequiresProject -public class AnalyseProjectTaskExecutor implements TaskExecutor { +public class InspectionTaskExecutor implements TaskExecutor { private final ComponentContainer container; private final ProjectTree projectTree; - public AnalyseProjectTaskExecutor(ProjectTree projectTree, ComponentContainer container) { + public InspectionTaskExecutor(ProjectTree projectTree, ComponentContainer container) { this.container = container; this.projectTree = projectTree; } public void execute() { - AnalyseProjectModule analyseProjectModule = new AnalyseProjectModule(projectTree.getRootProject()); + analyze(projectTree.getRootProject()); + } + + private void analyze(Project project) { + for (Project subProject : project.getModules()) { + analyze(subProject); + } + + InspectionModule projectModule = new InspectionModule(project); try { ComponentContainer childContainer = container.createChild(); - analyseProjectModule.init(childContainer); - analyseProjectModule.start(); + projectModule.init(childContainer); + projectModule.start(); } finally { - analyseProjectModule.stop(); + projectModule.stop(); container.removeChild(); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/AnalyseProjectModuleTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/AbstractTaskModuleTest.java similarity index 61% rename from sonar-batch/src/test/java/org/sonar/batch/bootstrap/AnalyseProjectModuleTest.java rename to sonar-batch/src/test/java/org/sonar/batch/bootstrap/AbstractTaskModuleTest.java index 2b47d832dea..6569ce948c3 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/AnalyseProjectModuleTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/AbstractTaskModuleTest.java @@ -20,17 +20,17 @@ package org.sonar.batch.bootstrap; import org.junit.Test; -import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.platform.ComponentContainer; +import org.sonar.batch.tasks.ListTaskDefinition; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -public class AnalyseProjectModuleTest { +public class AbstractTaskModuleTest { @Test - public void should_register_batch_extensions() { + public void should_register_task_extensions_when_project_present() { final ExtensionInstaller extensionInstaller = mock(ExtensionInstaller.class); Module bootstrapModule = new Module() { @Override @@ -40,9 +40,26 @@ public class AnalyseProjectModuleTest { } }; bootstrapModule.init(); - AnalyseProjectModule module = new AnalyseProjectModule(null); + ProjectTaskModule module = new ProjectTaskModule(new ListTaskDefinition()); bootstrapModule.installChild(module); - verify(extensionInstaller).installBatchExtensions(any(ComponentContainer.class), eq(InstantiationStrategy.PER_BATCH)); + verify(extensionInstaller).installTaskExtensions(any(ComponentContainer.class), eq(true)); + } + + @Test + public void should_register_task_extensions_when_no_project() { + final ExtensionInstaller extensionInstaller = mock(ExtensionInstaller.class); + Module bootstrapModule = new Module() { + @Override + protected void configure() { + // used to install project extensions + container.addSingleton(extensionInstaller); + } + }; + bootstrapModule.init(); + ProjectLessTaskModule module = new ProjectLessTaskModule(new ListTaskDefinition()); + bootstrapModule.installChild(module); + + verify(extensionInstaller).installTaskExtensions(any(ComponentContainer.class), eq(false)); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java index b8d2a1d9cff..deba92ae7fd 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java @@ -94,7 +94,7 @@ public class ExtensionInstallerTest { ComponentContainer container = new ComponentContainer(); ExtensionInstaller installer = new ExtensionInstaller(pluginRepository, new EnvironmentInformation("ant", "1.7"), new Settings()); - installer.installBatchExtensions(container, InstantiationStrategy.PER_PROJECT); + installer.installInspectionExtensions(container); assertThat(container.getComponentByType(MavenService.class)).isNull(); assertThat(container.getComponentByType(BuildToolService.class)).isNotNull(); @@ -111,7 +111,7 @@ public class ExtensionInstallerTest { container.addSingleton(project); ExtensionInstaller installer = new ExtensionInstaller(pluginRepository, new EnvironmentInformation("maven", "2.2.1"), new Settings()); - installer.installBatchExtensions(container, InstantiationStrategy.PER_PROJECT); + installer.installInspectionExtensions(container); assertThat(container.getComponentByType(MavenService.class)).isNull(); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ProjectModuleTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/InspectionModuleTest.java similarity index 86% rename from sonar-batch/src/test/java/org/sonar/batch/bootstrap/ProjectModuleTest.java rename to sonar-batch/src/test/java/org/sonar/batch/bootstrap/InspectionModuleTest.java index 6d26b4978a7..1bc61c5f990 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ProjectModuleTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/InspectionModuleTest.java @@ -22,7 +22,6 @@ package org.sonar.batch.bootstrap; import org.apache.commons.configuration.PropertiesConfiguration; import org.junit.Test; import org.mockito.Matchers; -import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.database.model.Snapshot; import org.sonar.api.platform.ComponentContainer; @@ -30,15 +29,15 @@ import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; import org.sonar.batch.ProjectTree; import org.sonar.batch.index.ResourcePersister; +import org.sonar.batch.tasks.InspectionModule; 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; import static org.mockito.Mockito.when; -public class ProjectModuleTest { +public class InspectionModuleTest { @Test public void should_register_project_extensions() { // components injected in the parent container @@ -47,7 +46,7 @@ public class ProjectModuleTest { final ProjectTree projectTree = mock(ProjectTree.class); when(projectTree.getProjectDefinition(project)).thenReturn(ProjectDefinition.create()); final ResourcePersister resourcePersister = mock(ResourcePersister.class); - when(resourcePersister.getSnapshot(Matchers.any())).thenReturn(new Snapshot()); + when(resourcePersister.getSnapshot(Matchers. any())).thenReturn(new Snapshot()); final ExtensionInstaller extensionInstaller = mock(ExtensionInstaller.class); Module batchModule = new Module() { @@ -61,10 +60,10 @@ public class ProjectModuleTest { }; batchModule.init(); - ProjectModule projectModule = new ProjectModule(project); + InspectionModule projectModule = new InspectionModule(project); batchModule.installChild(projectModule); - verify(extensionInstaller).installBatchExtensions(any(ComponentContainer.class), eq(InstantiationStrategy.PER_PROJECT)); + verify(extensionInstaller).installInspectionExtensions(any(ComponentContainer.class)); assertThat(projectModule.container.getComponentByType(ProjectSettings.class)).isNotNull(); } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/bootstrap/ProjectBuilder.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/bootstrap/ProjectBuilder.java index 35a5b108983..073c47cbec2 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/bootstrap/ProjectBuilder.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/bootstrap/ProjectBuilder.java @@ -19,8 +19,8 @@ */ package org.sonar.api.batch.bootstrap; -import org.sonar.api.TaskExtension; -import org.sonar.api.batch.RequiresProject; +import org.sonar.api.BatchExtension; +import org.sonar.api.batch.InstantiationStrategy; /** * This extension point allows to change project structure at runtime. It is executed once during task startup. @@ -34,8 +34,8 @@ import org.sonar.api.batch.RequiresProject; * * @since 2.9 */ -@RequiresProject -public abstract class ProjectBuilder implements TaskExtension { +@InstantiationStrategy(InstantiationStrategy.PER_BATCH) +public abstract class ProjectBuilder implements BatchExtension { private ProjectReactor reactor; -- 2.39.5