diff options
9 files changed, 21 insertions, 106 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/DecoratorsSelector.java b/sonar-batch/src/main/java/org/sonar/batch/DecoratorsSelector.java index b96e0d648da..3bfbabdc31b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/DecoratorsSelector.java +++ b/sonar-batch/src/main/java/org/sonar/batch/DecoratorsSelector.java @@ -23,7 +23,6 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import org.sonar.api.batch.BatchExtensionDictionnary; import org.sonar.api.batch.Decorator; -import org.sonar.api.batch.TaskExtensionDictionnary; import org.sonar.api.measures.Metric; import org.sonar.api.resources.Project; @@ -34,17 +33,15 @@ import java.util.List; public final class DecoratorsSelector { private BatchExtensionDictionnary batchExtDictionnary; - private TaskExtensionDictionnary taskExtDictionnary; - public DecoratorsSelector(TaskExtensionDictionnary taskExtDictionnary, BatchExtensionDictionnary dictionnary) { - this.taskExtDictionnary = taskExtDictionnary; + public DecoratorsSelector(BatchExtensionDictionnary dictionnary) { this.batchExtDictionnary = dictionnary; } public Collection<Decorator> select(Project project) { List<Decorator> decorators = new ArrayList<Decorator>(batchExtDictionnary.select(Decorator.class, project, false)); SetMultimap<Metric, Decorator> decoratorsByGeneratedMetric = getDecoratorsByMetric(decorators); - for (Metric metric : taskExtDictionnary.select(Metric.class)) { + for (Metric metric : batchExtDictionnary.select(Metric.class)) { if (metric.getFormula() != null) { decorators.add(new FormulaDecorator(metric, decoratorsByGeneratedMetric.get(metric))); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java index de66cbbf39a..e01292dc88f 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AbstractTaskModule.java @@ -22,7 +22,6 @@ package org.sonar.batch.bootstrap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.TaskDefinition; -import org.sonar.api.batch.TaskExtensionDictionnary; import org.sonar.api.config.EmailSettings; import org.sonar.api.resources.ResourceTypes; import org.sonar.batch.DefaultResourceCreationLock; @@ -109,9 +108,7 @@ public abstract class AbstractTaskModule extends Module { container.addSingleton(DefaultNotificationManager.class); container.addSingleton(DefaultUserFinder.class); container.addSingleton(ResourceTypes.class); - container.addSingleton(MetricProvider.class); container.addSingleton(SemaphoresImpl.class); - container.addSingleton(TaskExtensionDictionnary.class); } private void registerDatabaseComponents() { diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java index 74aff0245da..8257522b12b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/AnalyseProjectModule.java @@ -32,10 +32,12 @@ public class AnalyseProjectModule extends Module { @Override protected void configure() { - registerBatchExtensions(); + container.addSingleton(MetricProvider.class); + + registerPerBatchExtensions(); } - private void registerBatchExtensions() { + private void registerPerBatchExtensions() { ExtensionInstaller installer = container.getComponentByType(ExtensionInstaller.class); installer.installBatchExtensions(container, InstantiationStrategy.PER_BATCH); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java index 0cf3af16bc2..9df02c89559 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/MetricProvider.java @@ -21,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.TaskExtension; +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 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/phases/DecoratorsExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java index 0a298869676..e9a3a185078 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java @@ -25,7 +25,6 @@ import org.sonar.api.batch.BatchExtensionDictionnary; import org.sonar.api.batch.Decorator; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.SonarIndex; -import org.sonar.api.batch.TaskExtensionDictionnary; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; import org.sonar.api.utils.SonarException; @@ -43,9 +42,9 @@ public class DecoratorsExecutor implements BatchComponent { private EventBus eventBus; private Project project; - public DecoratorsExecutor(TaskExtensionDictionnary taskExtDictionnary, BatchExtensionDictionnary batchExtDictionnary, + public DecoratorsExecutor(BatchExtensionDictionnary batchExtDictionnary, Project project, SonarIndex index, EventBus eventBus) { - this.decoratorsSelector = new DecoratorsSelector(taskExtDictionnary, batchExtDictionnary); + this.decoratorsSelector = new DecoratorsSelector(batchExtDictionnary); this.index = index; this.eventBus = eventBus; this.project = project; diff --git a/sonar-batch/src/test/java/org/sonar/batch/DecoratorsSelectorTest.java b/sonar-batch/src/test/java/org/sonar/batch/DecoratorsSelectorTest.java index ecb9a9bb8df..4cbb299f9c9 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/DecoratorsSelectorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/DecoratorsSelectorTest.java @@ -25,7 +25,6 @@ import org.sonar.api.batch.BatchExtensionDictionnary; import org.sonar.api.batch.Decorator; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DependedUpon; -import org.sonar.api.batch.TaskExtensionDictionnary; import org.sonar.api.measures.Formula; import org.sonar.api.measures.FormulaContext; import org.sonar.api.measures.FormulaData; @@ -52,10 +51,9 @@ public class DecoratorsSelectorTest { @Test public void selectAndSortFormulas() { Project project = new Project("key"); - TaskExtensionDictionnary taskExtDictionnary = newTaskDictionnary(withFormula1, withoutFormula3, withFormula2); - BatchExtensionDictionnary batchExtDictionnary = newBatchDictionnary(); + BatchExtensionDictionnary batchExtDictionnary = newBatchDictionnary(withFormula1, withoutFormula3, withFormula2); - Collection<Decorator> decorators = new DecoratorsSelector(taskExtDictionnary, batchExtDictionnary).select(project); + Collection<Decorator> decorators = new DecoratorsSelector(batchExtDictionnary).select(project); assertThat(decorators.size(), is(2)); assertThat(decorators, hasItem((Decorator) new FormulaDecorator(withFormula1))); assertThat(decorators, hasItem((Decorator) new FormulaDecorator(withFormula2))); @@ -65,10 +63,9 @@ public class DecoratorsSelectorTest { public void decoratorsShouldBeExecutedBeforeFormulas() { Project project = new Project("key"); Decorator metric1Decorator = new Metric1Decorator(); - TaskExtensionDictionnary taskExtDictionnary = newTaskDictionnary(withFormula1); - BatchExtensionDictionnary batchExtDictionnary = newBatchDictionnary(metric1Decorator); + BatchExtensionDictionnary batchExtDictionnary = newBatchDictionnary(withFormula1, metric1Decorator); - Collection<Decorator> decorators = new DecoratorsSelector(taskExtDictionnary, batchExtDictionnary).select(project); + Collection<Decorator> decorators = new DecoratorsSelector(batchExtDictionnary).select(project); Decorator firstDecorator = (Decorator) CollectionUtils.get(decorators, 0); Decorator secondDecorator = (Decorator) CollectionUtils.get(decorators, 1); @@ -81,14 +78,6 @@ public class DecoratorsSelectorTest { assertThat(CollectionUtils.get(formulaDecorator.dependsUponDecorators(), 0), is((Object) firstDecorator)); } - private TaskExtensionDictionnary newTaskDictionnary(Object... extensions) { - ComponentContainer ioc = new ComponentContainer(); - for (Object extension : extensions) { - ioc.addSingleton(extension); - } - return new TaskExtensionDictionnary(ioc); - } - private BatchExtensionDictionnary newBatchDictionnary(Object... extensions) { ComponentContainer ioc = new ComponentContainer(); for (Object extension : extensions) { diff --git a/sonar-batch/src/test/java/org/sonar/batch/phases/DecoratorsExecutorTest.java b/sonar-batch/src/test/java/org/sonar/batch/phases/DecoratorsExecutorTest.java index 966f9cf0c1e..c55d83722a7 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/phases/DecoratorsExecutorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/phases/DecoratorsExecutorTest.java @@ -24,7 +24,6 @@ import org.sonar.api.batch.BatchExtensionDictionnary; import org.sonar.api.batch.Decorator; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.SonarIndex; -import org.sonar.api.batch.TaskExtensionDictionnary; import org.sonar.api.resources.File; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; @@ -66,7 +65,7 @@ public class DecoratorsExecutorTest { Decorator decorator = mock(Decorator.class); doThrow(new SonarException()).when(decorator).decorate(any(Resource.class), any(DecoratorContext.class)); - DecoratorsExecutor executor = new DecoratorsExecutor(mock(TaskExtensionDictionnary.class), mock(BatchExtensionDictionnary.class), new Project("key"), mock(SonarIndex.class), + DecoratorsExecutor executor = new DecoratorsExecutor(mock(BatchExtensionDictionnary.class), new Project("key"), mock(SonarIndex.class), mock(EventBus.class)); try { executor.executeDecorator(decorator, mock(DefaultDecoratorContext.class), new File("org/foo/Bar.java")); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/TaskExtensionDictionnary.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/TaskExtensionDictionnary.java deleted file mode 100644 index 5d0fa31ca03..00000000000 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/TaskExtensionDictionnary.java +++ /dev/null @@ -1,72 +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.api.batch; - -import com.google.common.collect.Lists; -import org.apache.commons.lang.ClassUtils; -import org.sonar.api.TaskExtension; -import org.sonar.api.platform.ComponentContainer; - -import java.util.Collection; -import java.util.List; - -/** - * @since 3.5 - */ -public class TaskExtensionDictionnary { - - private ComponentContainer componentContainer; - - public TaskExtensionDictionnary(ComponentContainer componentContainer) { - this.componentContainer = componentContainer; - } - - public <T> Collection<T> select(Class<T> type) { - List<T> result = getFilteredExtensions(type); - return result; - } - - private List<TaskExtension> getExtensions() { - 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) { - List<T> result = Lists.newArrayList(); - for (TaskExtension extension : getExtensions()) { - if (shouldKeep(type, extension)) { - result.add((T) extension); - } - } - return result; - } - - private boolean shouldKeep(Class type, Object extension) { - return ClassUtils.isAssignable(extension.getClass(), type); - } -} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java b/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java index 06391845a31..1c96d1535e7 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java @@ -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.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 |