diff options
author | simonbrandhof <simon.brandhof@gmail.com> | 2011-10-05 00:44:37 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2011-10-07 13:36:25 +0200 |
commit | ef5bf7fdece84e5a52c8d478c8a733ecdf4d57f1 (patch) | |
tree | c64a8a041183379e92fbc81becc77af07c9b38e3 /sonar-batch/src/main/java/org/sonar/batch/bootstrap | |
parent | 3174a29201e922db758b51f4b693ca131e7037ec (diff) | |
download | sonarqube-ef5bf7fdece84e5a52c8d478c8a733ecdf4d57f1.tar.gz sonarqube-ef5bf7fdece84e5a52c8d478c8a733ecdf4d57f1.zip |
SONAR-2861 New Configuration API
The component org.apache.commons.Configuration is still available but plugins should use org.sonar.api.config.Settings.
It also implies the following issues :
SONAR-2870 do not rebuild the WAR file when editing sonar.properties
SONAR-2869 allow to use the annotations @Properties/@Property on extensions
Diffstat (limited to 'sonar-batch/src/main/java/org/sonar/batch/bootstrap')
8 files changed, 209 insertions, 167 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java index 75dec73bac8..4a690ac1a45 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java @@ -19,16 +19,20 @@ */ package org.sonar.batch.bootstrap; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; import org.sonar.api.BatchComponent; +import org.sonar.api.Extension; import org.sonar.api.ExtensionProvider; import org.sonar.api.Plugin; import org.sonar.api.batch.CoverageExtension; import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metrics; +import org.sonar.api.platform.PluginMetadata; import org.sonar.batch.bootstrapper.EnvironmentInformation; -import java.util.List; +import java.util.Map; public final class BatchExtensionInstaller implements BatchComponent { @@ -43,40 +47,63 @@ public final class BatchExtensionInstaller implements BatchComponent { } public void install(Module module) { - for (Plugin plugin : pluginRepository.getPlugins()) { + ListMultimap<PluginMetadata, Object> installedExtensionsByPlugin = ArrayListMultimap.create(); + for (Map.Entry<PluginMetadata, Plugin> entry : pluginRepository.getPluginsByMetadata().entrySet()) { + PluginMetadata metadata = entry.getKey(); + Plugin plugin = entry.getValue(); + + module.addExtension(metadata, plugin); + for (Object extension : plugin.getExtensions()) { - installExtension(module, extension); + if (installExtension(module, metadata, extension)) { + installedExtensionsByPlugin.put(metadata, extension); + } else { + module.declareExtension(metadata, extension); + } + } + } + for (Map.Entry<PluginMetadata, Object> entry : installedExtensionsByPlugin.entries()) { + PluginMetadata plugin = entry.getKey(); + Object extension = entry.getValue(); + if (isExtensionProvider(extension)) { + ExtensionProvider provider = (ExtensionProvider) module.getComponentByKey(extension); + installProvider(module, plugin, provider); } } - installExtensionProviders(module); installMetrics(module); } + static boolean isExtensionProvider(Object extension) { + return isType(extension, ExtensionProvider.class) || extension instanceof ExtensionProvider; + } + + static boolean isType(Object extension, Class<? extends Extension> extensionClass) { + Class clazz = (extension instanceof Class ? (Class) extension : extension.getClass()); + return extensionClass.isAssignableFrom(clazz); + } + private void installMetrics(Module module) { for (Metrics metrics : module.getComponents(Metrics.class)) { for (Metric metric : metrics.getMetrics()) { - module.addComponent(metric.getKey(), metric); + module.addCoreSingleton(metric); } } } - void installExtensionProviders(Module module) { - List<ExtensionProvider> providers = module.getComponents(ExtensionProvider.class); - for (ExtensionProvider provider : providers) { - Object obj = provider.provide(); - if (obj != null) { - if (obj instanceof Iterable) { - for (Object extension : (Iterable) obj) { - installExtension(module, extension); - } - } else { - installExtension(module, obj); + private void installProvider(Module module, PluginMetadata plugin, ExtensionProvider provider) { + Object obj = provider.provide(); + if (obj != null) { + if (obj instanceof Iterable) { + for (Object ext : (Iterable) obj) { + installExtension(module, plugin, ext); } + } else { + installExtension(module, plugin, obj); } } } - void installExtension(Module module, Object extension) { + boolean installExtension(Module module, PluginMetadata plugin, Object extension) { if (ExtensionUtils.isBatchExtension(extension) && ExtensionUtils.isSupportedEnvironment(extension, environment) && ExtensionUtils.checkDryRun(extension, dryRun.isEnabled()) && @@ -84,7 +111,9 @@ public final class BatchExtensionInstaller implements BatchComponent { if (ExtensionUtils.isType(extension, CoverageExtension.class)) { throw new IllegalArgumentException("Instantiation strategy " + InstantiationStrategy.PER_BATCH + " is not supported on CoverageExtension components: " + extension); } - module.addComponent(extension); + module.addExtension(plugin, extension); + return true; } + return false; } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java index 3134c5ec39f..822d6ca7a8d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java @@ -25,7 +25,7 @@ import org.sonar.api.measures.Metric; import org.sonar.api.resources.Project; import org.sonar.api.utils.ServerHttpClient; import org.sonar.batch.DefaultResourceCreationLock; -import org.sonar.batch.ProjectConfiguration; +import org.sonar.batch.ProjectConfigurator; import org.sonar.batch.ProjectTree; import org.sonar.batch.components.*; import org.sonar.batch.index.*; @@ -48,55 +48,55 @@ public class BatchModule extends Module { @Override protected void configure() { - addComponent(ProjectConfiguration.class); - addComponent(ProjectTree.class); - addComponent(DefaultResourceCreationLock.class); - addComponent(DefaultIndex.class); + addCoreSingleton(ProjectTree.class); + addCoreSingleton(ProjectConfigurator.class); + addCoreSingleton(DefaultResourceCreationLock.class); + addCoreSingleton(DefaultIndex.class); if (dryRun) { - addComponent(ReadOnlyPersistenceManager.class); + addCoreSingleton(ReadOnlyPersistenceManager.class); } else { - addComponent(DefaultPersistenceManager.class); - addComponent(DependencyPersister.class); - addComponent(EventPersister.class); - addComponent(LinkPersister.class); - addComponent(MeasurePersister.class); - addComponent(MemoryOptimizer.class); - addComponent(DefaultResourcePersister.class); - addComponent(SourcePersister.class); + addCoreSingleton(DefaultPersistenceManager.class); + addCoreSingleton(DependencyPersister.class); + addCoreSingleton(EventPersister.class); + addCoreSingleton(LinkPersister.class); + addCoreSingleton(MeasurePersister.class); + addCoreSingleton(MemoryOptimizer.class); + addCoreSingleton(DefaultResourcePersister.class); + addCoreSingleton(SourcePersister.class); } - addComponent(Plugins.class); - addComponent(ServerHttpClient.class); - addComponent(MeasuresDao.class); - addComponent(CacheRuleFinder.class); - addComponent(CacheMetricFinder.class); - addComponent(PastSnapshotFinderByDate.class); - addComponent(PastSnapshotFinderByDays.class); - addComponent(PastSnapshotFinderByPreviousAnalysis.class); - addComponent(PastSnapshotFinderByVersion.class); - addComponent(PastMeasuresLoader.class); - addComponent(PastSnapshotFinder.class); - addComponent(DefaultNotificationManager.class); - addComponent(DefaultUserFinder.class); + addCoreSingleton(Plugins.class); + addCoreSingleton(ServerHttpClient.class); + addCoreSingleton(MeasuresDao.class); + addCoreSingleton(CacheRuleFinder.class); + addCoreSingleton(CacheMetricFinder.class); + addCoreSingleton(PastSnapshotFinderByDate.class); + addCoreSingleton(PastSnapshotFinderByDays.class); + addCoreSingleton(PastSnapshotFinderByPreviousAnalysis.class); + addCoreSingleton(PastSnapshotFinderByVersion.class); + addCoreSingleton(PastMeasuresLoader.class); + addCoreSingleton(PastSnapshotFinder.class); + addCoreSingleton(DefaultNotificationManager.class); + addCoreSingleton(DefaultUserFinder.class); addCoreMetrics(); addBatchExtensions(); } private void addBatchExtensions() { - BatchExtensionInstaller installer = getComponent(BatchExtensionInstaller.class); + BatchExtensionInstaller installer = getComponentByType(BatchExtensionInstaller.class); installer.install(this); } void addCoreMetrics() { for (Metric metric : CoreMetrics.getMetrics()) { - addComponent(metric.getKey(), metric); + addCoreSingleton(metric); } } @Override protected void doStart() { - ProjectTree projectTree = getComponent(ProjectTree.class); + ProjectTree projectTree = getComponentByType(ProjectTree.class); analyze(projectTree.getRootProject()); } @@ -110,7 +110,7 @@ public class BatchModule extends Module { projectComponents.start(); } finally { projectComponents.stop(); - uninstallChild(projectComponents); + uninstallChild(); } } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java index 249c94b79b7..27061aadc67 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java @@ -22,7 +22,6 @@ package org.sonar.batch.bootstrap; import com.google.common.base.Joiner; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,6 +29,7 @@ import org.sonar.api.CoreProperties; import org.sonar.api.Plugin; import org.sonar.api.Properties; import org.sonar.api.Property; +import org.sonar.api.config.Settings; import org.sonar.api.platform.PluginMetadata; import org.sonar.api.platform.PluginRepository; import org.sonar.core.plugins.PluginClassloaders; @@ -51,14 +51,14 @@ public class BatchPluginRepository implements PluginRepository { private Set<String> blackList = null; private PluginClassloaders classLoaders; - public BatchPluginRepository(ArtifactDownloader artifactDownloader, Configuration configuration) { + public BatchPluginRepository(ArtifactDownloader artifactDownloader, Settings settings) { this.artifactDownloader = artifactDownloader; - if (configuration.getString(CoreProperties.BATCH_INCLUDE_PLUGINS) != null) { - whiteList = Sets.newTreeSet(Arrays.asList(configuration.getStringArray(CoreProperties.BATCH_INCLUDE_PLUGINS))); + if (settings.hasKey(CoreProperties.BATCH_INCLUDE_PLUGINS)) { + whiteList = Sets.newTreeSet(Arrays.asList(settings.getStringArray(CoreProperties.BATCH_INCLUDE_PLUGINS))); LOG.info("Include plugins: " + Joiner.on(", ").join(whiteList)); } - if (configuration.getString(CoreProperties.BATCH_EXCLUDE_PLUGINS) != null) { - blackList = Sets.newTreeSet(Arrays.asList(configuration.getStringArray(CoreProperties.BATCH_EXCLUDE_PLUGINS))); + if (settings.hasKey(CoreProperties.BATCH_EXCLUDE_PLUGINS)) { + blackList = Sets.newTreeSet(Arrays.asList(settings.getStringArray(CoreProperties.BATCH_EXCLUDE_PLUGINS))); LOG.info("Exclude plugins: " + Joiner.on(", ").join(blackList)); } // TODO reactivate somewhere else: LOG.info("Execution environment: {} {}", environment.getKey(), environment.getVersion()); @@ -133,4 +133,14 @@ public class BatchPluginRepository implements PluginRepository { } return blackList == null || !blackList.contains(pluginKey); } + + public Map<PluginMetadata,Plugin> getPluginsByMetadata() { + Map<PluginMetadata, Plugin> result = Maps.newHashMap(); + for (Map.Entry<String, PluginMetadata> entry : metadataByKey.entrySet()) { + String pluginKey = entry.getKey(); + PluginMetadata metadata = entry.getValue(); + result.put(metadata, pluginsByKey.get(pluginKey)); + } + return result; + } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java index 2c925b71674..ce6985b8c2e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java @@ -19,13 +19,15 @@ */ package org.sonar.batch.bootstrap; -import org.apache.commons.configuration.Configuration; -import org.sonar.api.Plugin; +import org.apache.commons.configuration.PropertiesConfiguration; import org.sonar.api.batch.bootstrap.ProjectReactor; +import org.sonar.api.config.Settings; import org.sonar.api.utils.HttpDownloader; import org.sonar.batch.FakeMavenPluginExecutor; import org.sonar.batch.MavenPluginExecutor; import org.sonar.batch.ServerMetadata; +import org.sonar.batch.config.BatchSettings; +import org.sonar.batch.config.BatchSettingsEnhancer; import org.sonar.jpa.session.DatabaseSessionProvider; import org.sonar.jpa.session.DriverDatabaseConnector; import org.sonar.jpa.session.ThreadLocalDatabaseSessionFactory; @@ -37,52 +39,52 @@ import java.net.URLClassLoader; */ public class BootstrapModule extends Module { - private Configuration configuration; private Object[] boostrapperComponents; private ProjectReactor reactor; - public BootstrapModule(ProjectReactor reactor, Configuration configuration, Object... boostrapperComponents) { + public BootstrapModule(ProjectReactor reactor, Object... boostrapperComponents) { this.reactor = reactor; - this.configuration = configuration; this.boostrapperComponents = boostrapperComponents; } @Override protected void configure() { - addComponent(reactor); - addComponent(configuration);// this configuration does not access database - addComponent(DryRun.class); - addComponent(ServerMetadata.class);// registered here because used by BootstrapClassLoader - addComponent(TempDirectories.class);// registered here because used by BootstrapClassLoader - addComponent(HttpDownloader.class);// registered here because used by BootstrapClassLoader - addComponent(ArtifactDownloader.class);// registered here because used by BootstrapClassLoader - addComponent(JdbcDriverHolder.class); + addCoreSingleton(reactor); + addCoreSingleton(new PropertiesConfiguration()); + addCoreSingleton(BatchSettings.class); + addCoreSingleton(DryRun.class); + addCoreSingleton(ServerMetadata.class);// registered here because used by BootstrapClassLoader + addCoreSingleton(TempDirectories.class);// registered here because used by BootstrapClassLoader + addCoreSingleton(HttpDownloader.class);// registered here because used by BootstrapClassLoader + addCoreSingleton(ArtifactDownloader.class);// registered here because used by BootstrapClassLoader + addCoreSingleton(JdbcDriverHolder.class); - URLClassLoader bootstrapClassLoader = getComponent(JdbcDriverHolder.class).getClassLoader(); + URLClassLoader bootstrapClassLoader = getComponentByType(JdbcDriverHolder.class).getClassLoader(); // set as the current context classloader for hibernate, else it does not find the JDBC driver. Thread.currentThread().setContextClassLoader(bootstrapClassLoader); - addComponent(new DriverDatabaseConnector(configuration, bootstrapClassLoader)); - addComponent(ThreadLocalDatabaseSessionFactory.class); + addCoreSingleton(new DriverDatabaseConnector(getComponentByType(Settings.class), bootstrapClassLoader)); + addCoreSingleton(ThreadLocalDatabaseSessionFactory.class); addAdapter(new DatabaseSessionProvider()); for (Object component : boostrapperComponents) { - addComponent(component); + addCoreSingleton(component); } if (!isMavenPluginExecutorRegistered()) { - addComponent(FakeMavenPluginExecutor.class); + addCoreSingleton(FakeMavenPluginExecutor.class); } - // LIMITATION : list of plugins to download is currently loaded from database. It should be loaded from - // remote HTTP index. - addComponent(BatchPluginRepository.class); - addComponent(BatchExtensionInstaller.class); - addComponent(ProjectExtensionInstaller.class); + addCoreSingleton(BatchPluginRepository.class); + addCoreSingleton(BatchExtensionInstaller.class); + addCoreSingleton(ProjectExtensionInstaller.class); + addCoreSingleton(BatchSettingsEnhancer.class); } boolean isMavenPluginExecutorRegistered() { - for (Object component : boostrapperComponents) { - if (component instanceof Class && MavenPluginExecutor.class.isAssignableFrom((Class<?>) component)) { - return true; + if (boostrapperComponents != null) { + for (Object component : boostrapperComponents) { + if (component instanceof Class && MavenPluginExecutor.class.isAssignableFrom((Class<?>) component)) { + return true; + } } } return false; @@ -90,19 +92,8 @@ public class BootstrapModule extends Module { @Override protected void doStart() { - addPlugins(); - boolean dryRun = getComponent(DryRun.class).isEnabled(); + boolean dryRun = getComponentByType(DryRun.class).isEnabled(); Module batchComponents = installChild(new BatchModule(dryRun)); batchComponents.start(); } - - private void addPlugins() { - // Plugins have been loaded during the startup of BatchPluginRepository. - // In a perfect world BatchPluginRepository should be a factory which injects new components into container, but - // (it seems that) this feature does not exist in PicoContainer. - // Limitation: the methods start() and stop() are not called on org.sonar.api.Plugin instances. - for (Plugin plugin : getComponent(BatchPluginRepository.class).getPlugins()) { - addComponent(plugin); - } - } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DryRun.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DryRun.java index c269fc6b126..c3a96ab63de 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DryRun.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/DryRun.java @@ -19,14 +19,17 @@ */ package org.sonar.batch.bootstrap; -import org.apache.commons.configuration.Configuration; +import org.sonar.api.BatchComponent; +import org.sonar.api.Property; +import org.sonar.api.config.Settings; import org.sonar.api.utils.Logs; -public class DryRun { +@Property(key="sonar.dryRun", defaultValue = "false", name="Dry Run") +public class DryRun implements BatchComponent { private boolean enabled; - public DryRun(Configuration conf) { - enabled = conf.getBoolean("sonar.dryRun", Boolean.FALSE); + public DryRun(Settings settings) { + enabled = settings.getBoolean("sonar.dryRun"); if (enabled) { Logs.INFO.info("Dry run"); } 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 df9991e89a5..bba921ab6de 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 @@ -19,10 +19,9 @@ */ package org.sonar.batch.bootstrap; -import org.picocontainer.Characteristics; import org.picocontainer.ComponentAdapter; -import org.picocontainer.MutablePicoContainer; -import org.sonar.api.utils.IocContainer; +import org.sonar.api.platform.ComponentContainer; +import org.sonar.api.platform.PluginMetadata; import java.util.List; @@ -33,20 +32,19 @@ import java.util.List; */ public abstract class Module { - private MutablePicoContainer container; - + ComponentContainer container; /** * @return this */ public final Module init() { - return init(IocContainer.buildPicoContainer()); + return init(new ComponentContainer()); } /** * @return this */ - private Module init(MutablePicoContainer container) { + private Module init(ComponentContainer container) { this.container = container; configure(); return this; @@ -68,24 +66,23 @@ public abstract class Module { * @return installed module */ public final Module installChild(Module child) { - MutablePicoContainer childContainer = container.makeChildContainer(); + ComponentContainer childContainer = container.createChild(); // register container as a component, because it used for example in BatchExtensionDictionnary, // but in fact this is anti-pattern - http://picocontainer.codehaus.org/container-dependency-antipattern.html - childContainer.addComponent(new IocContainer(childContainer)); - childContainer.setName(child.toString()); + //childContainer.addComponent(new IocContainer(childContainer)); child.init(childContainer); return child; } - public final void uninstallChild(Module child) { - container.removeChildContainer(child.container); + public final void uninstallChild() { + container.removeChild(); } /** * @return this */ public final Module start() { - container.start(); + container.startComponents(); doStart(); return this; } @@ -100,7 +97,7 @@ public abstract class Module { public final Module stop() { try { doStop(); - container.stop(); + container.stopComponents(); } catch (Exception e) { // ignore } @@ -113,39 +110,43 @@ public abstract class Module { /** * Implementation of this method must not contain conditional logic and just should contain several invocations of - * {@link #addComponent(Object)}, {@link #addComponent(Object, Object)} or {@link #addAdapter(ComponentAdapter)}. + * {@link #addCoreSingleton(Object)}, {@link #addComponent(Object, Object)} or {@link #addAdapter(ComponentAdapter)}. */ protected abstract void configure(); - protected final void addComponent(Object component) { - if (component instanceof Class) { - container.as(Characteristics.CACHE).addComponent(component); - } else { - container.as(Characteristics.CACHE).addComponent(component.getClass().getCanonicalName() + "-" + component.toString(), component); - } + protected final void addCoreSingleton(Object component) { + container.addSingleton(component); } - protected final void addComponent(Object componentKey, Object component) { - container.as(Characteristics.CACHE).addComponent(componentKey, component); + protected final void declareExtension(PluginMetadata plugin, Object extension) { + container.declareExtension(plugin, extension); + } + + protected final void addExtension(PluginMetadata plugin, Object extension) { + container.addExtension(plugin, extension); } protected final void addAdapter(ComponentAdapter<?> componentAdapter) { - container.addAdapter(componentAdapter); + container.addPicoAdapter(componentAdapter); } - public final <T> T getComponent(Class<T> componentType) { - return container.getComponent(componentType); + public final <T> T getComponentByType(Class<T> componentType) { + return container.getComponentByType(componentType); } - public final <T> List<T> getComponents(Class<T> componentType) { - return container.getComponents(componentType); + public final Object getComponentByKey(Object key) { + return container.getComponentByKey(key); } - /** - * TODO should not be used and should be removed - */ - public final MutablePicoContainer getContainer() { - return container; + public final <T> List<T> getComponents(Class<T> componentType) { + return container.getComponentsByType(componentType); } +// /** +// * TODO should not be used and should be removed +// */ +// public final MutablePicoContainer getContainer() { +// return container; +// } + } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectExtensionInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectExtensionInstaller.java index 0ec164f7ca4..145d971387e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectExtensionInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectExtensionInstaller.java @@ -77,7 +77,7 @@ public final class ProjectExtensionInstaller implements BatchComponent { ExtensionUtils.checkDryRun(extension, dryRun.isEnabled()) && !isDeactivatedCoverageExtension(extension, project, pluginKey) && !isMavenExtensionOnEmulatedMavenProject(extension, project)) { - module.addComponent(extension); + module.addCoreSingleton(extension); return extension; } return null; diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java index c54b8d6d126..5381fc093ed 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java @@ -29,16 +29,21 @@ import org.sonar.api.resources.Languages; import org.sonar.api.resources.Project; import org.sonar.api.resources.ProjectFileSystem; import org.sonar.api.rules.DefaultRulesManager; +import org.sonar.api.utils.IocContainer; import org.sonar.api.utils.SonarException; import org.sonar.batch.*; import org.sonar.batch.components.TimeMachineConfiguration; +import org.sonar.batch.config.DeprecatedConfigurationProvider; +import org.sonar.batch.config.ProjectSettings; import org.sonar.batch.events.EventBus; import org.sonar.batch.index.DefaultIndex; import org.sonar.batch.index.DefaultResourcePersister; import org.sonar.batch.phases.Phases; import org.sonar.batch.phases.PhasesTimeProfiler; import org.sonar.core.components.DefaultModelFinder; -import org.sonar.jpa.dao.*; +import org.sonar.jpa.dao.DaoFacade; +import org.sonar.jpa.dao.ProfilesDao; +import org.sonar.jpa.dao.RulesDao; import java.util.Arrays; @@ -62,49 +67,52 @@ public class ProjectModule extends Module { private void addProjectComponents() { - ProjectDefinition projectDefinition = getComponent(ProjectTree.class).getProjectDefinition(project); - addComponent(projectDefinition); + ProjectDefinition projectDefinition = getComponentByType(ProjectTree.class).getProjectDefinition(project); + addCoreSingleton(projectDefinition); + addCoreSingleton(project); + addCoreSingleton(project.getConfiguration()); + addCoreSingleton(ProjectSettings.class); + addAdapter(new DeprecatedConfigurationProvider()); + addCoreSingleton(IocContainer.class); + for (Object component : projectDefinition.getContainerExtensions()) { - addComponent(component); + addCoreSingleton(component); } - - addComponent(project); - addComponent(project.getConfiguration()); - addComponent(DefaultProjectClasspath.class); - addComponent(DefaultProjectFileSystem2.class); - addComponent(DaoFacade.class); - addComponent(RulesDao.class); + addCoreSingleton(DefaultProjectClasspath.class); + addCoreSingleton(DefaultProjectFileSystem2.class); + addCoreSingleton(DaoFacade.class); + addCoreSingleton(RulesDao.class); if (!dryRun) { // the Snapshot component will be removed when asynchronous measures are improved (required for AsynchronousMeasureSensor) - addComponent(getComponent(DefaultResourcePersister.class).getSnapshot(project)); + addCoreSingleton(getComponentByType(DefaultResourcePersister.class).getSnapshot(project)); } - addComponent(TimeMachineConfiguration.class); - addComponent(org.sonar.api.database.daos.MeasuresDao.class); - addComponent(ProfilesDao.class); - addComponent(DefaultRulesManager.class); - addComponent(DefaultSensorContext.class); - addComponent(Languages.class); - addComponent(BatchExtensionDictionnary.class); - addComponent(DefaultTimeMachine.class); - addComponent(ViolationFilters.class); - addComponent(ResourceFilters.class); - addComponent(DefaultModelFinder.class); - addComponent(ProfileLoader.class, DefaultProfileLoader.class); + addCoreSingleton(TimeMachineConfiguration.class); + addCoreSingleton(org.sonar.api.database.daos.MeasuresDao.class); + addCoreSingleton(ProfilesDao.class); + addCoreSingleton(DefaultRulesManager.class); + addCoreSingleton(DefaultSensorContext.class); + addCoreSingleton(Languages.class); + addCoreSingleton(BatchExtensionDictionnary.class); + addCoreSingleton(DefaultTimeMachine.class); + addCoreSingleton(ViolationFilters.class); + addCoreSingleton(ResourceFilters.class); + addCoreSingleton(DefaultModelFinder.class); + addCoreSingleton(DefaultProfileLoader.class); addAdapter(new ProfileProvider()); } private void addCoreComponents() { - addComponent(EventBus.class); - addComponent(Phases.class); - addComponent(PhasesTimeProfiler.class); + addCoreSingleton(EventBus.class); + addCoreSingleton(Phases.class); + addCoreSingleton(PhasesTimeProfiler.class); for (Class clazz : Phases.getPhaseClasses(dryRun)) { - addComponent(clazz); + addCoreSingleton(clazz); } } private void addProjectPluginExtensions() { - ProjectExtensionInstaller installer = getComponent(ProjectExtensionInstaller.class); + ProjectExtensionInstaller installer = getComponentByType(ProjectExtensionInstaller.class); installer.install(this, project); } @@ -124,22 +132,22 @@ public class ProjectModule extends Module { */ @Override protected void doStart() { - Language language = getComponent(Languages.class).get(project.getLanguageKey()); + Language language = getComponentByType(Languages.class).get(project.getLanguageKey()); if (language == null) { throw new SonarException("Language with key '" + project.getLanguageKey() + "' not found"); } project.setLanguage(language); - DefaultIndex index = getComponent(DefaultIndex.class); + DefaultIndex index = getComponentByType(DefaultIndex.class); index.setCurrentProject(project, - getComponent(ResourceFilters.class), - getComponent(ViolationFilters.class), - getComponent(RulesProfile.class)); + getComponentByType(ResourceFilters.class), + getComponentByType(ViolationFilters.class), + getComponentByType(RulesProfile.class)); // TODO See http://jira.codehaus.org/browse/SONAR-2126 // previously MavenProjectBuilder was responsible for creation of ProjectFileSystem - project.setFileSystem(getComponent(ProjectFileSystem.class)); + project.setFileSystem(getComponentByType(ProjectFileSystem.class)); - getComponent(Phases.class).execute(project); + getComponentByType(Phases.class).execute(project); } } |