]> source.dussan.org Git - sonarqube.git/commitdiff
Revert all changes made to IoC container for views as a task.
authorJulien HENRY <julien.henry@sonarsource.com>
Fri, 1 Mar 2013 11:14:51 +0000 (12:14 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Fri, 1 Mar 2013 11:31:07 +0000 (12:31 +0100)
19 files changed:
sonar-batch/src/main/java/org/sonar/batch/DefaultTimeMachine.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ModuleContainer.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectLessTaskContainer.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskContainer.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskBootstrapContainer.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskContainer.java [new file with mode: 0644]
sonar-batch/src/main/java/org/sonar/batch/scan/ScanContainer.java
sonar-batch/src/main/java/org/sonar/batch/scan/ScanTask.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/BootstrapContainerTest.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/TaskContainerTest.java
sonar-batch/src/test/java/org/sonar/batch/scan/ScanContainerTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/BatchExtensionDictionnary.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/Metrics.java
sonar-plugin-api/src/main/java/org/sonar/api/qualitymodel/ModelFinder.java
sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java

index 5e949853af9a2b31a267c856e8d4645a47c85c9a..ad2ec8007b8f177bae84758e68ded4b2836a766e 100644 (file)
@@ -21,7 +21,6 @@ package org.sonar.batch;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.sonar.api.batch.SonarIndex;
 import org.sonar.api.batch.TimeMachine;
 import org.sonar.api.batch.TimeMachineQuery;
 import org.sonar.api.database.DatabaseSession;
@@ -32,23 +31,19 @@ import org.sonar.api.measures.Metric;
 import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.resources.Resource;
+import org.sonar.batch.index.DefaultIndex;
 
 import javax.persistence.Query;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class DefaultTimeMachine implements TimeMachine {
 
   private DatabaseSession session;
-  private SonarIndex index;
+  private DefaultIndex index;
   private MetricFinder metricFinder;
 
-  public DefaultTimeMachine(DatabaseSession session, SonarIndex index, MetricFinder metricFinder) {
+  public DefaultTimeMachine(DatabaseSession session, DefaultIndex index, MetricFinder metricFinder) {
     this.session = session;
     this.index = index;
     this.metricFinder = metricFinder;
index 3a3ab35e85d18cb361d042083418de95e9b209fe..211128bde2f6e673247ac26b02805a4e294e3c00 100644 (file)
@@ -79,7 +79,7 @@ public class ExtensionInstaller implements BatchComponent {
     return installed;
   }
 
-  public void installTaskExtensions(ComponentContainer container, boolean requiringProject) {
+  public void installTaskExtensions(ComponentContainer container, boolean projectPresent) {
     boolean dryRun = settings.getBoolean(CoreProperties.DRY_RUN);
     for (Map.Entry<PluginMetadata, Plugin> entry : pluginRepository.getPluginsByMetadata().entrySet()) {
       PluginMetadata metadata = entry.getKey();
@@ -87,8 +87,8 @@ public class ExtensionInstaller implements BatchComponent {
 
       container.addExtension(metadata, plugin);
       for (Object extension : plugin.getExtensions()) {
-        installTaskExtension(container, metadata, extension, requiringProject);
-        if (requiringProject) {
+        installTaskExtension(container, metadata, extension, projectPresent);
+        if (projectPresent) {
           installBatchExtension(container, metadata, extension, dryRun, InstantiationStrategy.PER_BATCH);
         }
       }
@@ -96,8 +96,8 @@ public class ExtensionInstaller implements BatchComponent {
 
     List<ExtensionProvider> providers = container.getComponentsByType(ExtensionProvider.class);
     for (ExtensionProvider provider : providers) {
-      executeTaskExtensionProvider(container, provider, requiringProject);
-      if (requiringProject) {
+      executeTaskExtensionProvider(container, provider, projectPresent);
+      if (projectPresent) {
         executeBatchExtensionProvider(container, InstantiationStrategy.PER_BATCH, dryRun, provider);
       }
     }
@@ -114,10 +114,10 @@ public class ExtensionInstaller implements BatchComponent {
     }
   }
 
-  boolean installTaskExtension(ComponentContainer container, @Nullable PluginMetadata plugin, Object extension, boolean requiringProject) {
+  boolean installTaskExtension(ComponentContainer container, @Nullable PluginMetadata plugin, Object extension, boolean projectPresent) {
     boolean installed;
     if (ExtensionUtils.isTaskExtension(extension) &&
-      (requiringProject == ExtensionUtils.requiresProject(extension)) &&
+      (projectPresent || !ExtensionUtils.requiresProject(extension)) &&
       ExtensionUtils.supportsEnvironment(extension, environment)) {
       logInstallExtension("task", plugin, extension);
       container.addExtension(plugin, extension);
index 05eed0b6fd0aba41d1d4ce67075e10898850b2f9..9df02c8955957538f86bca0527593ced57755800 100644 (file)
@@ -21,15 +21,17 @@ 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.measures.CoreMetrics;
 import org.sonar.api.measures.Metric;
 import org.sonar.api.measures.Metrics;
-import org.sonar.api.task.TaskExtension;
 
 import java.util.List;
 
-public class MetricProvider extends ExtensionProvider implements TaskExtension {
+@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
+public class MetricProvider extends ExtensionProvider implements BatchExtension {
 
   private Metrics[] factories;
 
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ModuleContainer.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ModuleContainer.java
deleted file mode 100644 (file)
index 4a36fc6..0000000
+++ /dev/null
@@ -1,122 +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.BatchExtensionDictionnary;
-import org.sonar.api.batch.bootstrap.ProjectDefinition;
-import org.sonar.api.database.model.Snapshot;
-import org.sonar.api.resources.Languages;
-import org.sonar.api.resources.Project;
-import org.sonar.api.scan.filesystem.FileExclusions;
-import org.sonar.api.scan.filesystem.PathResolver;
-import org.sonar.batch.DefaultProfileLoader;
-import org.sonar.batch.DefaultProjectClasspath;
-import org.sonar.batch.DefaultSensorContext;
-import org.sonar.batch.DefaultTimeMachine;
-import org.sonar.batch.ResourceFilters;
-import org.sonar.batch.ViolationFilters;
-import org.sonar.batch.components.TimeMachineConfiguration;
-import org.sonar.batch.events.EventBus;
-import org.sonar.batch.local.DryRunExporter;
-import org.sonar.batch.phases.Phases;
-import org.sonar.batch.phases.PhasesTimeProfiler;
-import org.sonar.batch.scan.LastSnapshots;
-import org.sonar.batch.scan.filesystem.DeprecatedFileSystemAdapter;
-import org.sonar.batch.scan.filesystem.ExclusionFilters;
-import org.sonar.batch.scan.filesystem.FileSystemLogger;
-import org.sonar.batch.scan.filesystem.LanguageFilters;
-import org.sonar.batch.scan.filesystem.ModuleFileSystemProvider;
-import org.sonar.jpa.dao.ProfilesDao;
-import org.sonar.jpa.dao.RulesDao;
-
-public abstract class ModuleContainer extends Container {
-
-  private Project project;
-  private ProjectDefinition projectDefinition;
-  private Snapshot snapshot;
-
-  public ModuleContainer(Project project, ProjectDefinition projectDefinition, Snapshot snapshot) {
-    this.project = project;
-    this.projectDefinition = projectDefinition;
-    this.snapshot = snapshot;
-  }
-
-  @Override
-  protected void configure() {
-    addCoreComponents();
-    addPluginExtensions();
-  }
-
-  private void addCoreComponents() {
-    container.addSingleton(projectDefinition);
-    container.addSingleton(project.getConfiguration());
-    container.addSingleton(project);
-    for (Object component : projectDefinition.getContainerExtensions()) {
-      container.addSingleton(component);
-    }
-    // the Snapshot component will be removed when asynchronous measures are improved (required for AsynchronousMeasureSensor)
-    container.addSingleton(snapshot);
-
-    container.addSingleton(ProjectSettings.class);
-
-    // hack to initialize commons-configuration before ExtensionProviders
-    container.getComponentByType(ProjectSettings.class);
-
-    container.addSingleton(EventBus.class);
-    container.addSingleton(Phases.class);
-    container.addSingleton(PhasesTimeProfiler.class);
-    for (Class clazz : Phases.getPhaseClasses()) {
-      container.addSingleton(clazz);
-    }
-    container.addSingleton(UnsupportedProperties.class);
-
-    container.addSingleton(RulesDao.class);
-    container.addSingleton(LastSnapshots.class);
-    container.addSingleton(Languages.class);
-
-    // file system
-    container.addSingleton(PathResolver.class);
-    container.addSingleton(FileExclusions.class);
-    container.addSingleton(LanguageFilters.class);
-    container.addSingleton(ExclusionFilters.class);
-    container.addSingleton(DefaultProjectClasspath.class);
-    container.addPicoAdapter(new ModuleFileSystemProvider());
-    container.addSingleton(DeprecatedFileSystemAdapter.class);
-    container.addSingleton(FileSystemLogger.class);
-
-    container.addSingleton(TimeMachineConfiguration.class);
-    container.addSingleton(org.sonar.api.database.daos.MeasuresDao.class);
-    container.addSingleton(ProfilesDao.class);
-    container.addSingleton(DefaultSensorContext.class);
-    container.addSingleton(BatchExtensionDictionnary.class);
-    container.addSingleton(DefaultTimeMachine.class);
-    container.addSingleton(ViolationFilters.class);
-    container.addSingleton(ResourceFilters.class);
-    container.addSingleton(DefaultProfileLoader.class);
-    container.addSingleton(DryRunExporter.class);
-  }
-
-  private void addPluginExtensions() {
-    ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class);
-    installer.installInspectionExtensions(container);
-  }
-
-}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectLessTaskContainer.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectLessTaskContainer.java
deleted file mode 100644 (file)
index 24c8463..0000000
+++ /dev/null
@@ -1,187 +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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.config.EmailSettings;
-import org.sonar.api.resources.ResourceTypes;
-import org.sonar.api.task.Task;
-import org.sonar.api.task.TaskDefinition;
-import org.sonar.api.utils.SonarException;
-import org.sonar.batch.DefaultResourceCreationLock;
-import org.sonar.batch.ProjectConfigurator;
-import org.sonar.batch.components.PastMeasuresLoader;
-import org.sonar.batch.components.PastSnapshotFinder;
-import org.sonar.batch.components.PastSnapshotFinderByDate;
-import org.sonar.batch.components.PastSnapshotFinderByDays;
-import org.sonar.batch.components.PastSnapshotFinderByPreviousAnalysis;
-import org.sonar.batch.components.PastSnapshotFinderByPreviousVersion;
-import org.sonar.batch.components.PastSnapshotFinderByVersion;
-import org.sonar.batch.index.DefaultPersistenceManager;
-import org.sonar.batch.index.DefaultResourcePersister;
-import org.sonar.batch.index.DependencyPersister;
-import org.sonar.batch.index.EventPersister;
-import org.sonar.batch.index.LinkPersister;
-import org.sonar.batch.index.MeasurePersister;
-import org.sonar.batch.index.MemoryOptimizer;
-import org.sonar.batch.index.SourcePersister;
-import org.sonar.batch.tasks.ListTasksTask;
-import org.sonar.core.i18n.I18nManager;
-import org.sonar.core.i18n.RuleI18nManager;
-import org.sonar.core.metric.CacheMetricFinder;
-import org.sonar.core.notification.DefaultNotificationManager;
-import org.sonar.core.persistence.DaoUtils;
-import org.sonar.core.persistence.DatabaseVersion;
-import org.sonar.core.persistence.MyBatis;
-import org.sonar.core.persistence.SemaphoreUpdater;
-import org.sonar.core.persistence.SemaphoresImpl;
-import org.sonar.core.qualitymodel.DefaultModelFinder;
-import org.sonar.core.resource.DefaultResourcePermissions;
-import org.sonar.core.rule.CacheRuleFinder;
-import org.sonar.core.user.DefaultUserFinder;
-import org.sonar.jpa.dao.MeasuresDao;
-import org.sonar.jpa.session.DefaultDatabaseConnector;
-import org.sonar.jpa.session.JpaDatabaseSession;
-
-/**
- * Level-3 components. Task-level components that don't depends on project.
- */
-public class ProjectLessTaskContainer extends Container {
-
-  private static final Logger LOG = LoggerFactory.getLogger(ProjectLessTaskContainer.class);
-
-  private TaskDefinition taskDefinition;
-
-  private boolean projectPresent;
-
-  public ProjectLessTaskContainer(TaskDefinition task, boolean projectPresent) {
-    this.taskDefinition = task;
-    this.projectPresent = projectPresent;
-  }
-
-  @Override
-  protected void configure() {
-    registerCoreComponents();
-    registerDatabaseComponents();
-    registerCoreProjectLessTasks();
-    registerProjectLessTaskExtensions();
-    if (projectPresent && ExtensionUtils.requiresProject(taskDefinition.getTask())) {
-      container.addSingleton(ProjectExclusions.class);
-      container.addSingleton(ProjectReactorReady.class);
-      container.addSingleton(DryRunDatabase.class);
-    }
-  }
-
-  private void registerCoreComponents() {
-    container.addSingleton(EmailSettings.class);
-    container.addSingleton(I18nManager.class);
-    container.addSingleton(RuleI18nManager.class);
-    container.addSingleton(MeasuresDao.class);
-    container.addSingleton(CacheRuleFinder.class);
-    container.addSingleton(CacheMetricFinder.class);
-    container.addSingleton(DefaultUserFinder.class);
-    container.addSingleton(ResourceTypes.class);
-    container.addSingleton(SemaphoreUpdater.class);
-    container.addSingleton(SemaphoresImpl.class);
-    container.addSingleton(PastSnapshotFinderByDate.class);
-    container.addSingleton(PastSnapshotFinderByDays.class);
-    container.addSingleton(PastSnapshotFinderByPreviousAnalysis.class);
-    container.addSingleton(PastSnapshotFinderByVersion.class);
-    container.addSingleton(PastSnapshotFinderByPreviousVersion.class);
-    container.addSingleton(PastMeasuresLoader.class);
-    container.addSingleton(PastSnapshotFinder.class);
-    container.addSingleton(DefaultModelFinder.class);
-    container.addSingleton(MetricProvider.class);
-    container.addSingleton(DefaultResourceCreationLock.class);
-    container.addSingleton(DefaultPersistenceManager.class);
-    container.addSingleton(DependencyPersister.class);
-    container.addSingleton(EventPersister.class);
-    container.addSingleton(LinkPersister.class);
-    container.addSingleton(MeasurePersister.class);
-    container.addSingleton(MemoryOptimizer.class);
-    container.addSingleton(DefaultResourcePermissions.class);
-    container.addSingleton(DefaultResourcePersister.class);
-    container.addSingleton(SourcePersister.class);
-    container.addSingleton(DefaultNotificationManager.class);
-    container.addSingleton(ProjectConfigurator.class);
-  }
-
-  private void registerDatabaseComponents() {
-    container.addSingleton(JdbcDriverHolder.class);
-    container.addSingleton(BatchDatabase.class);
-    container.addSingleton(MyBatis.class);
-    container.addSingleton(DatabaseVersion.class);
-    container.addSingleton(DatabaseCompatibility.class);
-    for (Class daoClass : DaoUtils.getDaoClasses()) {
-      container.addSingleton(daoClass);
-    }
-
-    // hibernate
-    container.addSingleton(DefaultDatabaseConnector.class);
-    container.addSingleton(JpaDatabaseSession.class);
-    container.addSingleton(BatchDatabaseSessionFactory.class);
-  }
-
-  private void registerCoreProjectLessTasks() {
-    container.addSingleton(ListTasksTask.class);
-  }
-
-  private void registerProjectLessTaskExtensions() {
-    ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class);
-    installer.installTaskExtensions(container, false);
-  }
-
-  private void logSettings() {
-    LOG.info("-------------  Executing {}", taskDefinition.getName());
-  }
-
-  /**
-   * Execute task
-   */
-  @Override
-  protected void doStart() {
-    if (ExtensionUtils.requiresProject(taskDefinition.getTask())) {
-      if (!projectPresent) {
-        throw new SonarException("Task '" + taskDefinition.getName() + "' requires to be run on a project");
-      }
-      // Create a new child container to put project specific components
-      Container childModule = new ProjectTaskContainer(taskDefinition);
-      try {
-        installChild(childModule);
-        childModule.start();
-      } finally {
-        childModule.stop();
-        uninstallChild();
-      }
-    }
-    else {
-      Task task = container.getComponentByType(taskDefinition.getTask());
-      if (task != null) {
-        logSettings();
-        task.execute();
-      } else {
-        throw new SonarException("Extension " + taskDefinition.getTask() + " was not found in declared extensions.");
-      }
-    }
-  }
-
-}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskContainer.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectTaskContainer.java
deleted file mode 100644 (file)
index 2fb0adc..0000000
+++ /dev/null
@@ -1,106 +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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.task.Task;
-import org.sonar.api.task.TaskDefinition;
-import org.sonar.api.utils.SonarException;
-import org.sonar.batch.DefaultFileLinesContextFactory;
-import org.sonar.batch.ProjectTree;
-import org.sonar.batch.index.DefaultIndex;
-import org.sonar.batch.scan.ScanTask;
-import org.sonar.core.component.ScanGraph;
-import org.sonar.core.component.ScanGraphStore;
-import org.sonar.core.component.ScanPerspectives;
-import org.sonar.core.test.TestPlanBuilder;
-import org.sonar.core.test.TestableBuilder;
-
-/**
- * Level-4 components. Task-level components that depends on project.
- */
-public class ProjectTaskContainer extends Container {
-
-  private static final Logger LOG = LoggerFactory.getLogger(ProjectTaskContainer.class);
-
-  private TaskDefinition taskDefinition;
-
-  public ProjectTaskContainer(TaskDefinition task) {
-    this.taskDefinition = task;
-  }
-
-  @Override
-  protected void configure() {
-    registerCoreProjectTasks();
-    registerCoreComponentsRequiringProject();
-    registerProjectTaskExtensions();
-    registerOverrideAbleComponents();
-  }
-
-  private void registerCoreProjectTasks() {
-    container.addSingleton(ScanTask.class);
-  }
-
-  private void registerProjectTaskExtensions() {
-    ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class);
-    installer.installTaskExtensions(container, true);
-  }
-
-  private void registerCoreComponentsRequiringProject() {
-    container.addSingleton(ProjectTree.class);
-    container.addSingleton(DefaultFileLinesContextFactory.class);
-
-    // graphs
-    container.addSingleton(ScanGraph.create());
-    container.addSingleton(TestPlanBuilder.class);
-    container.addSingleton(TestableBuilder.class);
-    container.addSingleton(ScanPerspectives.class);
-    container.addSingleton(ScanGraphStore.class);
-  }
-
-  /**
-   * In order for instance for the plugin Views to override some components
-   */
-  protected void registerOverrideAbleComponents(){
-    container.addSingleton(DefaultIndex.class);
-    container.addSingleton(ProjectLock.class);
-  }
-
-  private void logSettings() {
-    LOG.info("-------------  Executing {}", taskDefinition.getName());
-  }
-
-  /**
-   * Execute task
-   */
-  @Override
-  protected void doStart() {
-    Task task = container.getComponentByType(taskDefinition.getTask());
-    if (task != null) {
-      logSettings();
-      task.execute();
-    } else {
-      throw new SonarException("Extension " + taskDefinition.getTask() + " was not found in declared extensions.");
-    }
-  }
-
-}
index 22a60f8c16241d7fd837b16ac322bbdfe3adedb4..39a81ebffdb64041c84d9379717addb67090c654 100644 (file)
@@ -63,11 +63,11 @@ public class TaskBootstrapContainer extends Container {
   }
 
   private void executeTask(TaskDefinition taskDefinition) {
-    boolean projectPresent = (container.getComponentByType(ProjectReactor.class) != null);
+    boolean projectPresent = container.getComponentByType(ProjectReactor.class) != null;
     if (ExtensionUtils.requiresProject(taskDefinition.getTask()) && !projectPresent) {
       throw new SonarException("Task '" + taskDefinition.getName() + "' requires to be run on a project");
     }
-    Container childModule = new ProjectLessTaskContainer(taskDefinition, projectPresent);
+    Container childModule = new TaskContainer(taskDefinition, projectPresent);
     try {
       installChild(childModule);
       childModule.start();
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskContainer.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/TaskContainer.java
new file mode 100644 (file)
index 0000000..9c4e23c
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.sonar.api.config.EmailSettings;
+import org.sonar.api.resources.ResourceTypes;
+import org.sonar.api.task.Task;
+import org.sonar.api.task.TaskDefinition;
+import org.sonar.api.utils.SonarException;
+import org.sonar.batch.DefaultFileLinesContextFactory;
+import org.sonar.batch.DefaultResourceCreationLock;
+import org.sonar.batch.ProjectConfigurator;
+import org.sonar.batch.ProjectTree;
+import org.sonar.batch.components.PastMeasuresLoader;
+import org.sonar.batch.components.PastSnapshotFinder;
+import org.sonar.batch.components.PastSnapshotFinderByDate;
+import org.sonar.batch.components.PastSnapshotFinderByDays;
+import org.sonar.batch.components.PastSnapshotFinderByPreviousAnalysis;
+import org.sonar.batch.components.PastSnapshotFinderByPreviousVersion;
+import org.sonar.batch.components.PastSnapshotFinderByVersion;
+import org.sonar.batch.index.DefaultIndex;
+import org.sonar.batch.index.DefaultPersistenceManager;
+import org.sonar.batch.index.DefaultResourcePersister;
+import org.sonar.batch.index.DependencyPersister;
+import org.sonar.batch.index.EventPersister;
+import org.sonar.batch.index.LinkPersister;
+import org.sonar.batch.index.MeasurePersister;
+import org.sonar.batch.index.MemoryOptimizer;
+import org.sonar.batch.index.SourcePersister;
+import org.sonar.batch.scan.ScanTask;
+import org.sonar.batch.tasks.ListTasksTask;
+import org.sonar.core.component.ScanGraph;
+import org.sonar.core.component.ScanGraphStore;
+import org.sonar.core.component.ScanPerspectives;
+import org.sonar.core.i18n.I18nManager;
+import org.sonar.core.i18n.RuleI18nManager;
+import org.sonar.core.metric.CacheMetricFinder;
+import org.sonar.core.notification.DefaultNotificationManager;
+import org.sonar.core.persistence.DaoUtils;
+import org.sonar.core.persistence.DatabaseVersion;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.persistence.SemaphoreUpdater;
+import org.sonar.core.persistence.SemaphoresImpl;
+import org.sonar.core.resource.DefaultResourcePermissions;
+import org.sonar.core.rule.CacheRuleFinder;
+import org.sonar.core.test.TestPlanBuilder;
+import org.sonar.core.test.TestableBuilder;
+import org.sonar.core.user.DefaultUserFinder;
+import org.sonar.jpa.dao.MeasuresDao;
+import org.sonar.jpa.session.DefaultDatabaseConnector;
+import org.sonar.jpa.session.JpaDatabaseSession;
+
+/**
+ * Level-3 components. Task-level components that don't depends on project.
+ */
+public class TaskContainer extends Container {
+
+  private static final Logger LOG = LoggerFactory.getLogger(TaskContainer.class);
+
+  private TaskDefinition taskDefinition;
+  private boolean projectPresent;
+
+  public TaskContainer(TaskDefinition task, boolean projectPresent) {
+    this.taskDefinition = task;
+    this.projectPresent = projectPresent;
+  }
+
+  @Override
+  protected void configure() {
+    logSettings();
+    registerCoreComponents();
+    registerDatabaseComponents();
+    registerCoreTasks();
+    if (projectPresent) {
+      registerCoreComponentsRequiringProject();
+    }
+    registerTaskExtensions();
+  }
+
+  private void registerCoreComponents() {
+    container.addSingleton(EmailSettings.class);
+    container.addSingleton(I18nManager.class);
+    container.addSingleton(RuleI18nManager.class);
+    container.addSingleton(MeasuresDao.class);
+    container.addSingleton(CacheRuleFinder.class);
+    container.addSingleton(CacheMetricFinder.class);
+    container.addSingleton(DefaultUserFinder.class);
+    container.addSingleton(ResourceTypes.class);
+    container.addSingleton(SemaphoreUpdater.class);
+    container.addSingleton(SemaphoresImpl.class);
+    container.addSingleton(PastSnapshotFinderByDate.class);
+    container.addSingleton(PastSnapshotFinderByDays.class);
+    container.addSingleton(PastSnapshotFinderByPreviousAnalysis.class);
+    container.addSingleton(PastSnapshotFinderByVersion.class);
+    container.addSingleton(PastSnapshotFinderByPreviousVersion.class);
+    container.addSingleton(PastMeasuresLoader.class);
+    container.addSingleton(PastSnapshotFinder.class);
+  }
+
+  private void registerDatabaseComponents() {
+    container.addSingleton(JdbcDriverHolder.class);
+    container.addSingleton(BatchDatabase.class);
+    container.addSingleton(MyBatis.class);
+    container.addSingleton(DatabaseVersion.class);
+    container.addSingleton(DatabaseCompatibility.class);
+    for (Class daoClass : DaoUtils.getDaoClasses()) {
+      container.addSingleton(daoClass);
+    }
+
+    // hibernate
+    container.addSingleton(DefaultDatabaseConnector.class);
+    container.addSingleton(JpaDatabaseSession.class);
+    container.addSingleton(BatchDatabaseSessionFactory.class);
+  }
+
+  private void registerCoreTasks() {
+    container.addSingleton(ListTasksTask.class);
+    if (projectPresent) {
+      container.addSingleton(ScanTask.class);
+    }
+  }
+
+  private void registerTaskExtensions() {
+    ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class);
+    installer.installTaskExtensions(container, projectPresent);
+  }
+
+  private void registerCoreComponentsRequiringProject() {
+    container.addSingleton(DefaultResourceCreationLock.class);
+    container.addSingleton(DefaultPersistenceManager.class);
+    container.addSingleton(DependencyPersister.class);
+    container.addSingleton(EventPersister.class);
+    container.addSingleton(LinkPersister.class);
+    container.addSingleton(MeasurePersister.class);
+    container.addSingleton(MemoryOptimizer.class);
+    container.addSingleton(DefaultResourcePermissions.class);
+    container.addSingleton(DefaultResourcePersister.class);
+    container.addSingleton(SourcePersister.class);
+    container.addSingleton(DefaultNotificationManager.class);
+    container.addSingleton(MetricProvider.class);
+    container.addSingleton(ProjectExclusions.class);
+    container.addSingleton(ProjectReactorReady.class);
+    container.addSingleton(ProjectTree.class);
+    container.addSingleton(ProjectConfigurator.class);
+    container.addSingleton(DefaultIndex.class);
+    container.addSingleton(DefaultFileLinesContextFactory.class);
+    container.addSingleton(ProjectLock.class);
+    container.addSingleton(DryRunDatabase.class);
+
+    // graphs
+    container.addSingleton(ScanGraph.create());
+    container.addSingleton(TestPlanBuilder.class);
+    container.addSingleton(TestableBuilder.class);
+    container.addSingleton(ScanPerspectives.class);
+    container.addSingleton(ScanGraphStore.class);
+  }
+
+  private void logSettings() {
+    LOG.info("-------------  Executing {}", taskDefinition.getName());
+  }
+
+  /**
+   * Execute task
+   */
+  @Override
+  protected void doStart() {
+    Task task = container.getComponentByType(taskDefinition.getTask());
+    if (task != null) {
+      task.execute();
+    } else {
+      throw new SonarException("Extension " + taskDefinition.getTask() + " was not found in declared extensions.");
+    }
+  }
+
+}
index 4bc78585fd8e6890ce372da88f230afa72479985..e898e87d53f72ce618215ec7764efca51d62611e 100644 (file)
@@ -21,32 +21,114 @@ package org.sonar.batch.scan;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.sonar.api.batch.BatchExtensionDictionnary;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
-import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.resources.Languages;
 import org.sonar.api.resources.Project;
+import org.sonar.api.scan.filesystem.FileExclusions;
+import org.sonar.api.scan.filesystem.PathResolver;
+import org.sonar.batch.DefaultProfileLoader;
+import org.sonar.batch.DefaultProjectClasspath;
+import org.sonar.batch.DefaultSensorContext;
+import org.sonar.batch.DefaultTimeMachine;
 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.ModuleContainer;
+import org.sonar.batch.bootstrap.Container;
+import org.sonar.batch.bootstrap.ExtensionInstaller;
+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;
+import org.sonar.batch.index.ResourcePersister;
+import org.sonar.batch.local.DryRunExporter;
 import org.sonar.batch.phases.Phases;
+import org.sonar.batch.phases.PhasesTimeProfiler;
+import org.sonar.batch.scan.filesystem.DeprecatedFileSystemAdapter;
+import org.sonar.batch.scan.filesystem.ExclusionFilters;
+import org.sonar.batch.scan.filesystem.FileSystemLogger;
+import org.sonar.batch.scan.filesystem.LanguageFilters;
+import org.sonar.batch.scan.filesystem.ModuleFileSystemProvider;
+import org.sonar.core.qualitymodel.DefaultModelFinder;
+import org.sonar.jpa.dao.ProfilesDao;
+import org.sonar.jpa.dao.RulesDao;
 
-public class ScanContainer extends ModuleContainer {
+public class ScanContainer extends Container {
   private static final Logger LOG = LoggerFactory.getLogger(ScanContainer.class);
   private Project project;
 
-  public ScanContainer(Project project, ProjectDefinition projectDefinition, Snapshot snapshot) {
-    super(project, projectDefinition, snapshot);
+  public ScanContainer(Project project) {
     this.project = project;
   }
 
   @Override
   protected void configure() {
-    super.configure();
+    logSettings();
+    addCoreComponents();
+    addPluginExtensions();
+  }
+
+  private void addCoreComponents() {
+    ProjectDefinition projectDefinition = container.getComponentByType(ProjectTree.class).getProjectDefinition(project);
+    container.addSingleton(projectDefinition);
+    container.addSingleton(project.getConfiguration());
+    container.addSingleton(project);
+    container.addSingleton(ProjectSettings.class);
+
+    // hack to initialize commons-configuration before ExtensionProviders
+    container.getComponentByType(ProjectSettings.class);
+
+    container.addSingleton(EventBus.class);
+    container.addSingleton(Phases.class);
+    container.addSingleton(PhasesTimeProfiler.class);
+    for (Class clazz : Phases.getPhaseClasses()) {
+      container.addSingleton(clazz);
+    }
+    container.addSingleton(UnsupportedProperties.class);
+
+    for (Object component : projectDefinition.getContainerExtensions()) {
+      container.addSingleton(component);
+    }
+    container.addSingleton(Languages.class);
+    container.addSingleton(RulesDao.class);
+    container.addSingleton(LastSnapshots.class);
+
+    // file system
+    container.addSingleton(PathResolver.class);
+    container.addSingleton(FileExclusions.class);
+    container.addSingleton(LanguageFilters.class);
+    container.addSingleton(ExclusionFilters.class);
+    container.addSingleton(DefaultProjectClasspath.class);
+    container.addPicoAdapter(new ModuleFileSystemProvider());
+    container.addSingleton(DeprecatedFileSystemAdapter.class);
+    container.addSingleton(FileSystemLogger.class);
+
+
+    // the Snapshot component will be removed when asynchronous measures are improved (required for AsynchronousMeasureSensor)
+    container.addSingleton(container.getComponentByType(ResourcePersister.class).getSnapshot(project));
+
+    container.addSingleton(TimeMachineConfiguration.class);
+    container.addSingleton(org.sonar.api.database.daos.MeasuresDao.class);
+    container.addSingleton(ProfilesDao.class);
+    container.addSingleton(DefaultSensorContext.class);
+    container.addSingleton(BatchExtensionDictionnary.class);
+    container.addSingleton(DefaultTimeMachine.class);
+    container.addSingleton(ViolationFilters.class);
+    container.addSingleton(ResourceFilters.class);
+    container.addSingleton(DefaultModelFinder.class);
+    container.addSingleton(DefaultProfileLoader.class);
+    container.addSingleton(DryRunExporter.class);
     container.addPicoAdapter(new ProfileProvider());
   }
 
+  private void addPluginExtensions() {
+    ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class);
+    installer.installInspectionExtensions(container);
+  }
+
   private void logSettings() {
     LOG.info("-------------  Inspecting {}", project.getName());
   }
@@ -58,11 +140,10 @@ public class ScanContainer extends ModuleContainer {
   protected void doStart() {
     DefaultIndex index = container.getComponentByType(DefaultIndex.class);
     index.setCurrentProject(project,
-        container.getComponentByType(ResourceFilters.class),
-        container.getComponentByType(ViolationFilters.class),
-        container.getComponentByType(RulesProfile.class));
+      container.getComponentByType(ResourceFilters.class),
+      container.getComponentByType(ViolationFilters.class),
+      container.getComponentByType(RulesProfile.class));
 
-    logSettings();
     container.getComponentByType(Phases.class).execute(project);
   }
 }
index 38ee09abe6d91c1ccabc3b364bc9df8281aa3a79..f007e92749df8fd2f4b27030d4fff5dd70a550f0 100644 (file)
 package org.sonar.batch.scan;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.sonar.api.batch.bootstrap.ProjectDefinition;
-import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
 import org.sonar.api.task.Task;
 import org.sonar.api.task.TaskDefinition;
 import org.sonar.batch.ProjectTree;
-import org.sonar.batch.index.ResourcePersister;
 import org.sonar.batch.tasks.RequiresProject;
 
 @RequiresProject
@@ -61,9 +58,7 @@ public class ScanTask implements Task {
 
   @VisibleForTesting
   void scan(Project project) {
-    ProjectDefinition projectDefinition = container.getComponentByType(ProjectTree.class).getProjectDefinition(project);
-    Snapshot snapshot = container.getComponentByType(ResourcePersister.class).getSnapshot(project);
-    ScanContainer projectModule = new ScanContainer(project, projectDefinition, snapshot);
+    ScanContainer projectModule = new ScanContainer(project);
     try {
       ComponentContainer childContainer = container.createChild();
       projectModule.init(childContainer);
index 270d0d1a5e11df621177bb5cd88a0bae9ecd4755..8cc7b44a86a851e437c3a162034906ba95ed4db0 100644 (file)
@@ -24,12 +24,13 @@ import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.bootstrap.ProjectReactor;
 import org.sonar.api.batch.maven.MavenPluginHandler;
 import org.sonar.api.resources.Project;
-import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem;
 import org.sonar.batch.scan.maven.FakeMavenPluginExecutor;
 import org.sonar.batch.scan.maven.MavenPluginExecutor;
+import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem;
 
 import static org.fest.assertions.Assertions.assertThat;
 
+
 public class BootstrapContainerTest {
 
   private ProjectReactor reactor = new ProjectReactor(ProjectDefinition.create());
@@ -58,6 +59,7 @@ public class BootstrapContainerTest {
 
     assertThat(module.container).isNotNull();
     assertThat(module.container.getComponentByType(FakeComponent.class)).isNotNull();
+    assertThat(module.container.getComponentByType(ProjectReactor.class)).isSameAs(reactor);
   }
 
   @Test
@@ -66,6 +68,7 @@ public class BootstrapContainerTest {
     module.init();
 
     assertThat(module.container).isNotNull();
+    assertThat(module.container.getComponentByType(ProjectReactor.class)).isSameAs(reactor);
   }
 
   public static class FakeComponent {
@@ -76,7 +79,7 @@ public class BootstrapContainerTest {
     public void execute(Project project, DefaultModuleFileSystem fs, String goal) {
     }
 
-    public MavenPluginHandler execute(Project project, DefaultModuleFileSystem fs, MavenPluginHandler handler) {
+    public MavenPluginHandler execute(Project project, DefaultModuleFileSystem  fs, MavenPluginHandler handler) {
       return handler;
     }
   }
index a4a275fd7d631be14b52e0c87ad1bf8a7c5e0af7..ce31e79b46e914232ae759ca0662472712a1c0d9 100644 (file)
@@ -90,7 +90,7 @@ public class ExtensionInstallerTest {
   }
 
   @Test
-  public void shouldInstallProjectTaskExtensions() {
+  public void shouldInstallTaskExtensions() {
     BatchPluginRepository pluginRepository = mock(BatchPluginRepository.class);
     when(pluginRepository.getPluginsByMetadata()).thenReturn(newPlugin(SampleProjectTask.class, SampleTask.class, TaskProvider.class));
     ComponentContainer container = new ComponentContainer();
@@ -99,14 +99,14 @@ public class ExtensionInstallerTest {
     installer.installTaskExtensions(container, true);
 
     assertThat(container.getComponentByType(SampleProjectTask.class)).isNotNull();
-    assertThat(container.getComponentByType(SampleTask.class)).isNull();
-    assertThat(container.getComponentByType(AnotherTask.class)).isNull();
+    assertThat(container.getComponentByType(SampleTask.class)).isNotNull();
+    assertThat(container.getComponentByType(AnotherTask.class)).isNotNull();
   }
 
   @Test
-  public void shouldInstallProjectLessTaskExtensions() {
+  public void shouldNotInstallProjectTaskExtensionsWhenNoProject() {
     BatchPluginRepository pluginRepository = mock(BatchPluginRepository.class);
-    when(pluginRepository.getPluginsByMetadata()).thenReturn(newPlugin(SampleProjectTask.class, SampleTask.class, TaskProvider.class));
+    when(pluginRepository.getPluginsByMetadata()).thenReturn(newPlugin(SampleProjectTask.class, SampleTask.class));
     ComponentContainer container = new ComponentContainer();
     ExtensionInstaller installer = new ExtensionInstaller(pluginRepository, new EnvironmentInformation("ant", "1.7"), new Settings());
 
@@ -114,7 +114,6 @@ public class ExtensionInstallerTest {
 
     assertThat(container.getComponentByType(SampleProjectTask.class)).isNull();
     assertThat(container.getComponentByType(SampleTask.class)).isNotNull();
-    assertThat(container.getComponentByType(AnotherTask.class)).isNotNull();
   }
 
   @Test
index 92cde480b914fceeae4db8da9e8fbc97ae104de7..03944ea0d772004e7ec51c822a8a40959d66035e 100644 (file)
@@ -40,7 +40,7 @@ public class TaskContainerTest {
       }
     };
     bootstrapModule.init();
-    ProjectTaskContainer module = new ProjectTaskContainer(TaskDefinition.create());
+    TaskContainer module = new TaskContainer(TaskDefinition.create(), true);
     bootstrapModule.installChild(module);
 
     verify(extensionInstaller).installTaskExtensions(any(ComponentContainer.class), eq(true));
@@ -57,7 +57,7 @@ public class TaskContainerTest {
       }
     };
     bootstrapModule.init();
-    ProjectLessTaskContainer module = new ProjectLessTaskContainer(TaskDefinition.create(), false);
+    TaskContainer module = new TaskContainer(TaskDefinition.create(), false);
     bootstrapModule.installChild(module);
 
     verify(extensionInstaller).installTaskExtensions(any(ComponentContainer.class), eq(false));
index b31627bd2c21d2bf0c47e0e5ae9d631b457e62e7..b8ecbdc8b7ac2defed3e180770a5c9b79f3cb46a 100644 (file)
@@ -22,18 +22,23 @@ package org.sonar.batch.scan;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.fest.assertions.Assertions;
 import org.junit.Test;
+import org.mockito.Matchers;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
+import org.sonar.api.resources.Resource;
+import org.sonar.batch.ProjectTree;
 import org.sonar.batch.bootstrap.BatchSettings;
 import org.sonar.batch.bootstrap.Container;
 import org.sonar.batch.bootstrap.ExtensionInstaller;
 import org.sonar.batch.bootstrap.ProjectSettings;
+import org.sonar.batch.index.ResourcePersister;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class ScanContainerTest {
   @Test
@@ -41,18 +46,24 @@ public class ScanContainerTest {
     // components injected in the parent container
     final Project project = new Project("foo");
     project.setConfiguration(new PropertiesConfiguration());
+    final ProjectTree projectTree = mock(ProjectTree.class);
+    when(projectTree.getProjectDefinition(project)).thenReturn(ProjectDefinition.create());
+    final ResourcePersister resourcePersister = mock(ResourcePersister.class);
+    when(resourcePersister.getSnapshot(Matchers.<Resource>any())).thenReturn(new Snapshot());
 
     final ExtensionInstaller extensionInstaller = mock(ExtensionInstaller.class);
     Container batchModule = new Container() {
       @Override
       protected void configure() {
         container.addSingleton(extensionInstaller);
+        container.addSingleton(projectTree);
+        container.addSingleton(resourcePersister);
         container.addSingleton(new BatchSettings());
       }
     };
 
     batchModule.init();
-    ScanContainer projectModule = new ScanContainer(project, ProjectDefinition.create(), new Snapshot());
+    ScanContainer projectModule = new ScanContainer(project);
     batchModule.installChild(projectModule);
 
     verify(extensionInstaller).installInspectionExtensions(any(ComponentContainer.class));
index 4a68f84d1d6c99d915b68defac3591142c78a0f0..ef295033bd37550a04e138a17266423ab7fc5a8f 100644 (file)
@@ -28,7 +28,6 @@ import org.sonar.api.batch.maven.DependsUponMavenPlugin;
 import org.sonar.api.batch.maven.MavenPluginHandler;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
-import org.sonar.api.task.TaskExtension;
 import org.sonar.api.utils.AnnotationUtils;
 import org.sonar.api.utils.dag.DirectAcyclicGraph;
 
@@ -81,7 +80,7 @@ public class BatchExtensionDictionnary {
     return handlers;
   }
 
-  private List<BatchExtension> getBatchExtensions() {
+  private List<BatchExtension> getExtensions() {
     List<BatchExtension> extensions = Lists.newArrayList();
     completeBatchExtensions(componentContainer, extensions);
     return extensions;
@@ -94,27 +93,9 @@ public class BatchExtensionDictionnary {
     }
   }
 
-  private List<TaskExtension> getTaskExtensions() {
-    List<TaskExtension> extensions = Lists.newArrayList();
-    completeTaskExtensions(componentContainer, extensions);
-    return extensions;
-  }
-
-  private static void completeTaskExtensions(ComponentContainer container, List<TaskExtension> extensions) {
-    if (container != null) {
-      extensions.addAll(container.getComponentsByType(TaskExtension.class));
-      completeTaskExtensions(container.getParent(), extensions);
-    }
-  }
-
   private <T> List<T> getFilteredExtensions(Class<T> type, Project project) {
     List<T> result = Lists.newArrayList();
-    for (BatchExtension extension : getBatchExtensions()) {
-      if (shouldKeep(type, extension, project)) {
-        result.add((T) extension);
-      }
-    }
-    for (TaskExtension extension : getTaskExtensions()) {
+    for (BatchExtension extension : getExtensions()) {
       if (shouldKeep(type, extension, project)) {
         result.add((T) extension);
       }
@@ -174,6 +155,7 @@ public class BatchExtensionDictionnary {
     }
   }
 
+
   protected List evaluateAnnotatedClasses(Object extension, Class<? extends Annotation> annotation) {
     List<Object> results = Lists.newArrayList();
     Class aClass = extension.getClass();
@@ -221,7 +203,7 @@ public class BatchExtensionDictionnary {
     try {
       Object result = method.invoke(extension);
       if (result != null) {
-        // TODO add arrays/collections of objects/classes
+        //TODO add arrays/collections of objects/classes
         if (result instanceof Class<?>) {
           results.addAll(componentContainer.getComponentsByType((Class<?>) result));
 
index 189cab40645275ffa4fc1086049bff718dd98cd5..1c96d1535e74ddeff082db527fd13de8e9d81c35 100644 (file)
@@ -22,8 +22,9 @@ package org.sonar.api.measures;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
+import org.sonar.api.BatchExtension;
 import org.sonar.api.ServerExtension;
-import org.sonar.api.task.TaskExtension;
+import org.sonar.api.batch.InstantiationStrategy;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -41,7 +42,8 @@ import javax.persistence.Transient;
  */
 @Table(name = "metrics")
 @Entity(name = "Metric")
-public class Metric implements ServerExtension, TaskExtension {
+@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
+public class Metric implements ServerExtension, BatchExtension {
 
   /**
    * A metric bigger value means a degradation
index 7d000a2de1e75095563089a4f80eff872ae5d549..fe0170eac4eaa4802834a9bb72ab90fbf733c297 100644 (file)
  */
 package org.sonar.api.measures;
 
+import org.sonar.api.BatchExtension;
 import org.sonar.api.ServerExtension;
-import org.sonar.api.task.TaskExtension;
+import org.sonar.api.batch.InstantiationStrategy;
 
 import java.util.List;
 
 /**
  * @since 1.10
  */
-public interface Metrics extends TaskExtension, ServerExtension {
+@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
+public interface Metrics extends BatchExtension, ServerExtension {
   List<Metric> getMetrics();
 }
index a7d05e777e813c730f08e0814a9d9ad8fd796466..b6970c7beff5b43c2958fee137cff784235785bb 100644 (file)
  */
 package org.sonar.api.qualitymodel;
 
+import org.sonar.api.BatchComponent;
 import org.sonar.api.ServerComponent;
-import org.sonar.api.task.TaskComponent;
 
 /**
  * @since 2.3
  */
-public interface ModelFinder extends TaskComponent, ServerComponent {
+public interface ModelFinder extends BatchComponent, ServerComponent {
 
   /**
    * @return null if the name is not found
index 55482c948120529a240a8228890268661b4e7860..b6285f5a41910b58d045e9de8a89321a8cb3f319 100644 (file)
@@ -31,7 +31,7 @@ import java.util.Map;
 
 /**
  * A class to store the list of languages
- *
+ * 
  * @since 1.10
  */
 public class Languages implements BatchComponent, ServerComponent {