diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2022-02-01 15:16:25 -0600 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-02-22 20:02:46 +0000 |
commit | 60c1a4038e041a342dda9810e6fd761d66b01bdb (patch) | |
tree | 0e76b4252e4d7d257cf4ddcb6f081996bb1e03ab /server/sonar-ce-task-projectanalysis | |
parent | 9694d4113bf401b84e86e0223dbea8f5339388d8 (diff) | |
download | sonarqube-60c1a4038e041a342dda9810e6fd761d66b01bdb.tar.gz sonarqube-60c1a4038e041a342dda9810e6fd761d66b01bdb.zip |
SONAR-15994 Migrate Sonarqube IOC framework from Pico to Spring
Diffstat (limited to 'server/sonar-ce-task-projectanalysis')
37 files changed, 309 insertions, 346 deletions
diff --git a/server/sonar-ce-task-projectanalysis/build.gradle b/server/sonar-ce-task-projectanalysis/build.gradle index b6d0b390b0d..bca65c795f6 100644 --- a/server/sonar-ce-task-projectanalysis/build.gradle +++ b/server/sonar-ce-task-projectanalysis/build.gradle @@ -29,7 +29,6 @@ dependencies { compile 'com.google.protobuf:protobuf-java' compile 'com.googlecode.java-diff-utils:diffutils' compile 'org.mybatis:mybatis' - compile 'org.picocontainer:picocontainer' compile project(':sonar-core') compile project(':server:sonar-ce-common') diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java index 3ede8d76372..b7ec255e4b0 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java @@ -72,14 +72,6 @@ public class PostProjectAnalysisTasksExecutor implements ComputationStepExecutor private final PostProjectAnalysisTask[] postProjectAnalysisTasks; private final BatchReportReader reportReader; - /** - * Constructor used by Pico when there is no {@link PostProjectAnalysisTask} in the container. - */ - public PostProjectAnalysisTasksExecutor(org.sonar.ce.task.CeTask ceTask, AnalysisMetadataHolder analysisMetadataHolder, - QualityGateHolder qualityGateHolder, QualityGateStatusHolder qualityGateStatusHolder, BatchReportReader reportReader) { - this(ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader, null); - } - public PostProjectAnalysisTasksExecutor(org.sonar.ce.task.CeTask ceTask, AnalysisMetadataHolder analysisMetadataHolder, QualityGateHolder qualityGateHolder, QualityGateStatusHolder qualityGateStatusHolder, BatchReportReader reportReader, @Nullable PostProjectAnalysisTask[] postProjectAnalysisTasks) { this.analysisMetadataHolder = analysisMetadataHolder; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/BranchLoader.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/BranchLoader.java index b9253ca5213..3eb24b243ac 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/BranchLoader.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/BranchLoader.java @@ -19,13 +19,14 @@ */ package org.sonar.ce.task.projectanalysis.component; -import javax.annotation.Nullable; import org.sonar.api.utils.MessageException; import org.sonar.ce.task.projectanalysis.analysis.MutableAnalysisMetadataHolder; import org.sonar.scanner.protocol.output.ScannerReport; - import static org.sonar.scanner.protocol.output.ScannerReport.Metadata.BranchType.UNSET; +import javax.annotation.Nullable; +import javax.inject.Inject; + public class BranchLoader { private final MutableAnalysisMetadataHolder metadataHolder; private final BranchLoaderDelegate delegate; @@ -34,6 +35,7 @@ public class BranchLoader { this(metadataHolder, null); } + @Inject public BranchLoader(MutableAnalysisMetadataHolder metadataHolder, @Nullable BranchLoaderDelegate delegate) { this.metadataHolder = metadataHolder; this.delegate = delegate; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactory.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactory.java index 12638017f9f..7ceb456ab12 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactory.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactory.java @@ -22,9 +22,9 @@ package org.sonar.ce.task.projectanalysis.container; import javax.annotation.Nullable; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.container.TaskContainer; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; public interface ContainerFactory { - TaskContainer create(ComponentContainer parent, CeTask task, @Nullable ReportAnalysisComponentProvider[] componentProviders); + TaskContainer create(SpringComponentContainer parent, CeTask task, @Nullable ReportAnalysisComponentProvider[] componentProviders); } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactoryImpl.java index c6635e05877..7e58e1b22ed 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactoryImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ContainerFactoryImpl.java @@ -23,11 +23,11 @@ import javax.annotation.Nullable; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.container.TaskContainerImpl; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; public class ContainerFactoryImpl implements ContainerFactory { @Override - public TaskContainer create(ComponentContainer parent, CeTask task, @Nullable ReportAnalysisComponentProvider[] componentProviders) { + public TaskContainer create(SpringComponentContainer parent, CeTask task, @Nullable ReportAnalysisComponentProvider[] componentProviders) { return new TaskContainerImpl(parent, new ProjectAnalysisTaskContainerPopulator(task, componentProviders)); } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java index 4764a7a9446..faa28a22ba6 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java @@ -165,15 +165,15 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop container.add(SettingsLoader.class); container.add(task); container.add(steps); - container.addSingletons(componentClasses()); + container.add(componentClasses()); for (ReportAnalysisComponentProvider componentProvider : componentProviders) { - container.addSingletons(componentProvider.getComponents()); + container.add(componentProvider.getComponents()); } - container.addSingletons(steps.orderedStepClasses()); + container.add(steps.orderedStepClasses()); } /** - * List of all objects to be injected in the picocontainer dedicated to computation stack. + * List of all objects to be injected in the ioc container dedicated to computation stack. * Does not contain the steps declared in {@link ReportComputationSteps#orderedStepClasses()}. */ private static List<Object> componentClasses() { @@ -191,7 +191,7 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop new ComputationTempFolderProvider(), ReportModulesPath.class, - MetricModule.class, + new MetricModule(), // holders AnalysisMetadataHolderImpl.class, diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/CrossProjectDuplicationStatusHolderImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/CrossProjectDuplicationStatusHolderImpl.java index 3ba3eec0daf..0091e343184 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/CrossProjectDuplicationStatusHolderImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/CrossProjectDuplicationStatusHolderImpl.java @@ -20,7 +20,7 @@ package org.sonar.ce.task.projectanalysis.duplication; import javax.annotation.CheckForNull; -import org.picocontainer.Startable; +import org.sonar.api.Startable; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasures.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasures.java index f180f5a5bbb..103ef9dd4ce 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasures.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasures.java @@ -26,6 +26,7 @@ import java.util.Optional; import java.util.Set; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import javax.inject.Inject; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.PathAwareCrawler; import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; @@ -53,6 +54,7 @@ public class DuplicationMeasures { protected final MeasureRepository measureRepository; private final DuplicationRepository duplicationRepository; + @Inject public DuplicationMeasures(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, @Nullable DuplicationRepository duplicationRepository) { this.treeRootHolder = treeRootHolder; @@ -63,9 +65,6 @@ public class DuplicationMeasures { this.formulas = List.of(new DuplicationFormula()); } - /** - * Constructor used by Pico in Views where no DuplicationRepository is available. - */ public DuplicationMeasures(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository) { this(treeRootHolder, metricRepository, measureRepository, null); } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProvider.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProvider.java index 49487780cf3..90ef49f2328 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProvider.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProvider.java @@ -21,64 +21,27 @@ package org.sonar.ce.task.projectanalysis.filesystem; import java.io.File; import java.io.IOException; -import javax.annotation.CheckForNull; import org.apache.commons.io.FileUtils; -import org.picocontainer.ComponentLifecycle; -import org.picocontainer.PicoContainer; -import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.impl.utils.DefaultTempFolder; import org.sonar.api.utils.TempFolder; import org.sonar.server.platform.ServerFileSystem; +import org.springframework.context.annotation.Bean; /** * Provides a TempFolder instance pointing to a directory dedicated to the processing of a specific item. * This directory will be deleted at the end of the processing. * This directory is located in the "ce" directory of the temp directory of the SonarQube instance. */ -public class ComputationTempFolderProvider extends ProviderAdapter implements ComponentLifecycle<TempFolder> { - private boolean started = false; - @CheckForNull - private DefaultTempFolder tempFolder = null; - +public class ComputationTempFolderProvider { + @Bean("ComputationTempFolder") public TempFolder provide(ServerFileSystem fs) { - if (this.tempFolder == null) { - File tempDir = new File(fs.getTempDir(), "ce"); - try { - FileUtils.forceMkdir(tempDir); - } catch (IOException e) { - throw new IllegalStateException("Unable to create computation temp directory " + tempDir, e); - } - File computationDir = new DefaultTempFolder(tempDir).newDir(); - this.tempFolder = new DefaultTempFolder(computationDir, true); + File tempDir = new File(fs.getTempDir(), "ce"); + try { + FileUtils.forceMkdir(tempDir); + } catch (IOException e) { + throw new IllegalStateException("Unable to create computation temp directory " + tempDir, e); } - return this.tempFolder; - } - - @Override - public void start(PicoContainer container) { - this.started = true; + File computationDir = new DefaultTempFolder(tempDir).newDir(); + return new DefaultTempFolder(computationDir, true); } - - @Override - public void stop(PicoContainer container) { - if (tempFolder != null) { - tempFolder.stop(); - } - } - - @Override - public void dispose(PicoContainer container) { - // nothing to do - } - - @Override - public boolean componentHasLifecycle() { - return true; - } - - @Override - public boolean isStarted() { - return started; - } - } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java index 60fa00dea49..b57b06cbd00 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java @@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import java.util.Date; import java.util.Optional; +import javax.inject.Inject; import org.sonar.api.issue.Issue; import org.sonar.api.rules.RuleType; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; @@ -54,6 +55,7 @@ public class IssueLifecycle { private final DebtCalculator debtCalculator; private final AnalysisMetadataHolder analysisMetadataHolder; + @Inject public IssueLifecycle(AnalysisMetadataHolder analysisMetadataHolder, IssueWorkflow workflow, IssueFieldsSetter updater, DebtCalculator debtCalculator, RuleRepository ruleRepository) { this(analysisMetadataHolder, IssueChangeContext.createScan(new Date(analysisMetadataHolder.getAnalysisDate())), workflow, updater, debtCalculator, ruleRepository); diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/ProtoIssueCache.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/ProtoIssueCache.java index 38a5c6373f4..c2e460dd80d 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/ProtoIssueCache.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/ProtoIssueCache.java @@ -19,18 +19,19 @@ */ package org.sonar.ce.task.projectanalysis.issue; -import java.io.File; import org.sonar.api.utils.System2; import org.sonar.api.utils.TempFolder; import org.sonar.ce.task.projectanalysis.util.cache.ProtobufIssueDiskCache; +import javax.inject.Inject; +import java.io.File; + /** * Cache of all the issues involved in the analysis. Their state is as it will be * persisted in database (after issue tracking, auto-assignment, ...) */ public class ProtoIssueCache extends ProtobufIssueDiskCache { - - // this constructor is used by picocontainer + @Inject public ProtoIssueCache(TempFolder tempFolder, System2 system2) { super(tempFolder.newFile("issues", ".dat"), system2); } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMerger.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMerger.java index cb9310473b4..2d4492bd066 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMerger.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMerger.java @@ -25,16 +25,19 @@ import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.tracking.SimpleTracker; import org.sonar.core.issue.tracking.Tracking; +import org.springframework.beans.factory.annotation.Autowired; public class SiblingsIssueMerger { private final SiblingsIssuesLoader siblingsIssuesLoader; private final SimpleTracker<DefaultIssue, SiblingIssue> tracker; private final IssueLifecycle issueLifecycle; + @Autowired(required = false) public SiblingsIssueMerger(SiblingsIssuesLoader resolvedSiblingsIssuesLoader, IssueLifecycle issueLifecycle) { this(resolvedSiblingsIssuesLoader, new SimpleTracker<>(), issueLifecycle); } + @Autowired(required = false) public SiblingsIssueMerger(SiblingsIssuesLoader siblingsIssuesLoader, SimpleTracker<DefaultIssue, SiblingIssue> tracker, IssueLifecycle issueLifecycle) { this.siblingsIssuesLoader = siblingsIssuesLoader; this.tracker = tracker; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/language/LanguageRepositoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/language/LanguageRepositoryImpl.java index 544766e1026..33a36e45fa4 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/language/LanguageRepositoryImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/language/LanguageRepositoryImpl.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Optional; import javax.annotation.Nonnull; import org.sonar.api.resources.Language; +import org.springframework.beans.factory.annotation.Autowired; import static com.google.common.base.Predicates.notNull; import static com.google.common.collect.Iterables.filter; @@ -38,10 +39,12 @@ public class LanguageRepositoryImpl implements LanguageRepository { private final Map<String, Language> languagesByKey; + @Autowired(required = false) public LanguageRepositoryImpl() { this.languagesByKey = Collections.emptyMap(); } + @Autowired(required = false) public LanguageRepositoryImpl(Language... languages) { this.languagesByKey = uniqueIndex(filter(asList(languages), notNull()), LanguageToKey.INSTANCE); } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java index a0826dea9a7..1cc12aa21dd 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java @@ -28,6 +28,7 @@ import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.projectanalysis.metric.Metric; import org.sonar.ce.task.projectanalysis.metric.MetricRepository; import org.sonar.ce.task.step.ComputationStep; +import org.springframework.beans.factory.annotation.Autowired; /** * Execute {@link PostMeasuresComputationCheck} instances in no specific order. @@ -43,6 +44,7 @@ public class PostMeasuresComputationChecksStep implements ComputationStep { private final AnalysisMetadataHolder analysisMetadataHolder; private final PostMeasuresComputationCheck[] extensions; + @Autowired(required = false) public PostMeasuresComputationChecksStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, AnalysisMetadataHolder analysisMetadataHolder, PostMeasuresComputationCheck[] extensions) { this.treeRootHolder = treeRootHolder; @@ -55,6 +57,7 @@ public class PostMeasuresComputationChecksStep implements ComputationStep { /** * Used when zero {@link PostMeasuresComputationCheck} are registered into container. */ + @Autowired(required = false) public PostMeasuresComputationChecksStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, AnalysisMetadataHolder analysisMetadataHolder) { this(treeRootHolder, metricRepository, measureRepository, analysisMetadataHolder, new PostMeasuresComputationCheck[0]); diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryImpl.java index dd122c1f692..c94934e0a3e 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/metric/MetricRepositoryImpl.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.CheckForNull; -import org.picocontainer.Startable; +import org.sonar.api.Startable; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.metric.MetricDto; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/AbstractComputationSteps.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/AbstractComputationSteps.java index ad981b68bba..708b35f6b7f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/AbstractComputationSteps.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/AbstractComputationSteps.java @@ -37,14 +37,6 @@ public abstract class AbstractComputationSteps implements ComputationSteps { @Override public Iterable<ComputationStep> instances() { - return Iterables.transform( - orderedStepClasses(), - input -> { - ComputationStep computationStepType = container.getComponentByType(input); - if (computationStepType == null) { - throw new IllegalStateException(String.format("Component not found: %s", input)); - } - return computationStepType; - }); + return Iterables.transform(orderedStepClasses(), container::getComponentByType); } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/CoverageMeasuresStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/CoverageMeasuresStep.java index 7d9ae017ac0..2db3a2d6e13 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/CoverageMeasuresStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/CoverageMeasuresStep.java @@ -20,6 +20,8 @@ package org.sonar.ce.task.projectanalysis.step; import java.util.List; +import javax.annotation.Nullable; +import javax.inject.Inject; import org.sonar.ce.task.projectanalysis.batch.BatchReportReader; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit; @@ -77,7 +79,8 @@ public class CoverageMeasuresStep implements ComputationStep { /** * Constructor used when processing a Report (ie. a {@link BatchReportReader} instance is available in the container) */ - public CoverageMeasuresStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, BatchReportReader reportReader) { + @Inject + public CoverageMeasuresStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, @Nullable BatchReportReader reportReader) { this.treeRootHolder = treeRootHolder; this.metricRepository = metricRepository; this.measureRepository = measureRepository; @@ -88,20 +91,6 @@ public class CoverageMeasuresStep implements ComputationStep { this.uncoveredConditionsMetric = metricRepository.getByKey(UNCOVERED_CONDITIONS_KEY); } - /** - * Constructor used when processing Views (ie. no {@link BatchReportReader} instance is available in the container) - */ - public CoverageMeasuresStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository) { - this.treeRootHolder = treeRootHolder; - this.metricRepository = metricRepository; - this.measureRepository = measureRepository; - this.linesToCoverMetric = metricRepository.getByKey(LINES_TO_COVER_KEY); - this.uncoveredLinesMetric = metricRepository.getByKey(UNCOVERED_LINES_KEY); - this.conditionsToCoverMetric = metricRepository.getByKey(CONDITIONS_TO_COVER_KEY); - this.uncoveredConditionsMetric = metricRepository.getByKey(UNCOVERED_CONDITIONS_KEY); - this.reportReader = null; - } - @Override public void execute(ComputationStep.Context context) { if (reportReader != null) { @@ -109,7 +98,7 @@ public class CoverageMeasuresStep implements ComputationStep { } new PathAwareCrawler<>( FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(COVERAGE_FORMULAS)) - .visit(treeRootHolder.getReportTreeRoot()); + .visit(treeRootHolder.getReportTreeRoot()); } private class FileCoverageVisitor extends TypeAwareVisitorAdapter { diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadMeasureComputersStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadMeasureComputersStep.java index 9f6e3b045ac..ee8d604da2d 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadMeasureComputersStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadMeasureComputersStep.java @@ -40,6 +40,7 @@ import org.sonar.ce.task.projectanalysis.api.measurecomputer.MeasureComputerDefi import org.sonar.ce.task.projectanalysis.api.measurecomputer.MeasureComputerWrapper; import org.sonar.ce.task.projectanalysis.measure.MutableMeasureComputersHolder; import org.sonar.ce.task.step.ComputationStep; +import org.springframework.beans.factory.annotation.Autowired; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.FluentIterable.from; @@ -53,6 +54,7 @@ public class LoadMeasureComputersStep implements ComputationStep { private final MutableMeasureComputersHolder measureComputersHolder; private final MeasureComputer[] measureComputers; + @Autowired(required = false) public LoadMeasureComputersStep(MutableMeasureComputersHolder measureComputersHolder, Metrics[] metricsRepositories, MeasureComputer[] measureComputers) { this.measureComputersHolder = measureComputersHolder; this.measureComputers = measureComputers; @@ -63,22 +65,25 @@ public class LoadMeasureComputersStep implements ComputationStep { } /** - * Constructor override used by Pico to instantiate the class when no plugin is defining metrics + * Constructor override used by the ioc container to instantiate the class when no plugin is defining metrics */ + @Autowired(required = false) public LoadMeasureComputersStep(MutableMeasureComputersHolder measureComputersHolder, MeasureComputer[] measureComputers) { this(measureComputersHolder, new Metrics[] {}, measureComputers); } /** - * Constructor override used by Pico to instantiate the class when no plugin is defining measure computers + * Constructor override used by the ioc container to instantiate the class when no plugin is defining measure computers */ + @Autowired(required = false) public LoadMeasureComputersStep(MutableMeasureComputersHolder measureComputersHolder, Metrics[] metricsRepositories) { this(measureComputersHolder, metricsRepositories, new MeasureComputer[] {}); } /** - * Constructor override used by Pico to instantiate the class when no plugin is defining metrics neither measure computers + * Constructor override used by the ioc container to instantiate the class when no plugin is defining metrics neither measure computers */ + @Autowired(required = false) public LoadMeasureComputersStep(MutableMeasureComputersHolder measureComputersHolder) { this(measureComputersHolder, new Metrics[] {}, new MeasureComputer[] {}); } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/TriggerViewRefreshStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/TriggerViewRefreshStep.java index b6333ee3bb4..60cb4bc9d10 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/TriggerViewRefreshStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/TriggerViewRefreshStep.java @@ -23,6 +23,7 @@ import java.util.OptionalInt; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.view.TriggerViewRefreshDelegate; import org.sonar.ce.task.step.ComputationStep; +import org.springframework.beans.factory.annotation.Autowired; /** * This step will trigger refresh of Portfolios and Applications that include the current project. @@ -34,16 +35,18 @@ public class TriggerViewRefreshStep implements ComputationStep { private final AnalysisMetadataHolder analysisMetadata; /** - * Constructor used by Pico when no implementation of {@link TriggerViewRefreshDelegate} is available + * Constructor used by the ioc container when no implementation of {@link TriggerViewRefreshDelegate} is available */ + @Autowired(required = false) public TriggerViewRefreshStep(AnalysisMetadataHolder analysisMetadata) { this.analysisMetadata = analysisMetadata; this.triggerViewRefreshDelegates = new TriggerViewRefreshDelegate[0]; } /** - * Constructor used by Pico when an implementation of {@link TriggerViewRefreshDelegate} is available + * Constructor used by the ioc container when an implementation of {@link TriggerViewRefreshDelegate} is available */ + @Autowired(required = false) public TriggerViewRefreshStep(AnalysisMetadataHolder analysisMetadata, TriggerViewRefreshDelegate[] triggerViewRefreshDelegates) { this.analysisMetadata = analysisMetadata; this.triggerViewRefreshDelegates = triggerViewRefreshDelegates; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessor.java index be26b4774f4..7f9163911ca 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessor.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessor.java @@ -31,18 +31,18 @@ import org.sonar.ce.task.projectanalysis.step.AbstractComputationSteps; import org.sonar.ce.task.step.ComputationStep; import org.sonar.ce.task.step.ComputationStepExecutor; import org.sonar.ce.task.taskprocessor.CeTaskProcessor; -import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.Container; import org.sonar.core.platform.ContainerPopulator; +import org.sonar.core.platform.SpringComponentContainer; import static org.sonar.db.ce.CeTaskTypes.AUDIT_PURGE; public class AuditPurgeTaskProcessor implements CeTaskProcessor { private static final Set<String> HANDLED_TYPES = Set.of(AUDIT_PURGE); - private final ComponentContainer ceEngineContainer; + private final SpringComponentContainer ceEngineContainer; - public AuditPurgeTaskProcessor(ComponentContainer ceEngineContainer) { + public AuditPurgeTaskProcessor(SpringComponentContainer ceEngineContainer) { this.ceEngineContainer = ceEngineContainer; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessor.java index 29879730aa9..edef1621342 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessor.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessor.java @@ -32,18 +32,18 @@ import org.sonar.ce.task.projectanalysis.step.AbstractComputationSteps; import org.sonar.ce.task.step.ComputationStep; import org.sonar.ce.task.step.ComputationStepExecutor; import org.sonar.ce.task.taskprocessor.CeTaskProcessor; -import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.Container; import org.sonar.core.platform.ContainerPopulator; +import org.sonar.core.platform.SpringComponentContainer; import static org.sonar.db.ce.CeTaskTypes.BRANCH_ISSUE_SYNC; public class IssueSyncTaskProcessor implements CeTaskProcessor { private static final Set<String> HANDLED_TYPES = ImmutableSet.of(BRANCH_ISSUE_SYNC); - private final ComponentContainer ceEngineContainer; + private final SpringComponentContainer ceEngineContainer; - public IssueSyncTaskProcessor(ComponentContainer ceEngineContainer) { + public IssueSyncTaskProcessor(SpringComponentContainer ceEngineContainer) { this.ceEngineContainer = ceEngineContainer; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/ReportTaskProcessor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/ReportTaskProcessor.java index 16fac974efd..b0939163ce5 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/ReportTaskProcessor.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/taskprocessor/ReportTaskProcessor.java @@ -22,6 +22,7 @@ package org.sonar.ce.task.projectanalysis.taskprocessor; import java.util.Collections; import java.util.Set; import javax.annotation.CheckForNull; +import javax.annotation.Nullable; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.CeTaskResult; import org.sonar.ce.task.container.TaskContainer; @@ -29,43 +30,36 @@ import org.sonar.ce.task.projectanalysis.container.ContainerFactory; import org.sonar.ce.task.step.ComputationStepExecutor; import org.sonar.ce.task.taskprocessor.CeTaskProcessor; import org.sonar.ce.task.taskprocessor.TaskResultHolder; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; import org.sonar.db.ce.CeTaskTypes; import org.sonar.ce.task.projectanalysis.container.ReportAnalysisComponentProvider; +import org.springframework.beans.factory.annotation.Autowired; public class ReportTaskProcessor implements CeTaskProcessor { private static final Set<String> HANDLED_TYPES = Collections.singleton(CeTaskTypes.REPORT); private final ContainerFactory containerFactory; - private final ComponentContainer serverContainer; + private final SpringComponentContainer serverContainer; @CheckForNull private final ReportAnalysisComponentProvider[] componentProviders; - /** - * Used when at least one Privileged plugin is installed - */ - public ReportTaskProcessor(ContainerFactory containerFactory, ComponentContainer serverContainer, ReportAnalysisComponentProvider[] componentProviders) { + @Autowired(required = false) + public ReportTaskProcessor(ContainerFactory containerFactory, SpringComponentContainer serverContainer, @Nullable ReportAnalysisComponentProvider[] componentProviders) { this.containerFactory = containerFactory; this.serverContainer = serverContainer; this.componentProviders = componentProviders; } /** - * Used when no privileged plugin is installed - */ - public ReportTaskProcessor(ContainerFactory containerFactory, ComponentContainer serverContainer) { - this.containerFactory = containerFactory; - this.serverContainer = serverContainer; - this.componentProviders = null; - } - - /** * Used when loaded in WebServer where none of the dependencies are available and where only * {@link #getHandledCeTaskTypes()} will be called. */ + @Autowired(required = false) public ReportTaskProcessor() { - this(null, null, null); + this.containerFactory = null; + this.serverContainer = null; + this.componentProviders = null; } @Override diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulator.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulator.java index 26e9084cc4e..30f57010550 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulator.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulator.java @@ -54,8 +54,8 @@ public class ProjectExportContainerPopulator implements ContainerPopulator<TaskC container.add(projectDescriptor); container.add(steps); - container.addSingletons(COMPONENT_CLASSES); - container.addSingletons(steps.orderedStepClasses()); + container.add(COMPONENT_CLASSES); + container.add(steps.orderedStepClasses()); } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/taskprocessor/ProjectExportTaskProcessor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/taskprocessor/ProjectExportTaskProcessor.java index 68c03bebf1e..24cbdd9bf4c 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/taskprocessor/ProjectExportTaskProcessor.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/taskprocessor/ProjectExportTaskProcessor.java @@ -27,15 +27,15 @@ import org.sonar.ce.task.container.TaskContainerImpl; import org.sonar.ce.task.projectexport.ProjectExportContainerPopulator; import org.sonar.ce.task.projectexport.ProjectExportProcessor; import org.sonar.ce.task.taskprocessor.CeTaskProcessor; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; import static org.sonar.db.ce.CeTaskTypes.PROJECT_EXPORT; public class ProjectExportTaskProcessor implements CeTaskProcessor { - private final ComponentContainer componentContainer; + private final SpringComponentContainer componentContainer; - public ProjectExportTaskProcessor(ComponentContainer componentContainer) { + public ProjectExportTaskProcessor(SpringComponentContainer componentContainer) { this.componentContainer = componentContainer; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectExportDumpFSImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectExportDumpFSImpl.java index 6be47c09411..bd44654516b 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectExportDumpFSImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectExportDumpFSImpl.java @@ -20,7 +20,7 @@ package org.sonar.ce.task.projectexport.util; import java.io.File; -import org.picocontainer.Startable; +import org.sonar.api.Startable; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.config.Configuration; import org.sonar.api.server.ServerSide; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectImportDumpFSImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectImportDumpFSImpl.java index 434312438c7..fc23a0602b4 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectImportDumpFSImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectexport/util/ProjectImportDumpFSImpl.java @@ -20,7 +20,7 @@ package org.sonar.ce.task.projectexport.util; import java.io.File; -import org.picocontainer.Startable; +import org.sonar.api.Startable; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.config.Configuration; import org.sonar.api.server.ServerSide; diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java index f134ff9a828..b3c6aff2ef5 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutorTest.java @@ -116,7 +116,7 @@ public class PostProjectAnalysisTasksExecutorTest { @Test @UseDataProvider("booleanValues") public void does_not_fail_when_there_is_no_PostProjectAnalysisTasksExecutor(boolean allStepsExecuted) { - new PostProjectAnalysisTasksExecutor(ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader) + new PostProjectAnalysisTasksExecutor(ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader, null) .finished(allStepsExecuted); } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java index 0777349a152..911f1415d19 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java @@ -21,21 +21,15 @@ package org.sonar.ce.task.projectanalysis.container; import com.google.common.collect.ImmutableList; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.junit.Test; -import org.picocontainer.DefaultPicoContainer; -import org.picocontainer.PicoContainer; import org.reflections.Reflections; import org.sonar.ce.task.CeTask; -import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.projectanalysis.step.PersistComponentsStep; +import org.sonar.ce.task.projectanalysis.task.ListTaskContainer; import org.sonar.ce.task.step.ComputationStep; -import org.sonar.core.platform.ComponentContainer; import org.sonar.core.util.stream.MoreCollectors; import static com.google.common.collect.Sets.difference; @@ -46,25 +40,23 @@ import static org.mockito.Mockito.when; public class ProjectAnalysisTaskContainerPopulatorTest { private static final String PROJECTANALYSIS_STEP_PACKAGE = "org.sonar.ce.task.projectanalysis.step"; - private CeTask task = mock(CeTask.class); - private ProjectAnalysisTaskContainerPopulator underTest; + private final CeTask task = mock(CeTask.class); + private final ProjectAnalysisTaskContainerPopulator underTest = new ProjectAnalysisTaskContainerPopulator(task, null); @Test public void item_is_added_to_the_container() { - underTest = new ProjectAnalysisTaskContainerPopulator(task, null); - AddedObjectsRecorderTaskContainer container = new AddedObjectsRecorderTaskContainer(); + ListTaskContainer container = new ListTaskContainer(); underTest.populateContainer(container); - assertThat(container.added).contains(task); + assertThat(container.getAddedComponents()).contains(task); } @Test public void all_computation_steps_are_added_in_order_to_the_container() { - underTest = new ProjectAnalysisTaskContainerPopulator(task, null); - AddedObjectsRecorderTaskContainer container = new AddedObjectsRecorderTaskContainer(); + ListTaskContainer container = new ListTaskContainer(); underTest.populateContainer(container); - Set<String> computationStepClassNames = container.added.stream() + Set<String> computationStepClassNames = container.getAddedComponents().stream() .map(s -> { if (s instanceof Class) { return (Class<?>) s; @@ -94,11 +86,10 @@ public class ProjectAnalysisTaskContainerPopulatorTest { @Test public void at_least_one_core_step_is_added_to_the_container() { - underTest = new ProjectAnalysisTaskContainerPopulator(task, null); - AddedObjectsRecorderTaskContainer container = new AddedObjectsRecorderTaskContainer(); + ListTaskContainer container = new ListTaskContainer(); underTest.populateContainer(container); - assertThat(container.added).contains(PersistComponentsStep.class); + assertThat(container.getAddedComponents()).contains(PersistComponentsStep.class); } @Test @@ -108,74 +99,16 @@ public class ProjectAnalysisTaskContainerPopulatorTest { ReportAnalysisComponentProvider componentProvider = mock(ReportAnalysisComponentProvider.class); when(componentProvider.getComponents()).thenReturn(ImmutableList.of(object, clazz)); - underTest = new ProjectAnalysisTaskContainerPopulator(task, new ReportAnalysisComponentProvider[] {componentProvider}); - AddedObjectsRecorderTaskContainer container = new AddedObjectsRecorderTaskContainer(); + ProjectAnalysisTaskContainerPopulator populator = new ProjectAnalysisTaskContainerPopulator(task, new ReportAnalysisComponentProvider[] {componentProvider}); + ListTaskContainer container = new ListTaskContainer(); container.add(componentProvider); - underTest.populateContainer(container); + populator.populateContainer(container); - assertThat(container.added).contains(object, clazz); + assertThat(container.getAddedComponents()).contains(object, clazz); } private static final class MyClass { } - private static class AddedObjectsRecorderTaskContainer implements TaskContainer { - private static final DefaultPicoContainer SOME_EMPTY_PICO_CONTAINER = new DefaultPicoContainer(); - - private List<Object> added = new ArrayList<>(); - - @Override - public void bootup() { - // no effect - } - - @Override - public ComponentContainer getParent() { - throw new UnsupportedOperationException("getParent is not implemented"); - } - - @Override - public void close() { - throw new UnsupportedOperationException("cleanup is not implemented"); - } - - @Override - public PicoContainer getPicoContainer() { - return SOME_EMPTY_PICO_CONTAINER; - } - - @Override - public ComponentContainer add(Object... objects) { - added.addAll(Arrays.asList(objects)); - return null; // not used anyway - } - - @Override - public ComponentContainer addSingletons(Iterable<?> components) { - for (Object component : components) { - added.add(component); - } - return null; // not used anyway - } - - @Override - public <T> T getComponentByType(Class<T> type) { - for (Object add : added) { - if (add.getClass().getSimpleName().contains(type.getSimpleName())) { - return (T) add; - } - } - return null; - } - - @Override - public <T> List<T> getComponentsByType(final Class<T> type) { - return added.stream() - .filter(input -> input.getClass().getSimpleName().contains(type.getSimpleName())) - .map(input -> (T) input) - .collect(Collectors.toList()); - } - } - } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProviderTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProviderTest.java new file mode 100644 index 00000000000..896f45618a8 --- /dev/null +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/filesystem/ComputationTempFolderProviderTest.java @@ -0,0 +1,67 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.ce.task.projectanalysis.filesystem; + +import org.apache.commons.io.FileUtils; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.sonar.api.utils.TempFolder; +import org.sonar.server.platform.ServerFileSystem; + +import java.io.File; + +public class ComputationTempFolderProviderTest { + + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + private final ComputationTempFolderProvider underTest = new ComputationTempFolderProvider(); + + @Test + public void existing_temp_dir() throws Exception { + ServerFileSystem fs = mock(ServerFileSystem.class); + File tmpDir = temp.newFolder(); + when(fs.getTempDir()).thenReturn(tmpDir); + + TempFolder folder = underTest.provide(fs); + assertThat(folder).isNotNull(); + File newDir = folder.newDir(); + assertThat(newDir).exists().isDirectory(); + assertThat(newDir.getParentFile().getCanonicalPath()).startsWith(tmpDir.getCanonicalPath()); + } + + @Test + public void create_temp_dir_if_missing() throws Exception { + ServerFileSystem fs = mock(ServerFileSystem.class); + File tmpDir = temp.newFolder(); + when(fs.getTempDir()).thenReturn(tmpDir); + FileUtils.forceDelete(tmpDir); + + TempFolder folder = underTest.provide(fs); + assertThat(folder).isNotNull(); + File newDir = folder.newDir(); + assertThat(newDir).exists().isDirectory(); + assertThat(newDir.getParentFile().getCanonicalPath()).startsWith(tmpDir.getCanonicalPath()); + } +} diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportComputationStepsTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportComputationStepsTest.java index bb0a6f6b177..247885957a5 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportComputationStepsTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportComputationStepsTest.java @@ -19,11 +19,12 @@ */ package org.sonar.ce.task.projectanalysis.step; -import com.google.common.collect.Lists; import org.junit.Test; import org.sonar.ce.task.container.TaskContainerImpl; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.ce.task.step.ComputationStep; +import org.sonar.core.platform.SpringComponentContainer; +import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; @@ -31,33 +32,30 @@ public class ReportComputationStepsTest { @Test public void instances_throws_ISE_if_container_does_not_have_any_step() { - assertThatThrownBy(() -> { - TaskContainerImpl computeEngineContainer = new TaskContainerImpl(new ComponentContainer(), container -> { - // do nothing - }); - - Lists.newArrayList(new ReportComputationSteps(computeEngineContainer).instances()); - }) + TaskContainerImpl computeEngineContainer = new TaskContainerImpl(new SpringComponentContainer(), container -> { + // do nothing + }); + Iterable<ComputationStep> instances = new ReportComputationSteps(computeEngineContainer).instances(); + assertThatThrownBy(() -> newArrayList(instances)) .isInstanceOf(IllegalStateException.class) - .hasMessage("Component not found: " + ExtractReportStep.class); + .hasMessageContaining(ExtractReportStep.class.getName()); } @Test public void instances_throws_ISE_if_container_does_not_have_second_step() { - assertThatThrownBy(() -> { - final ExtractReportStep reportExtractionStep = mock(ExtractReportStep.class); - ComponentContainer componentContainer = new ComponentContainer() { - { - addSingleton(reportExtractionStep); - } - }; - TaskContainerImpl computeEngineContainer = new TaskContainerImpl(componentContainer, container -> { - // do nothing - }); - - Lists.newArrayList(new ReportComputationSteps(computeEngineContainer).instances()); - }) + ExtractReportStep reportExtractionStep = mock(ExtractReportStep.class); + SpringComponentContainer componentContainer = new SpringComponentContainer() { + { + add(reportExtractionStep); + } + }.startComponents(); + TaskContainerImpl computeEngineContainer = new TaskContainerImpl(componentContainer, container -> { + // do nothing + }); + computeEngineContainer.startComponents(); + Iterable<ComputationStep> instances = new ReportComputationSteps(computeEngineContainer).instances(); + assertThatThrownBy(() -> newArrayList(instances)) .isInstanceOf(IllegalStateException.class) - .hasMessage("Component not found: class org.sonar.ce.task.projectanalysis.step.PersistScannerContextStep"); + .hasMessageContaining("org.sonar.ce.task.projectanalysis.step.PersistScannerContextStep"); } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsCoverageMeasuresStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsCoverageMeasuresStepTest.java index e01374588d5..2f5300b77d1 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsCoverageMeasuresStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsCoverageMeasuresStepTest.java @@ -62,7 +62,7 @@ public class ViewsCoverageMeasuresStepTest { @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - CoverageMeasuresStep underTest = new CoverageMeasuresStep(treeRootHolder, metricRepository, measureRepository); + CoverageMeasuresStep underTest = new CoverageMeasuresStep(treeRootHolder, metricRepository, measureRepository, null); @Before public void setUp() { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskModuleTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskModuleTest.java index 9be01d4a363..4c52736de16 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskModuleTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskModuleTest.java @@ -20,18 +20,15 @@ package org.sonar.ce.task.projectanalysis.taskprocessor; import org.junit.Test; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.ListContainer; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.core.platform.ComponentContainer.COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER; public class AuditPurgeTaskModuleTest { - @Test public void verifyCountOfAddedComponents() { - ComponentContainer container = new ComponentContainer(); + ListContainer container = new ListContainer(); new AuditPurgeTaskModule().configure(container); - assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 1); + assertThat(container.getAddedObjects()).hasSize(1); } - } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessorTest.java index 53e0165c2f6..3ed573ec317 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/AuditPurgeTaskProcessorTest.java @@ -26,18 +26,18 @@ import org.mockito.Mockito; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.step.ComputationStep; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.sonar.ce.task.projectanalysis.taskprocessor.AuditPurgeTaskProcessor.AuditPurgeComputationSteps; import static org.sonar.db.ce.CeTaskTypes.AUDIT_PURGE; -import static org.assertj.core.api.Assertions.assertThatThrownBy; public class AuditPurgeTaskProcessorTest { - private ComponentContainer ceEngineContainer = Mockito.mock(ComponentContainer.class); - - private AuditPurgeTaskProcessor underTest = new AuditPurgeTaskProcessor(ceEngineContainer); - private TaskContainer container = Mockito.spy(TaskContainer.class); + private final SpringComponentContainer ceEngineContainer = mock(SpringComponentContainer.class); + private final AuditPurgeTaskProcessor underTest = new AuditPurgeTaskProcessor(ceEngineContainer); + private final TaskContainer container = Mockito.spy(TaskContainer.class); @Test public void getHandledCeTaskTypes() { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessorTest.java index df577f2df5e..9f2929f8eb3 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/taskprocessor/IssueSyncTaskProcessorTest.java @@ -26,18 +26,18 @@ import org.mockito.Mockito; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.step.ComputationStep; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.core.platform.SpringComponentContainer; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.sonar.ce.task.projectanalysis.taskprocessor.IssueSyncTaskProcessor.SyncComputationSteps; import static org.sonar.db.ce.CeTaskTypes.BRANCH_ISSUE_SYNC; public class IssueSyncTaskProcessorTest { - private ComponentContainer ceEngineContainer = Mockito.mock(ComponentContainer.class); - - private IssueSyncTaskProcessor underTest = new IssueSyncTaskProcessor(ceEngineContainer); - private TaskContainer container = Mockito.spy(TaskContainer.class); + private final SpringComponentContainer ceEngineContainer = mock(SpringComponentContainer.class); + private final IssueSyncTaskProcessor underTest = new IssueSyncTaskProcessor(ceEngineContainer); + private final TaskContainer container = Mockito.spy(TaskContainer.class); @Test public void getHandledCeTaskTypes() { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportComputationStepsTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportComputationStepsTest.java index 3dcc9c5a2d3..9e63aaaa01a 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportComputationStepsTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportComputationStepsTest.java @@ -24,18 +24,19 @@ import org.junit.Test; import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.container.TaskContainerImpl; import org.sonar.ce.task.projectanalysis.step.ComplexityMeasuresStep; -import org.sonar.ce.task.projectexport.steps.LoadProjectStep; -import org.sonar.core.platform.ComponentContainer; +import org.sonar.ce.task.step.ComputationStep; +import org.sonar.core.platform.SpringComponentContainer; import static com.google.common.collect.ImmutableList.copyOf; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class ProjectExportComputationStepsTest { - - private TaskContainer container = mock(TaskContainer.class); - private ProjectExportComputationSteps underTest = new ProjectExportComputationSteps(container); + private final TaskContainer container = mock(TaskContainer.class); + private final ProjectExportComputationSteps underTest = new ProjectExportComputationSteps(container); @Test public void count_step_classes() { @@ -44,29 +45,30 @@ public class ProjectExportComputationStepsTest { @Test public void instances_throws_ISE_if_steps_do_not_exist_in_container() { - assertThatThrownBy(() -> copyOf(underTest.instances())) + when(container.getComponentByType(any())).thenThrow(new IllegalStateException("Error")); + Iterable<ComputationStep> instances = underTest.instances(); + assertThatThrownBy(() -> copyOf(instances)) .isInstanceOf(IllegalStateException.class) - .hasMessage("Component not found: " + LoadProjectStep.class); + .hasMessage("Error"); } @Test public void instances_throws_ISE_if_container_does_not_have_second_step() { - assertThatThrownBy(() -> { - final ComplexityMeasuresStep reportExtractionStep = mock(ComplexityMeasuresStep.class); - - ComponentContainer componentContainer = new ComponentContainer() { - { - addSingleton(reportExtractionStep); - } - }; - TaskContainerImpl computeEngineContainer = new TaskContainerImpl(componentContainer, container -> { - // do nothing - }); + ComplexityMeasuresStep reportExtractionStep = mock(ComplexityMeasuresStep.class); - Lists.newArrayList(new ProjectExportComputationSteps(computeEngineContainer).instances()); - }) + SpringComponentContainer componentContainer = new SpringComponentContainer() { + { + add(reportExtractionStep); + } + }.startComponents(); + TaskContainerImpl computeEngineContainer = new TaskContainerImpl(componentContainer, container -> { + // do nothing + }); + computeEngineContainer.startComponents(); + Iterable<ComputationStep> instances = new ProjectExportComputationSteps(computeEngineContainer).instances(); + assertThatThrownBy(() -> Lists.newArrayList(instances)) .isInstanceOf(IllegalStateException.class) - .hasMessage("Component not found: class org.sonar.ce.task.projectexport.steps.LoadProjectStep"); + .hasMessageContaining("class org.sonar.ce.task.projectexport.steps.LoadProjectStep"); } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulatorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulatorTest.java index 999f78f1220..d6760965d93 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulatorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectexport/ProjectExportContainerPopulatorTest.java @@ -19,87 +19,23 @@ */ package org.sonar.ce.task.projectexport; -import com.google.common.base.Predicate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; import org.junit.Test; -import org.picocontainer.PicoContainer; -import org.sonar.ce.task.container.TaskContainer; +import org.sonar.ce.task.projectanalysis.task.ListTaskContainer; import org.sonar.ce.task.projectexport.taskprocessor.ProjectDescriptor; import org.sonar.ce.task.setting.SettingsLoader; -import org.sonar.ce.task.step.ComputationStep; -import org.sonar.core.platform.ComponentContainer; import static org.assertj.core.api.Assertions.assertThat; public class ProjectExportContainerPopulatorTest { - - private static final int COMPONENTS_BY_DEFAULT_IN_CONTAINER = 2; - private final ProjectDescriptor descriptor = new ProjectDescriptor("project_uuid", "project_key", "Project Name"); private final ProjectExportContainerPopulator underTest = new ProjectExportContainerPopulator(descriptor); @Test public void test_populateContainer() { - RecorderTaskContainer container = new RecorderTaskContainer(); + ListTaskContainer container = new ListTaskContainer(); underTest.populateContainer(container); - assertThat(container.addedComponents) - .hasSize(COMPONENTS_BY_DEFAULT_IN_CONTAINER + 8) + assertThat(container.getAddedComponents()) + .hasSize(29) .contains(descriptor, SettingsLoader.class); } - - private static class RecorderTaskContainer implements TaskContainer { - private final List<Object> addedComponents = new ArrayList<>(); - - @Override - public ComponentContainer add(Object... objects) { - addedComponents.addAll(Arrays.asList(objects)); - // not used anyway - return null; - } - - @Override - public ComponentContainer addSingletons(Iterable<?> components) { - List<Object> filteredComponents = StreamSupport.stream(components.spliterator(), false) - .filter((Predicate<Object>) input -> !(input instanceof Class) || !ComputationStep.class.isAssignableFrom((Class<?>) input)) - .collect(Collectors.toList()); - - addedComponents.addAll(filteredComponents); - // not used anyway - return null; - } - - @Override - public ComponentContainer getParent() { - throw new UnsupportedOperationException("getParent is not implemented"); - } - - @Override - public void bootup() { - throw new UnsupportedOperationException("bootup is not implemented"); - } - - @Override - public void close() { - throw new UnsupportedOperationException("close is not implemented"); - } - - @Override - public PicoContainer getPicoContainer() { - throw new UnsupportedOperationException("getParent is not implemented"); - } - - @Override - public <T> T getComponentByType(Class<T> type) { - throw new UnsupportedOperationException("getParent is not implemented"); - } - - @Override - public <T> List<T> getComponentsByType(final Class<T> type) { - throw new UnsupportedOperationException("getParent is not implemented"); - } - } } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/task/ListTaskContainer.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/task/ListTaskContainer.java new file mode 100644 index 00000000000..c22b9aee83f --- /dev/null +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/task/ListTaskContainer.java @@ -0,0 +1,80 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.ce.task.projectanalysis.task; + +import com.google.common.collect.Iterables; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import org.sonar.ce.task.container.TaskContainer; +import org.sonar.core.platform.Module; +import org.sonar.core.platform.SpringComponentContainer; + +public class ListTaskContainer implements TaskContainer { + private final List<Object> addedComponents = new ArrayList<>(); + + @Override + public SpringComponentContainer add(Object... objects) { + for (Object o : objects) { + if (o instanceof Module) { + ((Module) o).configure(this); + } else if (o instanceof Iterable) { + add(Iterables.toArray((Iterable<?>) o, Object.class)); + } else { + this.addedComponents.add(o); + } + } + // not used anyway + return null; + } + + public List<Object> getAddedComponents() { + return addedComponents; + } + + @Override + public SpringComponentContainer getParent() { + throw new UnsupportedOperationException("getParent is not implemented"); + } + + @Override + public void bootup() { + throw new UnsupportedOperationException("bootup is not implemented"); + } + + @Override + public void close() { + throw new UnsupportedOperationException("close is not implemented"); + } + + @Override + public <T> T getComponentByType(Class<T> type) { + throw new UnsupportedOperationException("getParent is not implemented"); + } + + @Override public <T> Optional<T> getOptionalComponentByType(Class<T> type) { + throw new UnsupportedOperationException("getParent is not implemented"); + } + + @Override + public <T> List<T> getComponentsByType(final Class<T> type) { + throw new UnsupportedOperationException("getParent is not implemented"); + } +} |