aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch/src/main/java/org/sonar/batch/bootstrap
diff options
context:
space:
mode:
authorsimonbrandhof <simon.brandhof@gmail.com>2011-10-05 00:44:37 +0200
committerSimon Brandhof <simon.brandhof@gmail.com>2011-10-07 13:36:25 +0200
commitef5bf7fdece84e5a52c8d478c8a733ecdf4d57f1 (patch)
treec64a8a041183379e92fbc81becc77af07c9b38e3 /sonar-batch/src/main/java/org/sonar/batch/bootstrap
parent3174a29201e922db758b51f4b693ca131e7037ec (diff)
downloadsonarqube-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')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java65
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java62
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java22
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java67
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/DryRun.java11
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/Module.java67
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectExtensionInstaller.java2
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java80
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);
}
}