From b9807f7322174929bb681dc9734e38c8245d54b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Tue, 18 Aug 2015 13:04:59 +0200 Subject: [PATCH] finish splitting Crawler and Visitor of CE Component trees --- .../DepthTraversalTypeAwareCrawler.java | 42 ++- .../component/PathAwareCrawler.java | 50 ++-- .../component/ReportTreeRootHolderImpl.java | 13 +- ...a => FormulaExecutorComponentVisitor.java} | 26 +- .../step/ApplyPermissionsStep.java | 14 +- .../computation/step/CommentMeasuresStep.java | 12 +- .../step/ComplexityMeasuresStep.java | 22 +- .../step/ComputeQProfileMeasureStep.java | 6 +- .../step/CoverageMeasuresStep.java | 34 +-- .../step/CustomMeasuresCopyStep.java | 6 +- .../step/DuplicationMeasuresStep.java | 12 +- .../computation/step/FeedPeriodsStep.java | 24 +- .../step/FillMeasuresWithVariationsStep.java | 8 +- .../computation/step/IntegrateIssuesStep.java | 16 +- .../LanguageDistributionMeasuresStep.java | 9 +- .../step/NewCoverageMeasuresStep.java | 79 +++--- .../step/PersistDuplicationsStep.java | 8 +- .../computation/step/PersistEventsStep.java | 9 +- .../step/PersistFileSourcesStep.java | 6 +- .../computation/step/PersistMeasuresStep.java | 8 +- ...ersistNumberOfDaysSinceLastCommitStep.java | 5 +- .../step/PersistProjectLinksStep.java | 12 +- .../step/PersistSnapshotsStep.java | 7 +- .../computation/step/PersistTestsStep.java | 5 +- .../step/QualityGateEventsStep.java | 14 +- .../step/QualityGateLoadingStep.java | 14 +- .../step/QualityGateMeasuresStep.java | 14 +- .../step/QualityProfileEventsStep.java | 14 +- .../computation/step/SizeMeasuresStep.java | 13 +- .../step/UnitTestMeasuresStep.java | 17 +- .../computation/step/ValidateProjectStep.java | 5 +- .../computation/batch/TreeRootHolderRule.java | 5 +- .../computation/component/CallRecord.java | 32 +-- ...java => CallRecorderPathAwareVisitor.java} | 14 +- .../CallRecorderTypeAwareVisitor.java | 80 ++++++ .../component/PathAwareCallRecord.java | 92 +++++++ ...t.java => ReportPathAwareVisitorTest.java} | 56 ++-- ...derDepthTraversalTypeAwareCrawlerTest.java | 245 ++++++++---------- ...derDepthTraversalTypeAwareCrawlerTest.java | 239 ++++++++--------- ...sitorsCrawlerWithPathAwareVisitorTest.java | 38 +-- .../component/TestPathAwareVisitor.java | 122 --------- .../TypeAwareVisitorAdapterTest.java} | 18 +- ...st.java => ViewsPathAwareVisitorTest.java} | 44 ++-- ...derDepthTraversalTypeAwareCrawlerTest.java | 170 ++++++------ ...derDepthTraversalTypeAwareCrawlerTest.java | 165 ++++++------ ...sitorsCrawlerWithPathAwareVisitorTest.java | 30 +-- .../formula/AverageFormulaExecutionTest.java | 9 +- .../DistributionFormulaExecutionTest.java | 9 +- ... FormulaExecutorComponentVisitorTest.java} | 17 +- .../formula/SumFormulaExecutionTest.java | 9 +- .../measure/MeasureRepositoryRule.java | 20 +- 51 files changed, 947 insertions(+), 991 deletions(-) rename server/sonar-server/src/main/java/org/sonar/server/computation/formula/{FormulaExecutorComponentCrawler.java => FormulaExecutorComponentVisitor.java} (88%) rename server/sonar-server/src/test/java/org/sonar/server/computation/component/{TestPathAwareCrawler.java => CallRecorderPathAwareVisitor.java} (84%) create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderTypeAwareVisitor.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareCallRecord.java rename server/sonar-server/src/test/java/org/sonar/server/computation/component/{ReportPathAwareCrawlerTest.java => ReportPathAwareVisitorTest.java} (82%) delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareVisitor.java rename server/sonar-server/src/{main/java/org/sonar/server/computation/component/TypeAwareCrawler.java => test/java/org/sonar/server/computation/component/TypeAwareVisitorAdapterTest.java} (74%) rename server/sonar-server/src/test/java/org/sonar/server/computation/component/{ViewsPathAwareCrawlerTest.java => ViewsPathAwareVisitorTest.java} (83%) rename server/sonar-server/src/test/java/org/sonar/server/computation/formula/{FormulaExecutorComponentCrawlerTest.java => FormulaExecutorComponentVisitorTest.java} (95%) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareCrawler.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareCrawler.java index d2f07f0d7d8..3365bc8d6a6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareCrawler.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareCrawler.java @@ -20,74 +20,72 @@ package org.sonar.server.computation.component; +import static java.util.Objects.requireNonNull; + /** - * Implementation of {@link TypeAwareCrawler} that implements a depth traversal of a {@link Component} tree. + * Implementation of {@link ComponentCrawler} that implements a depth traversal of a {@link Component} tree. *

It supports visiting traversal in either pre-order or post-order

* It supports a max depth for crawling (component strictly deeper than the specified type will be ignored). */ -public abstract class DepthTraversalTypeAwareCrawler extends TypeAwareVisitorAdapter implements TypeAwareCrawler { +public final class DepthTraversalTypeAwareCrawler implements ComponentCrawler { + private final TypeAwareVisitor visitor; - protected DepthTraversalTypeAwareCrawler(Component.Type maxDepth, ComponentVisitor.Order order) { - super(maxDepth, order); + public DepthTraversalTypeAwareCrawler(TypeAwareVisitor visitor) { + this.visitor = requireNonNull(visitor); } @Override public void visit(Component component) { - if (component.getType().isDeeperThan(maxDepth)) { + if (component.getType().isDeeperThan(this.visitor.getMaxDepth())) { return; } - if (order == ComponentVisitor.Order.PRE_ORDER) { + if (this.visitor.getOrder() == ComponentVisitor.Order.PRE_ORDER) { visitNode(component); } visitChildren(component); - if (order == ComponentVisitor.Order.POST_ORDER) { + if (this.visitor.getOrder() == ComponentVisitor.Order.POST_ORDER) { visitNode(component); } } private void visitNode(Component component) { - visitAny(component); + this.visitor.visitAny(component); switch (component.getType()) { case PROJECT: - visitProject(component); + this.visitor.visitProject(component); break; case MODULE: - visitModule(component); + this.visitor.visitModule(component); break; case DIRECTORY: - visitDirectory(component); + this.visitor.visitDirectory(component); break; case FILE: - visitFile(component); + this.visitor.visitFile(component); break; case VIEW: - visitView(component); + this.visitor.visitView(component); break; case SUBVIEW: - visitSubView(component); + this.visitor.visitSubView(component); break; case PROJECT_VIEW: - visitProjectView(component); + this.visitor.visitProjectView(component); break; default: - visitUnknown(component); + throw new IllegalArgumentException("Unsupported Component type " + component.getType()); } } private void visitChildren(Component component) { for (Component child : component.getChildren()) { - if (!child.getType().isDeeperThan(maxDepth)) { + if (!child.getType().isDeeperThan(this.visitor.getMaxDepth())) { visit(child); } } } - @Override - public void visitUnknown(Component unknownComponent) { - // empty implementation, meant to be override at will by subclasses - } - } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareCrawler.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareCrawler.java index b1e89489706..6b46666a9cd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareCrawler.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareCrawler.java @@ -19,6 +19,7 @@ */ package org.sonar.server.computation.component; +import static java.util.Objects.requireNonNull; import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; @@ -28,29 +29,30 @@ import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ * parent's. * As for {@link DepthTraversalTypeAwareCrawler}, this crawler supports max depth visit and ordering. */ -public abstract class PathAwareCrawler extends PathAwareVisitorAdapter implements ComponentCrawler { +public final class PathAwareCrawler implements ComponentCrawler { + private final PathAwareVisitor visitor; private final DequeBasedPath stack = new DequeBasedPath<>(); - public PathAwareCrawler(Component.Type maxDepth, ComponentVisitor.Order order, StackElementFactory factory) { - super(maxDepth, order, factory); + public PathAwareCrawler(PathAwareVisitor visitor) { + this.visitor = requireNonNull(visitor); } @Override public void visit(Component component) { - if (component.getType().isDeeperThan(getMaxDepth())) { + if (component.getType().isDeeperThan(this.visitor.getMaxDepth())) { return; } stack.add(new PathElementImpl<>(component, createForComponent(component))); - if (getOrder() == PRE_ORDER) { + if (this.visitor.getOrder() == PRE_ORDER) { visitNode(component); } visitChildren(component); - if (getOrder() == POST_ORDER) { + if (this.visitor.getOrder() == POST_ORDER) { visitNode(component); } @@ -59,53 +61,59 @@ public abstract class PathAwareCrawler extends PathAwareVisitorAdapter imp private void visitChildren(Component component) { for (Component child : component.getChildren()) { - if (!child.getType().isDeeperThan(getMaxDepth())) { + if (!child.getType().isDeeperThan(this.visitor.getMaxDepth())) { visit(child); } } } private void visitNode(Component component) { - visitAny(component, stack); + this.visitor.visitAny(component, stack); switch (component.getType()) { case PROJECT: - visitProject(component, stack); + this.visitor.visitProject(component, stack); break; case MODULE: - visitModule(component, stack); + this.visitor.visitModule(component, stack); break; case DIRECTORY: - visitDirectory(component, stack); + this.visitor.visitDirectory(component, stack); break; case FILE: - visitFile(component, stack); + this.visitor.visitFile(component, stack); break; case VIEW: - visitView(component, stack); + this.visitor.visitView(component, stack); break; case SUBVIEW: - visitSubView(component, stack); + this.visitor.visitSubView(component, stack); break; case PROJECT_VIEW: - visitProjectView(component, stack); + this.visitor.visitProjectView(component, stack); break; default: - visitUnknown(component, stack); + this.visitor.visitUnknown(component, stack); } } private T createForComponent(Component component) { switch (component.getType()) { case PROJECT: - return getFactory().createForProject(component); + return this.visitor.getFactory().createForProject(component); case MODULE: - return getFactory().createForModule(component); + return this.visitor.getFactory().createForModule(component); case DIRECTORY: - return getFactory().createForDirectory(component); + return this.visitor.getFactory().createForDirectory(component); case FILE: - return getFactory().createForFile(component); + return this.visitor.getFactory().createForFile(component); + case VIEW: + return this.visitor.getFactory().createForView(component); + case SUBVIEW: + return this.visitor.getFactory().createForSubView(component); + case PROJECT_VIEW: + return this.visitor.getFactory().createForProjectView(component); default: - return getFactory().createForUnknown(component); + return this.visitor.getFactory().createForUnknown(component); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ReportTreeRootHolderImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/ReportTreeRootHolderImpl.java index 8903164e4c8..656e23754d5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ReportTreeRootHolderImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/ReportTreeRootHolderImpl.java @@ -36,12 +36,13 @@ public class ReportTreeRootHolderImpl extends TreeRootHolderImpl implements Repo } private void feedComponentsByRef(Component newRoot) { - new DepthTraversalTypeAwareCrawler(Component.Type.FILE, POST_ORDER) { - @Override - public void visitAny(Component component) { - componentsByRef.put(component.getReportAttributes().getRef(), component); - } - }.visit(newRoot); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.FILE, POST_ORDER) { + @Override + public void visitAny(Component component) { + componentsByRef.put(component.getReportAttributes().getRef(), component); + } + }).visit(newRoot); } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawler.java b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitor.java similarity index 88% rename from server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawler.java rename to server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitor.java index ceb69053879..d86663601b0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawler.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitor.java @@ -27,7 +27,7 @@ import java.util.Map; import javax.annotation.CheckForNull; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; -import org.sonar.server.computation.component.PathAwareCrawler; +import org.sonar.server.computation.component.PathAwareVisitorAdapter; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.Metric; @@ -37,8 +37,8 @@ import org.sonar.server.computation.period.PeriodsHolder; import static java.util.Objects.requireNonNull; -public class FormulaExecutorComponentCrawler extends PathAwareCrawler { - private static final PathAwareCrawler.SimpleStackElementFactory COUNTERS_FACTORY = new PathAwareCrawler.SimpleStackElementFactory() { +public class FormulaExecutorComponentVisitor extends PathAwareVisitorAdapter { + private static final SimpleStackElementFactory COUNTERS_FACTORY = new SimpleStackElementFactory() { @Override public Counters createForAny(Component component) { @@ -58,7 +58,7 @@ public class FormulaExecutorComponentCrawler extends PathAwareCrawler formulas; - private FormulaExecutorComponentCrawler(Builder builder, List formulas) { + private FormulaExecutorComponentVisitor(Builder builder, List formulas) { super(Component.Type.FILE, ComponentVisitor.Order.POST_ORDER, COUNTERS_FACTORY); this.periodsHolder = builder.periodsHolder; this.measureRepository = builder.measureRepository; @@ -90,32 +90,32 @@ public class FormulaExecutorComponentCrawler extends PathAwareCrawler formulas) { - return new FormulaExecutorComponentCrawler(this, formulas); + public FormulaExecutorComponentVisitor buildFor(List formulas) { + return new FormulaExecutorComponentVisitor(this, formulas); } } @Override - public void visitProject(Component project, Path path) { + public void visitProject(Component project, Path path) { processNotFile(project, path); } @Override - public void visitModule(Component module, Path path) { + public void visitModule(Component module, Path path) { processNotFile(module, path); } @Override - public void visitDirectory(Component directory, Path path) { + public void visitDirectory(Component directory, Path path) { processNotFile(directory, path); } @Override - public void visitFile(Component file, Path path) { + public void visitFile(Component file, Path path) { processFile(file, path); } - private void processNotFile(Component component, Path path) { + private void processNotFile(Component component, Path path) { for (Formula formula : formulas) { Counter counter = path.current().getCounter(formula); // If there were no file under this node, the counter won't be initialized @@ -128,7 +128,7 @@ public class FormulaExecutorComponentCrawler extends PathAwareCrawler path) { + private void processFile(Component file, Path path) { FileAggregateContext counterContext = new FileAggregateContextImpl(file); for (Formula formula : formulas) { Counter counter = formula.createNewCounter(); @@ -148,7 +148,7 @@ public class FormulaExecutorComponentCrawler extends PathAwareCrawler path, Formula formula, Counter currentCounter) { + private void aggregateToParent(Path path, Formula formula, Counter currentCounter) { if (!path.isRoot()) { path.parent().aggregate(formula, currentCounter); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ApplyPermissionsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ApplyPermissionsStep.java index 8f7bfa45ab4..ffe082bf5dd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ApplyPermissionsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ApplyPermissionsStep.java @@ -29,6 +29,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepository; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.issue.index.IssueAuthorizationIndexer; import static org.sonar.server.computation.component.Component.Type.PROJECT; @@ -56,12 +57,13 @@ public class ApplyPermissionsStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(PROJECT, PRE_ORDER) { - @Override - public void visitProject(Component project) { - execute(project); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(PROJECT, PRE_ORDER) { + @Override + public void visitProject(Component project) { + execute(project); + } + }).visit(treeRootHolder.getRoot()); } private void execute(Component project) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java index 63845ecf9f2..b1f29655517 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java @@ -23,12 +23,13 @@ package org.sonar.server.computation.step; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Counter; import org.sonar.server.computation.formula.CreateMeasureContext; import org.sonar.server.computation.formula.FileAggregateContext; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumCounter; import org.sonar.server.computation.formula.SumFormula; import org.sonar.server.computation.measure.Measure; @@ -62,15 +63,14 @@ public class CommentMeasuresStep implements ComputationStep { this.formulas = ImmutableList.of( new SumFormula(COMMENTED_OUT_CODE_LINES_KEY), new DocumentationFormula(), - new CommentDensityFormula() - ); + new CommentDensityFormula()); } @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(formulas) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(formulas)) + .visit(treeRootHolder.getRoot()); } private class CommentDensityFormula implements Formula { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java index 7eec6bf1aed..83489ec77b6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java @@ -21,11 +21,12 @@ package org.sonar.server.computation.step; import com.google.common.collect.ImmutableList; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.AverageFormula; import org.sonar.server.computation.formula.DistributionFormula; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumFormula; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.MetricRepository; @@ -53,14 +54,14 @@ public class ComplexityMeasuresStep implements ComputationStep { new SumFormula(COMPLEXITY_IN_CLASSES_KEY), new SumFormula(COMPLEXITY_IN_FUNCTIONS_KEY), - new DistributionFormula(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY), + new DistributionFormula(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY), new DistributionFormula(FILE_COMPLEXITY_DISTRIBUTION_KEY), new DistributionFormula(CLASS_COMPLEXITY_DISTRIBUTION_KEY), - AverageFormula.Builder.newBuilder().setOutputMetricKey(FILE_COMPLEXITY_KEY) - .setMainMetricKey(COMPLEXITY_KEY) - .setByMetricKey(FILES_KEY) - .build(), + AverageFormula.Builder.newBuilder().setOutputMetricKey(FILE_COMPLEXITY_KEY) + .setMainMetricKey(COMPLEXITY_KEY) + .setByMetricKey(FILES_KEY) + .build(), AverageFormula.Builder.newBuilder().setOutputMetricKey(CLASS_COMPLEXITY_KEY) .setMainMetricKey(COMPLEXITY_IN_CLASSES_KEY) .setByMetricKey(CLASSES_KEY) @@ -70,8 +71,7 @@ public class ComplexityMeasuresStep implements ComputationStep { .setMainMetricKey(COMPLEXITY_IN_FUNCTIONS_KEY) .setByMetricKey(FUNCTIONS_KEY) .setFallbackMetricKey(COMPLEXITY_KEY) - .build() - ); + .build()); private final TreeRootHolder treeRootHolder; private final MetricRepository metricRepository; @@ -85,9 +85,9 @@ public class ComplexityMeasuresStep implements ComputationStep { @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(FORMULAS) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(FORMULAS)) + .visit(treeRootHolder.getRoot()); } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeQProfileMeasureStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeQProfileMeasureStep.java index 6ba2faed8ff..bacc189e2dd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeQProfileMeasureStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputeQProfileMeasureStep.java @@ -27,6 +27,7 @@ import org.sonar.api.measures.CoreMetrics; import org.sonar.api.utils.MessageException; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.PathAwareCrawler; +import org.sonar.server.computation.component.PathAwareVisitorAdapter; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; @@ -56,10 +57,11 @@ public class ComputeQProfileMeasureStep implements ComputationStep { @Override public void execute() { Metric qProfilesMetric = metricRepository.getByKey(CoreMetrics.QUALITY_PROFILES_KEY); - new NewCoverageAggregationComponentCrawler(qProfilesMetric).visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>(new NewCoverageAggregationComponentCrawler(qProfilesMetric)) + .visit(treeRootHolder.getRoot()); } - private class NewCoverageAggregationComponentCrawler extends PathAwareCrawler { + private class NewCoverageAggregationComponentCrawler extends PathAwareVisitorAdapter { private final Metric qProfilesMetric; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java index 63eefa50bfd..15a580f374a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java @@ -20,9 +20,10 @@ package org.sonar.server.computation.step; import com.google.common.collect.ImmutableList; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumFormula; import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredFormula; import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredMetricKeys; @@ -67,7 +68,7 @@ public class CoverageMeasuresStep implements ComputationStep { new BranchCoverageFormula(), new LineCoverageFormula(), - // integration test + // integration test new SumFormula(IT_LINES_TO_COVER_KEY), new SumFormula(IT_UNCOVERED_LINES_KEY), new SumFormula(IT_CONDITIONS_TO_COVER_KEY), @@ -76,15 +77,14 @@ public class CoverageMeasuresStep implements ComputationStep { new ItBranchCoverageFormula(), new ItLineCoverageFormula(), - // overall test + // overall test new SumFormula(OVERALL_LINES_TO_COVER_KEY), new SumFormula(OVERALL_UNCOVERED_LINES_KEY), new SumFormula(OVERALL_CONDITIONS_TO_COVER_KEY), new SumFormula(OVERALL_UNCOVERED_CONDITIONS_KEY), new OverallCodeCoverageFormula(), new OverallBranchCoverageFormula(), - new OverallLineCoverageFormula() - ); + new OverallLineCoverageFormula()); private final TreeRootHolder treeRootHolder; private final MetricRepository metricRepository; @@ -98,9 +98,9 @@ public class CoverageMeasuresStep implements ComputationStep { @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(COVERAGE_FORMULAS) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(COVERAGE_FORMULAS)) + .visit(treeRootHolder.getRoot()); } private static class CodeCoverageFormula extends LinesAndConditionsWithUncoveredFormula { @@ -108,8 +108,7 @@ public class CoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( LINES_TO_COVER_KEY, CONDITIONS_TO_COVER_KEY, - UNCOVERED_LINES_KEY, UNCOVERED_CONDITIONS_KEY - ), + UNCOVERED_LINES_KEY, UNCOVERED_CONDITIONS_KEY), COVERAGE_KEY); } } @@ -119,8 +118,7 @@ public class CoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( IT_LINES_TO_COVER_KEY, IT_CONDITIONS_TO_COVER_KEY, - IT_UNCOVERED_LINES_KEY, IT_UNCOVERED_CONDITIONS_KEY - ), + IT_UNCOVERED_LINES_KEY, IT_UNCOVERED_CONDITIONS_KEY), IT_COVERAGE_KEY); } } @@ -130,8 +128,7 @@ public class CoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( OVERALL_LINES_TO_COVER_KEY, OVERALL_CONDITIONS_TO_COVER_KEY, - OVERALL_UNCOVERED_LINES_KEY, OVERALL_UNCOVERED_CONDITIONS_KEY - ), + OVERALL_UNCOVERED_LINES_KEY, OVERALL_UNCOVERED_CONDITIONS_KEY), OVERALL_COVERAGE_KEY); } } @@ -140,8 +137,7 @@ public class CoverageMeasuresStep implements ComputationStep { public BranchCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - CONDITIONS_TO_COVER_KEY, UNCOVERED_CONDITIONS_KEY - ), + CONDITIONS_TO_COVER_KEY, UNCOVERED_CONDITIONS_KEY), BRANCH_COVERAGE_KEY); } } @@ -150,8 +146,7 @@ public class CoverageMeasuresStep implements ComputationStep { public ItBranchCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - IT_CONDITIONS_TO_COVER_KEY, IT_UNCOVERED_CONDITIONS_KEY - ), + IT_CONDITIONS_TO_COVER_KEY, IT_UNCOVERED_CONDITIONS_KEY), IT_BRANCH_COVERAGE_KEY); } } @@ -184,8 +179,7 @@ public class CoverageMeasuresStep implements ComputationStep { public OverallLineCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - OVERALL_LINES_TO_COVER_KEY, OVERALL_UNCOVERED_LINES_KEY - ), + OVERALL_LINES_TO_COVER_KEY, OVERALL_UNCOVERED_LINES_KEY), OVERALL_LINE_COVERAGE_KEY); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java index ab5788e4848..d8ff8950281 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java @@ -30,6 +30,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.Metric; @@ -52,12 +53,13 @@ public class CustomMeasuresCopyStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(Component.Type.FILE, ComponentVisitor.Order.PRE_ORDER) { + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.FILE, ComponentVisitor.Order.PRE_ORDER) { @Override public void visitAny(Component component) { copy(component); } - }.visit(treeRootHolder.getRoot()); + }).visit(treeRootHolder.getRoot()); } private void copy(Component component) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java index 9052b5bf4d4..41829a0e7f0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java @@ -24,12 +24,13 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Counter; import org.sonar.server.computation.formula.CreateMeasureContext; import org.sonar.server.computation.formula.FileAggregateContext; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumCounter; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; @@ -66,15 +67,14 @@ public class DuplicationMeasuresStep implements ComputationStep { this.formulas = ImmutableList.of( new SumDuplicationFormula(DUPLICATED_BLOCKS_KEY), new SumDuplicationFormula(DUPLICATED_FILES_KEY), - new DuplicationFormula() - ); + new DuplicationFormula()); } @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(formulas) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(formulas)) + .visit(treeRootHolder.getRoot()); } private class DuplicationFormula implements Formula { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedPeriodsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedPeriodsStep.java index cb842073f50..3f1dfa89eb8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedPeriodsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedPeriodsStep.java @@ -47,6 +47,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.period.Period; import org.sonar.server.computation.period.PeriodsHolderImpl; @@ -87,17 +88,18 @@ public class FeedPeriodsStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(PROJECT, PRE_ORDER) { - @Override - public void visitProject(Component project) { - execute(project); - } - - @Override - public void visitView(Component view) { - execute(view); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(PROJECT, PRE_ORDER) { + @Override + public void visitProject(Component project) { + execute(project); + } + + @Override + public void visitView(Component view) { + execute(view); + } + }).visit(treeRootHolder.getRoot()); } public void execute(Component projectOrView) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FillMeasuresWithVariationsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/FillMeasuresWithVariationsStep.java index cdd4a48173e..cb5561e5b32 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FillMeasuresWithVariationsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/FillMeasuresWithVariationsStep.java @@ -37,6 +37,7 @@ import org.sonar.db.measure.PastMeasureDto; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureKey; import org.sonar.server.computation.measure.MeasureRepository; @@ -72,7 +73,7 @@ public class FillMeasuresWithVariationsStep implements ComputationStep { }; public FillMeasuresWithVariationsStep(DbClient dbClient, TreeRootHolder treeRootHolder, PeriodsHolder periodsHolder, MetricRepository metricRepository, - MeasureRepository measureRepository) { + MeasureRepository measureRepository) { this.dbClient = dbClient; this.treeRootHolder = treeRootHolder; this.periodsHolder = periodsHolder; @@ -85,13 +86,14 @@ public class FillMeasuresWithVariationsStep implements ComputationStep { DbSession dbSession = dbClient.openSession(false); try { Iterable metrics = FluentIterable.from(metricRepository.getAll()).filter(NumericMetric.INSTANCE); - new VariationMeasuresCrawler(dbSession, metrics).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new VariationMeasuresCrawler(dbSession, metrics)) + .visit(treeRootHolder.getRoot()); } finally { dbSession.close(); } } - private class VariationMeasuresCrawler extends DepthTraversalTypeAwareCrawler { + private class VariationMeasuresCrawler extends TypeAwareVisitorAdapter { private final DbSession session; private final Set metricIds; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/IntegrateIssuesStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/IntegrateIssuesStep.java index 56184e7df99..28a10a20109 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/IntegrateIssuesStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/IntegrateIssuesStep.java @@ -29,6 +29,7 @@ import org.sonar.core.issue.tracking.Tracking; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.issue.BaseIssuesLoader; import org.sonar.server.computation.issue.IssueCache; import org.sonar.server.computation.issue.IssueLifecycle; @@ -63,13 +64,14 @@ public class IntegrateIssuesStep implements ComputationStep { // all the components that had issues before this analysis final Set unprocessedComponentUuids = Sets.newHashSet(baseIssuesLoader.loadUuidsOfComponentsWithOpenIssues()); - new DepthTraversalTypeAwareCrawler(Component.Type.FILE, POST_ORDER) { - @Override - public void visitAny(Component component) { - processIssues(component); - unprocessedComponentUuids.remove(component.getUuid()); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.FILE, POST_ORDER) { + @Override + public void visitAny(Component component) { + processIssues(component); + unprocessedComponentUuids.remove(component.getUuid()); + } + }).visit(treeRootHolder.getRoot()); closeIssuesForDeletedComponentUuids(unprocessedComponentUuids); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/LanguageDistributionMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/LanguageDistributionMeasuresStep.java index cf7870a174a..b8fd33be7b8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/LanguageDistributionMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/LanguageDistributionMeasuresStep.java @@ -28,12 +28,13 @@ import com.google.common.collect.TreeMultiset; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.sonar.api.measures.CoreMetrics; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Counter; import org.sonar.server.computation.formula.CreateMeasureContext; import org.sonar.server.computation.formula.FileAggregateContext; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.MetricRepository; @@ -63,9 +64,9 @@ public class LanguageDistributionMeasuresStep implements ComputationStep { @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(FORMULAS) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(FORMULAS)) + .visit(treeRootHolder.getRoot()); } private static class LanguageDistributionFormula implements Formula { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/NewCoverageMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/NewCoverageMeasuresStep.java index 94254431f24..d4e9ed624f1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/NewCoverageMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/NewCoverageMeasuresStep.java @@ -33,11 +33,12 @@ import org.sonar.api.utils.KeyValueFormat; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.server.computation.batch.BatchReportReader; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.CreateMeasureContext; import org.sonar.server.computation.formula.FileAggregateContext; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.counter.IntVariationValue; import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredMetricKeys; import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredVariationFormula; @@ -74,26 +75,26 @@ public class NewCoverageMeasuresStep implements ComputationStep { @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .withVariationSupport(periodsHolder) - .buildFor(ImmutableList.of( - // UT coverage - new NewLinesAndConditionsCoverageFormula(batchReportReader), - new NewCoverageFormula(), - new NewBranchCoverageFormula(), - new NewLineCoverageFormula(), - // IT File coverage - new NewItLinesAndConditionsCoverageFormula(batchReportReader), - new NewItCoverageFormula(), - new NewItBranchCoverageFormula(), - new NewItLinesCoverageFormula(), - // Overall coverage - new NewOverallLinesAndConditionsCoverageFormula(batchReportReader), - new NewOverallCodeCoverageFormula(), - new NewOverallBranchCoverageFormula(), - new NewOverallLineCoverageFormula() - )) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) + .withVariationSupport(periodsHolder) + .buildFor(ImmutableList.of( + // UT coverage + new NewLinesAndConditionsCoverageFormula(batchReportReader), + new NewCoverageFormula(), + new NewBranchCoverageFormula(), + new NewLineCoverageFormula(), + // IT File coverage + new NewItLinesAndConditionsCoverageFormula(batchReportReader), + new NewItCoverageFormula(), + new NewItBranchCoverageFormula(), + new NewItLinesCoverageFormula(), + // Overall coverage + new NewOverallLinesAndConditionsCoverageFormula(batchReportReader), + new NewOverallCodeCoverageFormula(), + new NewOverallBranchCoverageFormula(), + new NewOverallLineCoverageFormula()))) + .visit(treeRootHolder.getRoot()); } @Override @@ -105,12 +106,10 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewLinesAndConditionsCoverageFormula(BatchReportReader batchReportReader) { super(batchReportReader, new NewCoverageInputMetricKeys( - CoreMetrics.COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.CONDITIONS_BY_LINE_KEY, CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY - ), + CoreMetrics.COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.CONDITIONS_BY_LINE_KEY, CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY), new NewCoverageOutputMetricKeys( CoreMetrics.NEW_LINES_TO_COVER_KEY, CoreMetrics.NEW_UNCOVERED_LINES_KEY, - CoreMetrics.NEW_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY - )); + CoreMetrics.NEW_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY)); } } @@ -119,8 +118,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( CoreMetrics.NEW_LINES_TO_COVER_KEY, CoreMetrics.NEW_CONDITIONS_TO_COVER_KEY, - CoreMetrics.NEW_UNCOVERED_LINES_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY - ), + CoreMetrics.NEW_UNCOVERED_LINES_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY), CoreMetrics.NEW_COVERAGE_KEY); } } @@ -129,8 +127,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewBranchCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - CoreMetrics.NEW_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY - ), + CoreMetrics.NEW_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_UNCOVERED_CONDITIONS_KEY), CoreMetrics.NEW_BRANCH_COVERAGE_KEY); } } @@ -147,12 +144,10 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewItLinesAndConditionsCoverageFormula(BatchReportReader batchReportReader) { super(batchReportReader, new NewCoverageInputMetricKeys( - CoreMetrics.IT_COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.IT_CONDITIONS_BY_LINE_KEY, CoreMetrics.IT_COVERED_CONDITIONS_BY_LINE_KEY - ), + CoreMetrics.IT_COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.IT_CONDITIONS_BY_LINE_KEY, CoreMetrics.IT_COVERED_CONDITIONS_BY_LINE_KEY), new NewCoverageOutputMetricKeys( CoreMetrics.NEW_IT_LINES_TO_COVER_KEY, CoreMetrics.NEW_IT_UNCOVERED_LINES_KEY, - CoreMetrics.NEW_IT_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY - )); + CoreMetrics.NEW_IT_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY)); } } @@ -161,8 +156,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( CoreMetrics.NEW_IT_LINES_TO_COVER_KEY, CoreMetrics.NEW_IT_CONDITIONS_TO_COVER_KEY, - CoreMetrics.NEW_IT_UNCOVERED_LINES_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY - ), + CoreMetrics.NEW_IT_UNCOVERED_LINES_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY), CoreMetrics.NEW_IT_COVERAGE_KEY); } } @@ -171,8 +165,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewItBranchCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - CoreMetrics.NEW_IT_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY - ), + CoreMetrics.NEW_IT_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_IT_UNCOVERED_CONDITIONS_KEY), CoreMetrics.NEW_IT_BRANCH_COVERAGE_KEY); } } @@ -189,12 +182,10 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewOverallLinesAndConditionsCoverageFormula(BatchReportReader batchReportReader) { super(batchReportReader, new NewCoverageInputMetricKeys( - CoreMetrics.OVERALL_COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.OVERALL_CONDITIONS_BY_LINE_KEY, CoreMetrics.OVERALL_COVERED_CONDITIONS_BY_LINE_KEY - ), + CoreMetrics.OVERALL_COVERAGE_LINE_HITS_DATA_KEY, CoreMetrics.OVERALL_CONDITIONS_BY_LINE_KEY, CoreMetrics.OVERALL_COVERED_CONDITIONS_BY_LINE_KEY), new NewCoverageOutputMetricKeys( CoreMetrics.NEW_OVERALL_LINES_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_LINES_KEY, - CoreMetrics.NEW_OVERALL_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_CONDITIONS_KEY - )); + CoreMetrics.NEW_OVERALL_CONDITIONS_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_CONDITIONS_KEY)); } } @@ -203,8 +194,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { super( new LinesAndConditionsWithUncoveredMetricKeys( CoreMetrics.NEW_OVERALL_LINES_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_CONDITIONS_TO_COVER_KEY, - CoreMetrics.NEW_OVERALL_UNCOVERED_LINES_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_CONDITIONS_KEY - ), + CoreMetrics.NEW_OVERALL_UNCOVERED_LINES_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_CONDITIONS_KEY), CoreMetrics.NEW_OVERALL_COVERAGE_KEY); } } @@ -222,8 +212,7 @@ public class NewCoverageMeasuresStep implements ComputationStep { public NewOverallLineCoverageFormula() { super( new SingleWithUncoveredMetricKeys( - CoreMetrics.NEW_OVERALL_LINES_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_LINES_KEY - ), + CoreMetrics.NEW_OVERALL_LINES_TO_COVER_KEY, CoreMetrics.NEW_OVERALL_UNCOVERED_LINES_KEY), CoreMetrics.NEW_OVERALL_LINE_COVERAGE_KEY); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDuplicationsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDuplicationsStep.java index bc0c4e293ce..239362467ac 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDuplicationsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDuplicationsStep.java @@ -35,6 +35,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepository; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.ReportTreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; @@ -60,19 +61,20 @@ public class PersistDuplicationsStep implements ComputationStep { DbSession session = dbClient.openSession(true); try { MetricDto duplicationMetric = dbClient.metricDao().selectOrFailByKey(session, CoreMetrics.DUPLICATIONS_DATA_KEY); - new DuplicationCrawler(session, duplicationMetric).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new DuplicationVisitor(session, duplicationMetric)) + .visit(treeRootHolder.getRoot()); session.commit(); } finally { MyBatis.closeQuietly(session); } } - private class DuplicationCrawler extends DepthTraversalTypeAwareCrawler { + private class DuplicationVisitor extends TypeAwareVisitorAdapter { private final DbSession session; private final MetricDto duplicationMetric; - private DuplicationCrawler(DbSession session, MetricDto duplicationMetric) { + private DuplicationVisitor(DbSession session, MetricDto duplicationMetric) { super(Component.Type.FILE, PRE_ORDER); this.session = session; this.duplicationMetric = duplicationMetric; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java index 151d3299877..a5f0c75d632 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java @@ -33,6 +33,7 @@ import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DbIdsRepository; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.event.Event; import org.sonar.server.computation.event.EventRepository; @@ -62,7 +63,8 @@ public class PersistEventsStep implements ComputationStep { final DbSession session = dbClient.openSession(false); try { long analysisDate = analysisMetadataHolder.getAnalysisDate().getTime(); - new PersistEventComponentCrawler(session, analysisDate).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new PersistEventComponentCrawler(session, analysisDate)) + .visit(treeRootHolder.getRoot()); session.commit(); } finally { MyBatis.closeQuietly(session); @@ -97,8 +99,7 @@ public class PersistEventsStep implements ComputationStep { deletePreviousEventsHavingSameVersion(session, version, component); dbClient.eventDao().insert(session, newBaseEvent(component, analysisDate) .setName(version) - .setCategory(EventDto.CATEGORY_VERSION) - ); + .setCategory(EventDto.CATEGORY_VERSION)); } } @@ -134,7 +135,7 @@ public class PersistEventsStep implements ComputationStep { return "Persist component links"; } - private class PersistEventComponentCrawler extends DepthTraversalTypeAwareCrawler { + private class PersistEventComponentCrawler extends TypeAwareVisitorAdapter { private final DbSession session; private final long analysisDate; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistFileSourcesStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistFileSourcesStep.java index ef49705e5f7..2167247a55b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistFileSourcesStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistFileSourcesStep.java @@ -41,6 +41,7 @@ import org.sonar.server.computation.batch.BatchReportReader; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.source.ComputeFileSourceData; import org.sonar.server.computation.source.CoverageLineReader; import org.sonar.server.computation.source.DuplicationLineReader; @@ -70,13 +71,14 @@ public class PersistFileSourcesStep implements ComputationStep { // Don't use batch insert for file_sources since keeping all data in memory can produce OOM for big files DbSession session = dbClient.openSession(false); try { - new FileSourceCrawler(session).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new FileSourceCrawler(session)) + .visit(treeRootHolder.getRoot()); } finally { MyBatis.closeQuietly(session); } } - private class FileSourceCrawler extends DepthTraversalTypeAwareCrawler { + private class FileSourceCrawler extends TypeAwareVisitorAdapter { private final DbSession session; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java index 7985bacda40..1a45b9ddaae 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java @@ -35,6 +35,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepository; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.measure.BestValueOptimization; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; @@ -56,8 +57,7 @@ public class PersistMeasuresStep implements ComputationStep { private static final List NOT_TO_PERSIST_ON_FILE_METRIC_KEYS = ImmutableList.of( FILE_COMPLEXITY_DISTRIBUTION_KEY, FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, - CLASS_COMPLEXITY_DISTRIBUTION_KEY - ); + CLASS_COMPLEXITY_DISTRIBUTION_KEY); private final DbClient dbClient; private final MetricRepository metricRepository; @@ -83,14 +83,14 @@ public class PersistMeasuresStep implements ComputationStep { public void execute() { DbSession dbSession = dbClient.openSession(true); try { - new MeasureCrawler(dbSession).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new MeasureCrawler(dbSession)).visit(treeRootHolder.getRoot()); dbSession.commit(); } finally { dbSession.close(); } } - private class MeasureCrawler extends DepthTraversalTypeAwareCrawler { + private class MeasureCrawler extends TypeAwareVisitorAdapter { private final DbSession session; private MeasureCrawler(DbSession session) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStep.java index ce75ea71a95..737df59ab2c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStep.java @@ -35,6 +35,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepository; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.metric.MetricRepository; import org.sonar.server.source.index.SourceLineIndex; @@ -73,7 +74,7 @@ public class PersistNumberOfDaysSinceLastCommitStep implements ComputationStep { public void execute() { NumberOfDaysSinceLastCommitCrawler visitor = new NumberOfDaysSinceLastCommitCrawler(); Component project = treeRootHolder.getRoot(); - visitor.visit(project); + new DepthTraversalTypeAwareCrawler(visitor).visit(project); long lastCommitTimestamp = visitor.lastCommitTimestampFromReport; if (lastCommitTimestamp == 0L) { @@ -106,7 +107,7 @@ public class PersistNumberOfDaysSinceLastCommitStep implements ComputationStep { } } - private class NumberOfDaysSinceLastCommitCrawler extends DepthTraversalTypeAwareCrawler { + private class NumberOfDaysSinceLastCommitCrawler extends TypeAwareVisitorAdapter { private long lastCommitTimestampFromReport = 0L; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistProjectLinksStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistProjectLinksStep.java index 95355e7c4bc..25e05801300 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistProjectLinksStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistProjectLinksStep.java @@ -39,6 +39,7 @@ import org.sonar.server.computation.batch.BatchReportReader; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import static com.google.common.collect.Sets.newHashSet; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; @@ -58,8 +59,7 @@ public class PersistProjectLinksStep implements ComputationStep { Constants.ComponentLinkType.SCM, ComponentLinkDto.TYPE_SOURCES, Constants.ComponentLinkType.SCM_DEV, ComponentLinkDto.TYPE_SOURCES_DEV, Constants.ComponentLinkType.CI, ComponentLinkDto.TYPE_CI, - Constants.ComponentLinkType.ISSUE, ComponentLinkDto.TYPE_ISSUE_TRACKER - ); + Constants.ComponentLinkType.ISSUE, ComponentLinkDto.TYPE_ISSUE_TRACKER); public PersistProjectLinksStep(DbClient dbClient, I18n i18n, TreeRootHolder treeRootHolder, BatchReportReader reportReader) { this.dbClient = dbClient; @@ -72,14 +72,15 @@ public class PersistProjectLinksStep implements ComputationStep { public void execute() { DbSession session = dbClient.openSession(false); try { - new PorjectLinkCrawler(session).visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(new PorjectLinkCrawler(session)) + .visit(treeRootHolder.getRoot()); session.commit(); } finally { MyBatis.closeQuietly(session); } } - private class PorjectLinkCrawler extends DepthTraversalTypeAwareCrawler { + private class PorjectLinkCrawler extends TypeAwareVisitorAdapter { private final DbSession session; @@ -130,8 +131,7 @@ public class PersistProjectLinksStep implements ComputationStep { .setComponentUuid(componentUuid) .setType(type) .setName(i18n.message(Locale.ENGLISH, "project_links." + type, null)) - .setHref(link.getHref()) - ); + .setHref(link.getHref())); } else { previousLink.setHref(link.getHref()); dbClient.componentLinkDao().update(session, previousLink); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistSnapshotsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistSnapshotsStep.java index 22312178d0c..f74bc4e7cd1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistSnapshotsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistSnapshotsStep.java @@ -67,15 +67,16 @@ public class PersistSnapshotsStep implements ComputationStep { public void execute() { DbSession session = dbClient.openSession(false); try { - new PersistSnapshotsPathAwareCrawler(session, analysisMetadataHolder.getAnalysisDate().getTime(), dbIdsRepository) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + new PersistSnapshotsPathAwareCrawler(session, analysisMetadataHolder.getAnalysisDate().getTime(), dbIdsRepository)) + .visit(treeRootHolder.getRoot()); session.commit(); } finally { dbClient.closeSession(session); } } - private class PersistSnapshotsPathAwareCrawler extends PathAwareCrawler { + private class PersistSnapshotsPathAwareCrawler extends PathAwareVisitorAdapter { private final DbSession dbSession; private final long analysisDate; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java index e7ebb5d3219..ea69b64ecfd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java @@ -52,6 +52,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.ReportTreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; public class PersistTestsStep implements ComputationStep { @@ -74,7 +75,7 @@ public class PersistTestsStep implements ComputationStep { DbSession session = dbClient.openSession(true); try { TestDepthTraversalTypeAwareCrawler visitor = new TestDepthTraversalTypeAwareCrawler(session); - visitor.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(visitor).visit(treeRootHolder.getRoot()); session.commit(); if (visitor.hasUnprocessedCoverageDetails) { LOG.warn("Some coverage tests are not taken into account during analysis of project '{}'", visitor.getProjectKey()); @@ -89,7 +90,7 @@ public class PersistTestsStep implements ComputationStep { return "Persist tests"; } - private class TestDepthTraversalTypeAwareCrawler extends DepthTraversalTypeAwareCrawler { + private class TestDepthTraversalTypeAwareCrawler extends TypeAwareVisitorAdapter { final DbSession session; final Map existingFileSourcesByUuid; final String projectUuid; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateEventsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateEventsStep.java index 7d68599b278..1faefb3e8d0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateEventsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateEventsStep.java @@ -29,6 +29,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.event.Event; import org.sonar.server.computation.event.EventRepository; import org.sonar.server.computation.measure.Measure; @@ -62,12 +63,13 @@ public class QualityGateEventsStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(Component.Type.PROJECT, ComponentVisitor.Order.PRE_ORDER) { - @Override - public void visitProject(Component project) { - executeForProject(project); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.PROJECT, ComponentVisitor.Order.PRE_ORDER) { + @Override + public void visitProject(Component project) { + executeForProject(project); + } + }).visit(treeRootHolder.getRoot()); } private void executeForProject(Component project) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java index 7fcc26c49f6..c07004bbad1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java @@ -29,6 +29,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.qualitygate.MutableQualityGateHolder; import org.sonar.server.computation.qualitygate.QualityGate; import org.sonar.server.computation.qualitygate.QualityGateService; @@ -60,12 +61,13 @@ public class QualityGateLoadingStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(PROJECT, PRE_ORDER) { - @Override - public void visitProject(Component project) { - executeForProject(project); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(PROJECT, PRE_ORDER) { + @Override + public void visitProject(Component project) { + executeForProject(project); + } + }).visit(treeRootHolder.getRoot()); } private void executeForProject(Component project) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateMeasuresStep.java index 5ee4d43ff0c..7c0c725ca65 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateMeasuresStep.java @@ -29,6 +29,7 @@ import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.measure.QualityGateStatus; @@ -77,12 +78,13 @@ public class QualityGateMeasuresStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(PROJECT, PRE_ORDER) { - @Override - public void visitProject(Component project) { - executeForProject(project); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(PROJECT, PRE_ORDER) { + @Override + public void visitProject(Component project) { + executeForProject(project); + } + }).visit(treeRootHolder.getRoot()); } private void executeForProject(Component project) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityProfileEventsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityProfileEventsStep.java index cea9f468759..65861848c93 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityProfileEventsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityProfileEventsStep.java @@ -33,6 +33,7 @@ import org.sonar.core.util.UtcDateUtils; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.event.Event; import org.sonar.server.computation.event.EventRepository; import org.sonar.server.computation.language.LanguageRepository; @@ -68,12 +69,13 @@ public class QualityProfileEventsStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler(Component.Type.PROJECT, POST_ORDER) { - @Override - public void visitProject(Component tree) { - executeForProject(tree); - } - }.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.PROJECT, POST_ORDER) { + @Override + public void visitProject(Component tree) { + executeForProject(tree); + } + }).visit(treeRootHolder.getRoot()); } private void executeForProject(Component projectComponent) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java index 8dea286a6e4..fdfd1aab212 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java @@ -23,9 +23,10 @@ import com.google.common.collect.ImmutableList; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.PathAwareCrawler; +import org.sonar.server.computation.component.PathAwareVisitorAdapter; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumFormula; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.Metric; @@ -74,10 +75,10 @@ public class SizeMeasuresStep implements ComputationStep { Metric fileMetric = metricRepository.getByKey(CoreMetrics.FILES_KEY); Metric directoryMetric = metricRepository.getByKey(CoreMetrics.DIRECTORIES_KEY); - new FileAndDirectoryMeasureCrawler(directoryMetric, fileMetric) + new PathAwareCrawler<>(new FileAndDirectoryMeasureCrawler(directoryMetric, fileMetric)) .visit(treeRootHolder.getRoot()); - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(AGGREGATED_SIZE_MEASURE_FORMULAS) + new PathAwareCrawler<>(FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) + .buildFor(AGGREGATED_SIZE_MEASURE_FORMULAS)) .visit(treeRootHolder.getRoot()); } @@ -86,7 +87,7 @@ public class SizeMeasuresStep implements ComputationStep { return "File and Directory measures"; } - private class FileAndDirectoryMeasureCrawler extends PathAwareCrawler { + private class FileAndDirectoryMeasureCrawler extends PathAwareVisitorAdapter { private final Metric directoryMetric; private final Metric fileMetric; @@ -142,7 +143,7 @@ public class SizeMeasuresStep implements ComputationStep { } - private static class CounterStackElementFactory extends PathAwareCrawler.SimpleStackElementFactory { + private static class CounterStackElementFactory extends PathAwareVisitorAdapter.SimpleStackElementFactory { @Override public Counter createForAny(Component component) { return new Counter(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java index c4ea162f3b5..71bfe5ef3a2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java @@ -23,12 +23,13 @@ package org.sonar.server.computation.step; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.formula.Counter; import org.sonar.server.computation.formula.CreateMeasureContext; import org.sonar.server.computation.formula.FileAggregateContext; import org.sonar.server.computation.formula.Formula; -import org.sonar.server.computation.formula.FormulaExecutorComponentCrawler; +import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor; import org.sonar.server.computation.formula.SumCounter; import org.sonar.server.computation.formula.SumFormula; import org.sonar.server.computation.measure.Measure; @@ -52,8 +53,7 @@ public class UnitTestMeasuresStep implements ComputationStep { private static final ImmutableList FORMULAS = ImmutableList.of( new SumFormula(TEST_EXECUTION_TIME_KEY), new SumFormula(SKIPPED_TESTS_KEY), - new UnitTestsFormula() - ); + new UnitTestsFormula()); private final TreeRootHolder treeRootHolder; private final MetricRepository metricRepository; @@ -67,9 +67,9 @@ public class UnitTestMeasuresStep implements ComputationStep { @Override public void execute() { - FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) - .buildFor(FORMULAS) - .visit(treeRootHolder.getRoot()); + new PathAwareCrawler<>( + FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository).buildFor(FORMULAS)) + .visit(treeRootHolder.getRoot()); } private static class UnitTestsFormula implements Formula { @@ -97,9 +97,8 @@ public class UnitTestMeasuresStep implements ComputationStep { } private static Optional createMeasure(Component.Type componentType, Optional metricValue) { - return (componentType.isHigherThan(Component.Type.FILE) && metricValue.isPresent()) ? - Optional.of(Measure.newMeasureBuilder().create(metricValue.get())) : - Optional.absent(); + return (componentType.isHigherThan(Component.Type.FILE) && metricValue.isPresent()) ? Optional.of(Measure.newMeasureBuilder().create(metricValue.get())) + : Optional.absent(); } private static Optional createDensityMeasure(UnitTestsCounter counter) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ValidateProjectStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ValidateProjectStep.java index d190ce631d1..8a365713268 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ValidateProjectStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ValidateProjectStep.java @@ -45,6 +45,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import static org.sonar.api.utils.DateUtils.formatDateTime; @@ -83,7 +84,7 @@ public class ValidateProjectStep implements ComputationStep { Map baseModulesByKey = FluentIterable.from(baseModules).uniqueIndex(ComponentDtoToKey.INSTANCE); ValidateProjectsCrawler visitor = new ValidateProjectsCrawler(session, dbClient.componentDao(), settings.getBoolean(CoreProperties.CORE_PREVENT_AUTOMATIC_PROJECT_CREATION), baseModulesByKey); - visitor.visit(treeRootHolder.getRoot()); + new DepthTraversalTypeAwareCrawler(visitor).visit(treeRootHolder.getRoot()); if (!visitor.validationMessages.isEmpty()) { throw MessageException.of("Validation of project failed:\n o " + MESSAGES_JOINER.join(visitor.validationMessages)); @@ -98,7 +99,7 @@ public class ValidateProjectStep implements ComputationStep { return "Validate project and modules keys"; } - private class ValidateProjectsCrawler extends DepthTraversalTypeAwareCrawler { + private class ValidateProjectsCrawler extends TypeAwareVisitorAdapter { private final DbSession session; private final ComponentDao componentDao; private final boolean preventAutomaticProjectCreation; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java index 6270be1184e..a2c25bf1717 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java @@ -30,6 +30,7 @@ import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.MutableTreeRootHolder; import org.sonar.server.computation.component.ReportTreeRootHolder; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; @@ -79,12 +80,12 @@ public class TreeRootHolderRule implements TestRule, MutableTreeRootHolder, Repo public TreeRootHolderRule setRoot(Component newRoot) { this.root = Objects.requireNonNull(newRoot); if (newRoot.getType().isReportType()) { - new DepthTraversalTypeAwareCrawler(Component.Type.FILE, POST_ORDER) { + new DepthTraversalTypeAwareCrawler(new TypeAwareVisitorAdapter(Component.Type.FILE, POST_ORDER) { @Override public void visitAny(Component component) { componentsByRef.put(component.getReportAttributes().getRef(), component); } - }.visit(root); + }).visit(root); } return this; } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecord.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecord.java index 983d9364340..9a180d4183b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecord.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecord.java @@ -19,7 +19,6 @@ */ package org.sonar.server.computation.component; -import java.util.List; import java.util.Objects; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -30,28 +29,19 @@ class CallRecord { private final Integer ref; @CheckForNull private final String key; - private final int current; - @CheckForNull - private final Integer parent; - private final int root; - private final List path; - private CallRecord(String method, @Nullable Integer ref, @Nullable String key, int current, @Nullable Integer parent, int root, List path) { + private CallRecord(String method, @Nullable Integer ref, @Nullable String key) { this.method = method; this.ref = ref; this.key = key; - this.current = current; - this.parent = parent; - this.root = root; - this.path = path; } - public static CallRecord reportCallRecord(String method, Integer ref, int current, @Nullable Integer parent, int root, List path) { - return new CallRecord(method, ref, method, current, parent, root, path); + public static CallRecord reportCallRecord(String method, Integer ref) { + return new CallRecord(method, ref, method); } - public static CallRecord viewsCallRecord(String method, String key, int current, @Nullable Integer parent, int root, List path) { - return new CallRecord(method, null, key, current, parent, root, path); + public static CallRecord viewsCallRecord(String method, String key) { + return new CallRecord(method, null, key); } @Override @@ -65,16 +55,12 @@ class CallRecord { CallRecord that = (CallRecord) o; return Objects.equals(ref, that.ref) && Objects.equals(key, that.key) && - Objects.equals(current, that.current) && - Objects.equals(root, that.root) && - Objects.equals(method, that.method) && - Objects.equals(parent, that.parent) && - Objects.equals(path, that.path); + Objects.equals(method, that.method); } @Override public int hashCode() { - return Objects.hash(method, ref, current, parent, root, path); + return Objects.hash(method, ref, key); } @Override @@ -83,10 +69,6 @@ class CallRecord { "method='" + method + '\'' + ", ref=" + ref + ", key=" + key + - ", current=" + current + - ", parent=" + parent + - ", root=" + root + - ", path=" + path + '}'; } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareCrawler.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderPathAwareVisitor.java similarity index 84% rename from server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareCrawler.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderPathAwareVisitor.java index 33f4309eb89..e0675f05b53 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareCrawler.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderPathAwareVisitor.java @@ -28,10 +28,10 @@ import javax.annotation.Nonnull; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.FluentIterable.from; -class TestPathAwareCrawler extends PathAwareCrawler { - final List callsRecords = new ArrayList<>(); +class CallRecorderPathAwareVisitor extends PathAwareVisitorAdapter { + final List callsRecords = new ArrayList<>(); - public TestPathAwareCrawler(Component.Type maxDepth, Order order) { + public CallRecorderPathAwareVisitor(Component.Type maxDepth, Order order) { super(maxDepth, order, new SimpleStackElementFactory() { @Override public Integer createForAny(Component component) { @@ -90,13 +90,13 @@ class TestPathAwareCrawler extends PathAwareCrawler { callsRecords.add(component.getType().isReportType() ? reportCallRecord(component, path, "visitAny") : viewsCallRecord(component, path, "visitAny")); } - private static CallRecord reportCallRecord(Component component, Path path, String method) { - return CallRecord.reportCallRecord(method, component.getReportAttributes().getRef(), path.current(), getParent(path), path.root(), + private static PathAwareCallRecord reportCallRecord(Component component, Path path, String method) { + return PathAwareCallRecord.reportCallRecord(method, component.getReportAttributes().getRef(), path.current(), getParent(path), path.root(), toValueList(path)); } - private static CallRecord viewsCallRecord(Component component, Path path, String method) { - return CallRecord.viewsCallRecord(method, component.getKey(), path.current(), getParent(path), path.root(), + private static PathAwareCallRecord viewsCallRecord(Component component, Path path, String method) { + return PathAwareCallRecord.viewsCallRecord(method, component.getKey(), path.current(), getParent(path), path.root(), toValueList(path)); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderTypeAwareVisitor.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderTypeAwareVisitor.java new file mode 100644 index 00000000000..54c9ff58c38 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/CallRecorderTypeAwareVisitor.java @@ -0,0 +1,80 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.computation.component; + +import java.util.ArrayList; +import java.util.List; + +class CallRecorderTypeAwareVisitor extends TypeAwareVisitorAdapter { + final List callsRecords = new ArrayList<>(); + + public CallRecorderTypeAwareVisitor(Component.Type maxDepth, Order order) { + super(maxDepth, order); + } + + @Override + public void visitProject(Component project) { + callsRecords.add(reportCallRecord(project, "visitProject")); + } + + @Override + public void visitModule(Component module) { + callsRecords.add(reportCallRecord(module, "visitModule")); + } + + @Override + public void visitDirectory(Component directory) { + callsRecords.add(reportCallRecord(directory, "visitDirectory")); + } + + @Override + public void visitFile(Component file) { + callsRecords.add(reportCallRecord(file, "visitFile")); + } + + @Override + public void visitView(Component view) { + callsRecords.add(viewsCallRecord(view, "visitView")); + } + + @Override + public void visitSubView(Component subView) { + callsRecords.add(viewsCallRecord(subView, "visitSubView")); + } + + @Override + public void visitProjectView(Component projectView) { + callsRecords.add(viewsCallRecord(projectView, "visitProjectView")); + } + + @Override + public void visitAny(Component component) { + callsRecords.add(component.getType().isReportType() ? reportCallRecord(component, "visitAny") : viewsCallRecord(component, "visitAny")); + } + + private static CallRecord reportCallRecord(Component component, String method) { + return CallRecord.reportCallRecord(method, component.getReportAttributes().getRef()); + } + + private static CallRecord viewsCallRecord(Component component, String method) { + return CallRecord.viewsCallRecord(method, component.getKey()); + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareCallRecord.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareCallRecord.java new file mode 100644 index 00000000000..7381ae15c74 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareCallRecord.java @@ -0,0 +1,92 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.computation.component; + +import java.util.List; +import java.util.Objects; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; + +class PathAwareCallRecord { + private final String method; + @CheckForNull + private final Integer ref; + @CheckForNull + private final String key; + private final int current; + @CheckForNull + private final Integer parent; + private final int root; + private final List path; + + private PathAwareCallRecord(String method, @Nullable Integer ref, @Nullable String key, int current, @Nullable Integer parent, int root, List path) { + this.method = method; + this.ref = ref; + this.key = key; + this.current = current; + this.parent = parent; + this.root = root; + this.path = path; + } + + public static PathAwareCallRecord reportCallRecord(String method, Integer ref, int current, @Nullable Integer parent, int root, List path) { + return new PathAwareCallRecord(method, ref, method, current, parent, root, path); + } + + public static PathAwareCallRecord viewsCallRecord(String method, String key, int current, @Nullable Integer parent, int root, List path) { + return new PathAwareCallRecord(method, null, key, current, parent, root, path); + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PathAwareCallRecord that = (PathAwareCallRecord) o; + return Objects.equals(ref, that.ref) && + Objects.equals(key, that.key) && + Objects.equals(current, that.current) && + Objects.equals(root, that.root) && + Objects.equals(method, that.method) && + Objects.equals(parent, that.parent) && + Objects.equals(path, that.path); + } + + @Override + public int hashCode() { + return Objects.hash(method, ref, key, current, parent, root, path); + } + + @Override + public String toString() { + return "{" + + "method='" + method + '\'' + + ", ref=" + ref + + ", key=" + key + + ", current=" + current + + ", parent=" + parent + + ", root=" + root + + ", path=" + path + + '}'; + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareVisitorTest.java similarity index 82% rename from server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareCrawlerTest.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareVisitorTest.java index ce14d3d1883..63cc9221bb3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPathAwareVisitorTest.java @@ -33,7 +33,7 @@ import static org.sonar.server.computation.component.Component.Type.PROJECT; import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; -public class ReportPathAwareCrawlerTest { +public class ReportPathAwareVisitorTest { private static final int ROOT_REF = 1; private static final ReportComponent SOME_TREE_ROOT = ReportComponent.builder(PROJECT, ROOT_REF) @@ -67,10 +67,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_FILE() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(FILE, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(FILE, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1, null, of(1)), newCallRecord("visitProject", 1, null, of(1)), newCallRecord("visitAny", 11, 1, of(11, 1)), @@ -99,10 +99,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(DIRECTORY, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(DIRECTORY, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1, null, of(1)), newCallRecord("visitProject", 1, null, of(1)), newCallRecord("visitAny", 11, 1, of(11, 1)), @@ -123,10 +123,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_MODULE() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(MODULE, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(MODULE, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1, null, of(1)), newCallRecord("visitProject", 1, null, of(1)), newCallRecord("visitAny", 11, 1, of(11, 1)), @@ -141,10 +141,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(PROJECT, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(PROJECT, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1, null, of(1)), newCallRecord("visitProject", 1, null, of(1)) ).iterator(); @@ -153,10 +153,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_FILE() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(FILE, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(FILE, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1111, 111, of(1111, 111, 11, 1)), newCallRecord("visitFile", 1111, 111, of(1111, 111, 11, 1)), newCallRecord("visitAny", 1112, 111, of(1112, 111, 11, 1)), @@ -185,10 +185,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(DIRECTORY, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(DIRECTORY, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 111, 11, of(111, 11, 1)), newCallRecord("visitDirectory", 111, 11, of(111, 11, 1)), newCallRecord("visitAny", 112, 11, of(112, 11, 1)), @@ -209,10 +209,10 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_MODULE() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(MODULE, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(MODULE, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 11, 1, of(11, 1)), newCallRecord("visitModule", 11, 1, of(11, 1)), newCallRecord("visitAny", 121, 12, of(121, 12, 1)), @@ -227,25 +227,25 @@ public class ReportPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(PROJECT, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(PROJECT, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( newCallRecord("visitAny", 1, null, of(1)), newCallRecord("visitProject", 1, null, of(1)) ).iterator(); verifyCallRecords(expected, underTest.callsRecords.iterator()); } - private static void verifyCallRecords(Iterator expected, Iterator actual) { + private static void verifyCallRecords(Iterator expected, Iterator actual) { while (expected.hasNext()) { assertThat(actual.next()).isEqualTo(expected.next()); } assertThat(expected.hasNext()).isEqualTo(actual.hasNext()); } - private static CallRecord newCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { - return CallRecord.reportCallRecord(method, currentRef, currentRef, parentRef, ROOT_REF, path); + private static PathAwareCallRecord newCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { + return PathAwareCallRecord.reportCallRecord(method, currentRef, currentRef, parentRef, ROOT_REF, path); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPostOrderDepthTraversalTypeAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPostOrderDepthTraversalTypeAwareCrawlerTest.java index 08477903402..0a12b4d1f19 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPostOrderDepthTraversalTypeAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPostOrderDepthTraversalTypeAwareCrawlerTest.java @@ -21,10 +21,8 @@ package org.sonar.server.computation.component; import org.junit.Test; -import org.mockito.InOrder; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.spy; +import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.server.computation.component.Component.Type.DIRECTORY; import static org.sonar.server.computation.component.Component.Type.FILE; import static org.sonar.server.computation.component.Component.Type.MODULE; @@ -40,263 +38,230 @@ public class ReportPostOrderDepthTraversalTypeAwareCrawlerTest { private static final Component MODULE_2 = component(MODULE, 2, MODULE_3); private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2); - private final DepthTraversalTypeAwareCrawler spyProjectVisitor = spy(new DepthTraversalTypeAwareCrawler(PROJECT, POST_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyModuleVisitor = spy(new DepthTraversalTypeAwareCrawler(MODULE, POST_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyDirectoryVisitor = spy(new DepthTraversalTypeAwareCrawler(DIRECTORY, POST_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyFileVisitor = spy(new DepthTraversalTypeAwareCrawler(FILE, POST_ORDER) { - }); - private final InOrder inOrder = inOrder(spyProjectVisitor, spyModuleVisitor, spyDirectoryVisitor, spyFileVisitor); - - @Test(expected = NullPointerException.class) - public void non_null_max_depth_fast_fail() { - new DepthTraversalTypeAwareCrawler(null, POST_ORDER) { - }; - } + private final CallRecorderTypeAwareVisitor projectVisitor = new CallRecorderTypeAwareVisitor(PROJECT, POST_ORDER); + private final CallRecorderTypeAwareVisitor moduleVisitor = new CallRecorderTypeAwareVisitor(MODULE, POST_ORDER); + private final CallRecorderTypeAwareVisitor directoryVisitor = new CallRecorderTypeAwareVisitor(DIRECTORY, POST_ORDER); + private final CallRecorderTypeAwareVisitor fileVisitor = new CallRecorderTypeAwareVisitor(FILE, POST_ORDER); + private final DepthTraversalTypeAwareCrawler projectCrawler = new DepthTraversalTypeAwareCrawler(projectVisitor); + private final DepthTraversalTypeAwareCrawler moduleCrawler = new DepthTraversalTypeAwareCrawler(moduleVisitor); + private final DepthTraversalTypeAwareCrawler directoryCrawler = new DepthTraversalTypeAwareCrawler(directoryVisitor); + private final DepthTraversalTypeAwareCrawler fileCrawler = new DepthTraversalTypeAwareCrawler(fileVisitor); @Test(expected = NullPointerException.class) public void visit_null_Component_throws_NPE() { - spyFileVisitor.visit(null); + fileCrawler.visit(null); } @Test public void visit_file_with_depth_FILE_calls_visit_file() { Component component = component(FILE, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitFile(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitFile", component)); } @Test public void visit_module_with_depth_FILE_calls_visit_module() { Component component = component(MODULE, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_directory_with_depth_FILE_calls_visit_directory() { Component component = component(DIRECTORY, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitDirectory(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitDirectory", component)); } @Test public void visit_project_with_depth_FILE_calls_visit_project() { Component component = component(PROJECT, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file_nor_visitAny() { Component component = component(FILE, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_DIRECTORY_calls_visit_directory() { Component component = component(DIRECTORY, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitDirectory(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitDirectory", component)); } @Test public void visit_module_with_depth_DIRECTORY_calls_visit_module() { Component component = component(MODULE, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_project_with_depth_DIRECTORY_calls_visit_project() { Component component = component(PROJECT, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void visit_file_with_depth_MODULE_does_not_call_visit_file_nor_visitAny() { Component component = component(FILE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_MODULE_does_not_call_visit_directory_nor_visitAny() { Component component = component(DIRECTORY, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).isEmpty(); } @Test public void visit_module_with_depth_MODULE_calls_visit_module() { Component component = component(MODULE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verify(spyModuleVisitor).visitAny(component); - inOrder.verify(spyModuleVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_project_with_depth_MODULE_calls_visit_project() { Component component = component(MODULE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verify(spyModuleVisitor).visitAny(component); - inOrder.verify(spyModuleVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_file_with_depth_PROJECT_does_not_call_visit_file_nor_visitAny() { Component component = component(FILE, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory_nor_visitAny() { Component component = component(DIRECTORY, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_module_with_depth_PROJECT_does_not_call_visit_module_nor_visitAny() { Component component = component(MODULE, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_project_with_depth_PROJECT_calls_visit_project() { Component component = component(PROJECT, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verify(spyProjectVisitor).visitAny(component); - inOrder.verify(spyProjectVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void verify_visit_call_when_visit_tree_with_depth_FILE() { - spyFileVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyFileVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyFileVisitor).visit(MODULE_2); - inOrder.verify(spyFileVisitor).visit(MODULE_3); - inOrder.verify(spyFileVisitor).visit(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visit(FILE_5); - inOrder.verify(spyFileVisitor).visitAny(FILE_5); - inOrder.verify(spyFileVisitor).visitFile(FILE_5); - inOrder.verify(spyFileVisitor).visit(FILE_6); - inOrder.verify(spyFileVisitor).visitAny(FILE_6); - inOrder.verify(spyFileVisitor).visitFile(FILE_6); - inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visitAny(MODULE_3); - inOrder.verify(spyFileVisitor).visitModule(MODULE_3); - inOrder.verify(spyFileVisitor).visitAny(MODULE_2); - inOrder.verify(spyFileVisitor).visitModule(MODULE_2); - inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyFileVisitor).visitProject(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + fileCrawler.visit(COMPONENT_TREE); + + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", FILE_5), + reportCallRecord("visitFile", FILE_5), + reportCallRecord("visitAny", FILE_6), + reportCallRecord("visitFile", FILE_6), + reportCallRecord("visitAny", DIRECTORY_4), + reportCallRecord("visitDirectory", DIRECTORY_4), + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE)); } @Test public void verify_visit_call_when_visit_tree_with_depth_DIRECTORY() { - spyDirectoryVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyDirectoryVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyDirectoryVisitor).visit(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visit(MODULE_3); - inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4); - inOrder.verify(spyDirectoryVisitor).visitAny(DIRECTORY_4); - inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4); - inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_3); - inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3); - inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyDirectoryVisitor).visitProject(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + directoryCrawler.visit(COMPONENT_TREE); + + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", DIRECTORY_4), + reportCallRecord("visitDirectory", DIRECTORY_4), + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE)); } @Test public void verify_visit_call_when_visit_tree_with_depth_MODULE() { - spyModuleVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyModuleVisitor).visit(MODULE_2); - inOrder.verify(spyModuleVisitor).visit(MODULE_3); - inOrder.verify(spyModuleVisitor).visitAny(MODULE_3); - inOrder.verify(spyModuleVisitor).visitModule(MODULE_3); - inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); - inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); - inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyModuleVisitor).visitProject(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + moduleCrawler.visit(COMPONENT_TREE); + + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE)); } @Test public void verify_visit_call_when_visit_tree_with_depth_PROJECT() { - spyProjectVisitor.visit(COMPONENT_TREE); + projectCrawler.visit(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visitProject(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE)); } private static Component component(final Component.Type type, final int ref, final Component... children) { return ReportComponent.builder(type, ref).addChildren(children).build(); } + private static CallRecord reportCallRecord(String methodName, Component component) { + return CallRecord.reportCallRecord(methodName, component.getReportAttributes().getRef()); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPreOrderDepthTraversalTypeAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPreOrderDepthTraversalTypeAwareCrawlerTest.java index 955c06ef41d..4f7c6871438 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPreOrderDepthTraversalTypeAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportPreOrderDepthTraversalTypeAwareCrawlerTest.java @@ -21,10 +21,8 @@ package org.sonar.server.computation.component; import org.junit.Test; -import org.mockito.InOrder; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.spy; +import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.server.computation.component.Component.Type.DIRECTORY; import static org.sonar.server.computation.component.Component.Type.FILE; import static org.sonar.server.computation.component.Component.Type.MODULE; @@ -40,258 +38,231 @@ public class ReportPreOrderDepthTraversalTypeAwareCrawlerTest { private static final Component MODULE_2 = component(MODULE, 2, MODULE_3); private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2); - private final DepthTraversalTypeAwareCrawler spyProjectVisitor = spy(new DepthTraversalTypeAwareCrawler(PROJECT, PRE_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyModuleVisitor = spy(new DepthTraversalTypeAwareCrawler(MODULE, PRE_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyDirectoryVisitor = spy(new DepthTraversalTypeAwareCrawler(DIRECTORY, PRE_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyFileVisitor = spy(new DepthTraversalTypeAwareCrawler(FILE, PRE_ORDER) { - }); - private final InOrder inOrder = inOrder(spyProjectVisitor, spyModuleVisitor, spyDirectoryVisitor, spyFileVisitor); + private final CallRecorderTypeAwareVisitor projectVisitor = new CallRecorderTypeAwareVisitor(PROJECT, PRE_ORDER); + private final CallRecorderTypeAwareVisitor moduleVisitor = new CallRecorderTypeAwareVisitor(MODULE, PRE_ORDER); + private final CallRecorderTypeAwareVisitor directoryVisitor = new CallRecorderTypeAwareVisitor(DIRECTORY, PRE_ORDER); + private final CallRecorderTypeAwareVisitor fileVisitor = new CallRecorderTypeAwareVisitor(FILE, PRE_ORDER); - @Test(expected = NullPointerException.class) - public void non_null_max_depth_fast_fail() { - new DepthTraversalTypeAwareCrawler(null, PRE_ORDER) { - }; - } + private final DepthTraversalTypeAwareCrawler projectCrawler = new DepthTraversalTypeAwareCrawler(projectVisitor); + private final DepthTraversalTypeAwareCrawler moduleCrawler = new DepthTraversalTypeAwareCrawler(moduleVisitor); + private final DepthTraversalTypeAwareCrawler directoryCrawler = new DepthTraversalTypeAwareCrawler(directoryVisitor); + private final DepthTraversalTypeAwareCrawler fileCrawler = new DepthTraversalTypeAwareCrawler(fileVisitor); @Test(expected = NullPointerException.class) public void visit_null_Component_throws_NPE() { - spyFileVisitor.visit(null); + fileCrawler.visit(null); } @Test public void visit_file_with_depth_FILE_calls_visit_file() { Component component = component(FILE, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitFile(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitFile", component)); } @Test public void visit_module_with_depth_FILE_calls_visit_module() { Component component = component(MODULE, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_directory_with_depth_FILE_calls_visit_directory() { Component component = component(DIRECTORY, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitAny(component); - inOrder.verify(spyFileVisitor).visitDirectory(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitDirectory", component)); } @Test public void visit_project_with_depth_FILE_calls_visit_project() { Component component = component(PROJECT, 1); - spyFileVisitor.visit(component); + fileCrawler.visit(component); - inOrder.verify(spyFileVisitor).visit(component); - inOrder.verify(spyFileVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file_nor_visitAny() { Component component = component(FILE, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_DIRECTORY_calls_visit_directory() { Component component = component(DIRECTORY, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitDirectory(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitDirectory", component)); } @Test public void visit_module_with_depth_DIRECTORY_calls_visit_module() { Component component = component(MODULE, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_project_with_depth_DIRECTORY_calls_visit_project() { Component component = component(PROJECT, 1); - spyDirectoryVisitor.visit(component); + directoryCrawler.visit(component); - inOrder.verify(spyDirectoryVisitor).visit(component); - inOrder.verify(spyDirectoryVisitor).visitAny(component); - inOrder.verify(spyDirectoryVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void visit_file_with_depth_MODULE_does_not_call_visit_file_nor_visit_any() { Component component = component(FILE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_MODULE_does_not_call_visit_directory_not_visit_any() { Component component = component(DIRECTORY, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).isEmpty(); } @Test public void visit_module_with_depth_MODULE_calls_visit_module() { Component component = component(MODULE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verify(spyModuleVisitor).visitAny(component); - inOrder.verify(spyModuleVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_project_with_depth_MODULE_calls_visit_project() { Component component = component(MODULE, 1); - spyModuleVisitor.visit(component); + moduleCrawler.visit(component); - inOrder.verify(spyModuleVisitor).visit(component); - inOrder.verify(spyModuleVisitor).visitAny(component); - inOrder.verify(spyModuleVisitor).visitModule(component); - inOrder.verifyNoMoreInteractions(); + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitModule", component)); } @Test public void visit_file_with_depth_PROJECT_does_not_call_visit_file_nor_visitAny() { Component component = component(FILE, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory_nor_visitAny() { Component component = component(DIRECTORY, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_module_with_depth_PROJECT_does_not_call_visit_module_nor_visitAny() { Component component = component(MODULE, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).isEmpty(); } @Test public void visit_project_with_depth_PROJECT_calls_visit_project_nor_visitAny() { Component component = component(PROJECT, 1); - spyProjectVisitor.visit(component); + projectCrawler.visit(component); - inOrder.verify(spyProjectVisitor).visit(component); - inOrder.verify(spyProjectVisitor).visitAny(component); - inOrder.verify(spyProjectVisitor).visitProject(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", component), + reportCallRecord("visitProject", component)); } @Test public void verify_visit_call_when_visit_tree_with_depth_FILE() { - spyFileVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyFileVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyFileVisitor).visitProject(COMPONENT_TREE); - inOrder.verify(spyFileVisitor).visit(MODULE_2); - inOrder.verify(spyFileVisitor).visitAny(MODULE_2); - inOrder.verify(spyFileVisitor).visitModule(MODULE_2); - inOrder.verify(spyFileVisitor).visit(MODULE_3); - inOrder.verify(spyFileVisitor).visitAny(MODULE_3); - inOrder.verify(spyFileVisitor).visitModule(MODULE_3); - inOrder.verify(spyFileVisitor).visit(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4); - inOrder.verify(spyFileVisitor).visit(FILE_5); - inOrder.verify(spyFileVisitor).visitAny(FILE_5); - inOrder.verify(spyFileVisitor).visitFile(FILE_5); - inOrder.verify(spyFileVisitor).visit(FILE_6); - inOrder.verify(spyFileVisitor).visitAny(FILE_6); - inOrder.verify(spyFileVisitor).visitFile(FILE_6); - inOrder.verifyNoMoreInteractions(); + fileCrawler.visit(COMPONENT_TREE); + + assertThat(fileVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3), + reportCallRecord("visitAny", DIRECTORY_4), + reportCallRecord("visitDirectory", DIRECTORY_4), + reportCallRecord("visitAny", FILE_5), + reportCallRecord("visitFile", FILE_5), + reportCallRecord("visitAny", FILE_6), + reportCallRecord("visitFile", FILE_6)); } @Test public void verify_visit_call_when_visit_tree_with_depth_DIRECTORY() { - spyDirectoryVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyDirectoryVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyDirectoryVisitor).visitProject(COMPONENT_TREE); - inOrder.verify(spyDirectoryVisitor).visit(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visit(MODULE_3); - inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3); - inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4); - inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4); - inOrder.verifyNoMoreInteractions(); + directoryCrawler.visit(COMPONENT_TREE); + + assertThat(directoryVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3), + reportCallRecord("visitAny", DIRECTORY_4), + reportCallRecord("visitDirectory", DIRECTORY_4)); } @Test public void verify_visit_call_when_visit_tree_with_depth_MODULE() { - spyModuleVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyModuleVisitor).visitProject(COMPONENT_TREE); - inOrder.verify(spyModuleVisitor).visit(MODULE_2); - inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); - inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); - inOrder.verify(spyModuleVisitor).visit(MODULE_3); - inOrder.verify(spyModuleVisitor).visitAny(MODULE_3); - inOrder.verify(spyModuleVisitor).visitModule(MODULE_3); - inOrder.verifyNoMoreInteractions(); + moduleCrawler.visit(COMPONENT_TREE); + + assertThat(moduleVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE), + reportCallRecord("visitAny", MODULE_2), + reportCallRecord("visitModule", MODULE_2), + reportCallRecord("visitAny", MODULE_3), + reportCallRecord("visitModule", MODULE_3)); } @Test public void verify_visit_call_when_visit_tree_with_depth_PROJECT() { - spyProjectVisitor.visit(COMPONENT_TREE); + projectCrawler.visit(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyProjectVisitor).visitProject(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + assertThat(projectVisitor.callsRecords).containsExactly( + reportCallRecord("visitAny", COMPONENT_TREE), + reportCallRecord("visitProject", COMPONENT_TREE)); } private static Component component(final Component.Type type, final int ref, final Component... children) { return ReportComponent.builder(type, ref).addChildren(children).build(); } + private static CallRecord reportCallRecord(String methodName, Component component) { + return CallRecord.reportCallRecord(methodName, component.getReportAttributes().getRef()); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportVisitorsCrawlerWithPathAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportVisitorsCrawlerWithPathAwareVisitorTest.java index ba5c5e77540..b6611b59698 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportVisitorsCrawlerWithPathAwareVisitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ReportVisitorsCrawlerWithPathAwareVisitorTest.java @@ -69,11 +69,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_FILE() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(FILE, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(FILE, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1, null, of(1)), reportCallRecord("visitProject", 1, null, of(1)), reportCallRecord("visitAny", 11, 1, of(11, 1)), @@ -102,11 +102,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(DIRECTORY, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(DIRECTORY, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1, null, of(1)), reportCallRecord("visitProject", 1, null, of(1)), reportCallRecord("visitAny", 11, 1, of(11, 1)), @@ -127,11 +127,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_MODULE() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(MODULE, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(MODULE, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1, null, of(1)), reportCallRecord("visitProject", 1, null, of(1)), reportCallRecord("visitAny", 11, 1, of(11, 1)), @@ -146,11 +146,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(PROJECT, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(PROJECT, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1, null, of(1)), reportCallRecord("visitProject", 1, null, of(1)) ).iterator(); @@ -159,11 +159,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_FILE() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(FILE, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(FILE, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1111, 111, of(1111, 111, 11, 1)), reportCallRecord("visitFile", 1111, 111, of(1111, 111, 11, 1)), reportCallRecord("visitAny", 1112, 111, of(1112, 111, 11, 1)), @@ -192,11 +192,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(DIRECTORY, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(DIRECTORY, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 111, 11, of(111, 11, 1)), reportCallRecord("visitDirectory", 111, 11, of(111, 11, 1)), reportCallRecord("visitAny", 112, 11, of(112, 11, 1)), @@ -217,11 +217,11 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_MODULE() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(MODULE, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(MODULE, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 11, 1, of(11, 1)), reportCallRecord("visitModule", 11, 1, of(11, 1)), reportCallRecord("visitAny", 121, 12, of(121, 12, 1)), @@ -236,25 +236,25 @@ public class ReportVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(PROJECT, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(PROJECT, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( reportCallRecord("visitAny", 1, null, of(1)), reportCallRecord("visitProject", 1, null, of(1)) ).iterator(); verifyCallRecords(expected, visitor.callsRecords.iterator()); } - private static void verifyCallRecords(Iterator expected, Iterator actual) { + private static void verifyCallRecords(Iterator expected, Iterator actual) { while (expected.hasNext()) { assertThat(actual.next()).isEqualTo(expected.next()); } } - private static CallRecord reportCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { - return CallRecord.reportCallRecord(method, currentRef, currentRef, parentRef, ROOT_REF, path); + private static PathAwareCallRecord reportCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { + return PathAwareCallRecord.reportCallRecord(method, currentRef, currentRef, parentRef, ROOT_REF, path); } private static VisitorsCrawler newVisitorsCrawler(ComponentVisitor componentVisitor) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareVisitor.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareVisitor.java deleted file mode 100644 index e4c7c4203ae..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TestPathAwareVisitor.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube 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. - * - * SonarQube 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.server.computation.component; - -import com.google.common.base.Function; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; -import javax.annotation.Nonnull; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.FluentIterable.from; - -class TestPathAwareVisitor extends PathAwareVisitorAdapter { - final List callsRecords = new ArrayList<>(); - - public TestPathAwareVisitor(Component.Type maxDepth, Order order) { - super(maxDepth, order, new SimpleStackElementFactory() { - @Override - public Integer createForAny(Component component) { - return component.getType().isReportType() ? component.getReportAttributes().getRef() : Integer.valueOf(component.getKey()); - } - }); - } - - @Override - public void visitProject(Component project, Path path) { - callsRecords.add(reportCallRecord(project, path, "visitProject")); - } - - @Override - public void visitModule(Component module, Path path) { - callsRecords.add(reportCallRecord(module, path, "visitModule")); - } - - @Override - public void visitDirectory(Component directory, Path path) { - callsRecords.add(reportCallRecord(directory, path, "visitDirectory")); - } - - @Override - public void visitFile(Component file, Path path) { - callsRecords.add(reportCallRecord(file, path, "visitFile")); - } - - @Override - public void visitView(Component view, Path path) { - callsRecords.add(viewsCallRecord(view, path, "visitView")); - } - - @Override - public void visitSubView(Component subView, Path path) { - callsRecords.add(viewsCallRecord(subView, path, "visitSubView")); - } - - @Override - public void visitProjectView(Component projectView, Path path) { - callsRecords.add(viewsCallRecord(projectView, path, "visitProjectView")); - } - - @Override - public void visitUnknown(Component unknownComponent, Path path) { - if (unknownComponent.getType().isViewsType()) { - callsRecords.add(viewsCallRecord(unknownComponent, path, "visitUnknown")); - } else if (unknownComponent.getType().isReportType()) { - callsRecords.add(viewsCallRecord(unknownComponent, path, "visitUnknown")); - } - throw new UnsupportedOperationException("Can not record call to visitUnknown"); - } - - @Override - public void visitAny(Component component, Path path) { - callsRecords.add(component.getType().isReportType() ? reportCallRecord(component, path, "visitAny") : viewsCallRecord(component, path, "visitAny")); - } - - private static CallRecord reportCallRecord(Component component, Path path, String method) { - return CallRecord.reportCallRecord(method, component.getReportAttributes().getRef(), path.current(), getParent(path), path.root(), - toValueList(path)); - } - - private static CallRecord viewsCallRecord(Component component, Path path, String method) { - return CallRecord.viewsCallRecord(method, component.getKey(), path.current(), getParent(path), path.root(), - toValueList(path)); - } - - private static List toValueList(Path path) { - return from(path.getCurrentPath()).transform(new Function, Integer>() { - @Nonnull - @Override - public Integer apply(@Nonnull PathElement input) { - return input.getElement(); - } - }).toList(); - } - - private static Integer getParent(Path path) { - try { - Integer parent = path.parent(); - checkArgument(parent != null, "Path.parent returned a null value!"); - return parent; - } catch (NoSuchElementException e) { - return null; - } - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TypeAwareCrawler.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/TypeAwareVisitorAdapterTest.java similarity index 74% rename from server/sonar-server/src/main/java/org/sonar/server/computation/component/TypeAwareCrawler.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/component/TypeAwareVisitorAdapterTest.java index 2a10a165a6e..bcc3cb5e593 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TypeAwareCrawler.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/TypeAwareVisitorAdapterTest.java @@ -19,13 +19,15 @@ */ package org.sonar.server.computation.component; -/** - * A {@link ComponentCrawler} which can exposes methods which ensure the type of the visited Component. - */ -public interface TypeAwareCrawler extends ComponentCrawler, TypeAwareVisitor { +import org.junit.Test; + +import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; + +public class TypeAwareVisitorAdapterTest { + @Test(expected = NullPointerException.class) + public void non_null_max_depth_fast_fail() { + new TypeAwareVisitorAdapter(null, POST_ORDER) { + }; + } - /** - * Called when encountering a Component of an unknown type - */ - void visitUnknown(Component tree); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareVisitorTest.java similarity index 83% rename from server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareCrawlerTest.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareVisitorTest.java index c4021317bc0..d04eea8eb1f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPathAwareVisitorTest.java @@ -32,7 +32,7 @@ import static org.sonar.server.computation.component.Component.Type.VIEW; import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; -public class ViewsPathAwareCrawlerTest { +public class ViewsPathAwareVisitorTest { private static final int ROOT_KEY = 1; private static final Component SOME_TREE_ROOT = ViewsComponent.builder(VIEW, ROOT_KEY) @@ -66,10 +66,10 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(PROJECT_VIEW, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(PROJECT_VIEW, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)), viewsCallRecord("visitAny", 11, 1, of(11, 1)), @@ -98,10 +98,10 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_SUBVIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(SUBVIEW, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(SUBVIEW, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)), viewsCallRecord("visitAny", 11, 1, of(11, 1)), @@ -122,10 +122,10 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_VIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(VIEW, PRE_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(VIEW, PRE_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)) ).iterator(); @@ -134,10 +134,10 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(PROJECT_VIEW, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(PROJECT_VIEW, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1111, 111, of(1111, 111, 11, 1)), viewsCallRecord("visitProjectView", 1111, 111, of(1111, 111, 11, 1)), viewsCallRecord("visitAny", 1112, 111, of(1112, 111, 11, 1)), @@ -166,10 +166,10 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_SUBVIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(SUBVIEW, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(SUBVIEW, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 111, 11, of(111, 11, 1)), viewsCallRecord("visitSubView", 111, 11, of(111, 11, 1)), viewsCallRecord("visitAny", 112, 11, of(112, 11, 1)), @@ -190,17 +190,17 @@ public class ViewsPathAwareCrawlerTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_VIEW() { - TestPathAwareCrawler underTest = new TestPathAwareCrawler(VIEW, POST_ORDER); - underTest.visit(SOME_TREE_ROOT); + CallRecorderPathAwareVisitor underTest = new CallRecorderPathAwareVisitor(VIEW, POST_ORDER); + new PathAwareCrawler<>(underTest).visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)) ).iterator(); verifyCallRecords(expected, underTest.callsRecords.iterator()); } - private static void verifyCallRecords(Iterator expected, Iterator actual) { + private static void verifyCallRecords(Iterator expected, Iterator actual) { int i = 1; while (expected.hasNext()) { assertThat(actual.next()).describedAs(String.format("Expected call n°%s does not match actual call n°%s", i, i)).isEqualTo(expected.next()); @@ -209,8 +209,8 @@ public class ViewsPathAwareCrawlerTest { assertThat(expected.hasNext()).isEqualTo(actual.hasNext()); } - private static CallRecord viewsCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { - return CallRecord.viewsCallRecord(method, String.valueOf(currentRef), currentRef, parentRef, ROOT_KEY, path); + private static PathAwareCallRecord viewsCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { + return PathAwareCallRecord.viewsCallRecord(method, String.valueOf(currentRef), currentRef, parentRef, ROOT_KEY, path); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPostOrderDepthTraversalTypeAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPostOrderDepthTraversalTypeAwareCrawlerTest.java index f43f2ecf932..b0e3d645d55 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPostOrderDepthTraversalTypeAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPostOrderDepthTraversalTypeAwareCrawlerTest.java @@ -21,12 +21,10 @@ package org.sonar.server.computation.component; import org.junit.Test; -import org.mockito.InOrder; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.spy; -import static org.sonar.server.computation.component.Component.Type.SUBVIEW; +import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.server.computation.component.Component.Type.PROJECT_VIEW; +import static org.sonar.server.computation.component.Component.Type.SUBVIEW; import static org.sonar.server.computation.component.Component.Type.VIEW; import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER; @@ -39,174 +37,152 @@ public class ViewsPostOrderDepthTraversalTypeAwareCrawlerTest { private static final Component SUBVIEW_2 = component(SUBVIEW, 2, SUBVIEW_3); private static final Component COMPONENT_TREE = component(VIEW, 1, SUBVIEW_2); - private final DepthTraversalTypeAwareCrawler spyViewVisitor = spy(new DepthTraversalTypeAwareCrawler(VIEW, POST_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spySubViewVisitor = spy(new DepthTraversalTypeAwareCrawler(SUBVIEW, POST_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyProjectViewVisitor = spy(new DepthTraversalTypeAwareCrawler(PROJECT_VIEW, POST_ORDER) { - }); - private final InOrder inOrder = inOrder(spyViewVisitor, spySubViewVisitor, spyProjectViewVisitor); + private final CallRecorderTypeAwareVisitor viewVisitor = new CallRecorderTypeAwareVisitor(VIEW, POST_ORDER); + private final CallRecorderTypeAwareVisitor subViewVisitor = new CallRecorderTypeAwareVisitor(SUBVIEW, POST_ORDER); + private final CallRecorderTypeAwareVisitor projectViewVisitor = new CallRecorderTypeAwareVisitor(PROJECT_VIEW, POST_ORDER); - @Test(expected = NullPointerException.class) - public void non_null_max_depth_fast_fail() { - new DepthTraversalTypeAwareCrawler(null, POST_ORDER) { - }; - } + private final DepthTraversalTypeAwareCrawler viewCrawler = new DepthTraversalTypeAwareCrawler(viewVisitor); + private final DepthTraversalTypeAwareCrawler subViewCrawler = new DepthTraversalTypeAwareCrawler(subViewVisitor); + private final DepthTraversalTypeAwareCrawler projectViewCrawler = new DepthTraversalTypeAwareCrawler(projectViewVisitor); @Test(expected = NullPointerException.class) public void visit_null_Component_throws_NPE() { - spyProjectViewVisitor.visit(null); + projectViewCrawler.visit(null); } @Test public void visit_viewView_with_depth_PROJECT_VIEW_calls_visit_viewView() { Component component = component(PROJECT_VIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitAny(component); - inOrder.verify(spyProjectViewVisitor).visitProjectView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitProjectView", component)); } @Test public void visit_subView_with_depth_PROJECT_VIEW_calls_visit_subView() { Component component = component(SUBVIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitAny(component); - inOrder.verify(spyProjectViewVisitor).visitSubView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitSubView", component)); } @Test public void visit_view_with_depth_PROJECT_VIEW_calls_visit_view() { Component component = component(VIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitAny(component); - inOrder.verify(spyProjectViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void visit_viewView_with_depth_SUBVIEW_does_not_call_visit_viewView_nor_visitAny() { Component component = component(PROJECT_VIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).isEmpty(); } @Test public void visit_subView_with_depth_SUBVIEW_calls_visit_subView() { Component component = component(SUBVIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verify(spySubViewVisitor).visitAny(component); - inOrder.verify(spySubViewVisitor).visitSubView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitSubView", component)); } @Test public void visit_view_with_depth_SUBVIEW_calls_visit_view() { Component component = component(VIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verify(spySubViewVisitor).visitAny(component); - inOrder.verify(spySubViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void visit_viewView_with_depth_VIEW_does_not_call_visit_viewView_nor_visitAny() { Component component = component(PROJECT_VIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).isEmpty(); } @Test public void visit_subView_with_depth_VIEW_does_not_call_visit_subView_nor_visitAny() { Component component = component(SUBVIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).isEmpty(); } @Test public void visit_view_with_depth_VIEW_calls_visit_view() { Component component = component(VIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verify(spyViewVisitor).visitAny(component); - inOrder.verify(spyViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void verify_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - spyProjectViewVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyProjectViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visit(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visitAny(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visitProjectView(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visit(PROJECT_VIEW_6); - inOrder.verify(spyProjectViewVisitor).visitAny(PROJECT_VIEW_6); - inOrder.verify(spyProjectViewVisitor).visitProjectView(PROJECT_VIEW_6); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyProjectViewVisitor).visitView(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + projectViewCrawler.visit(COMPONENT_TREE); + + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", PROJECT_VIEW_5), + viewsCallRecord("visitProjectView", PROJECT_VIEW_5), + viewsCallRecord("visitAny", PROJECT_VIEW_6), + viewsCallRecord("visitProjectView", PROJECT_VIEW_6), + viewsCallRecord("visitAny", SUBVIEW_4), + viewsCallRecord("visitSubView", SUBVIEW_4), + viewsCallRecord("visitAny", SUBVIEW_3), + viewsCallRecord("visitSubView", SUBVIEW_3), + viewsCallRecord("visitAny", SUBVIEW_2), + viewsCallRecord("visitSubView", SUBVIEW_2), + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE)); } @Test public void verify_visit_call_when_visit_tree_with_depth_SUBVIEW() { - spySubViewVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spySubViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_2); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_3); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_4); - inOrder.verify(spySubViewVisitor).visitAny(SUBVIEW_4); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_4); - inOrder.verify(spySubViewVisitor).visitAny(SUBVIEW_3); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_3); - inOrder.verify(spySubViewVisitor).visitAny(SUBVIEW_2); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_2); - inOrder.verify(spySubViewVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spySubViewVisitor).visitView(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + subViewCrawler.visit(COMPONENT_TREE); + + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", SUBVIEW_4), + viewsCallRecord("visitSubView", SUBVIEW_4), + viewsCallRecord("visitAny", SUBVIEW_3), + viewsCallRecord("visitSubView", SUBVIEW_3), + viewsCallRecord("visitAny", SUBVIEW_2), + viewsCallRecord("visitSubView", SUBVIEW_2), + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE)); } @Test public void verify_visit_call_when_visit_tree_with_depth_VIEW() { - spyViewVisitor.visit(COMPONENT_TREE); + viewCrawler.visit(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visitView(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE)); } private static Component component(Component.Type type, int ref, Component... children) { return ViewsComponent.builder(type, ref).addChildren(children).build(); } + private static CallRecord viewsCallRecord(String methodName, Component component) { + return CallRecord.viewsCallRecord(methodName, component.getKey()); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPreOrderDepthTraversalTypeAwareCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPreOrderDepthTraversalTypeAwareCrawlerTest.java index d9c33abe217..2eec3f9d463 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPreOrderDepthTraversalTypeAwareCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsPreOrderDepthTraversalTypeAwareCrawlerTest.java @@ -21,12 +21,10 @@ package org.sonar.server.computation.component; import org.junit.Test; -import org.mockito.InOrder; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.spy; -import static org.sonar.server.computation.component.Component.Type.SUBVIEW; +import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.server.computation.component.Component.Type.PROJECT_VIEW; +import static org.sonar.server.computation.component.Component.Type.SUBVIEW; import static org.sonar.server.computation.component.Component.Type.VIEW; import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER; @@ -39,169 +37,152 @@ public class ViewsPreOrderDepthTraversalTypeAwareCrawlerTest { private static final Component SUBVIEW_2 = component(SUBVIEW, 2, SUBVIEW_3); private static final Component COMPONENT_TREE = component(VIEW, 1, SUBVIEW_2); - private final DepthTraversalTypeAwareCrawler spyViewVisitor = spy(new DepthTraversalTypeAwareCrawler(VIEW, PRE_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spySubViewVisitor = spy(new DepthTraversalTypeAwareCrawler(SUBVIEW, PRE_ORDER) { - }); - private final DepthTraversalTypeAwareCrawler spyProjectViewVisitor = spy(new DepthTraversalTypeAwareCrawler(PROJECT_VIEW, PRE_ORDER) { - }); - private final InOrder inOrder = inOrder(spyViewVisitor, spySubViewVisitor, spyProjectViewVisitor); + private final CallRecorderTypeAwareVisitor viewVisitor = new CallRecorderTypeAwareVisitor(VIEW, PRE_ORDER); + private final CallRecorderTypeAwareVisitor subViewVisitor = new CallRecorderTypeAwareVisitor(SUBVIEW, PRE_ORDER); + private final CallRecorderTypeAwareVisitor projectViewVisitor = new CallRecorderTypeAwareVisitor(PROJECT_VIEW, PRE_ORDER); - @Test(expected = NullPointerException.class) - public void non_null_max_depth_fast_fail() { - new DepthTraversalTypeAwareCrawler(null, PRE_ORDER) { - }; - } + private final DepthTraversalTypeAwareCrawler viewCrawler = new DepthTraversalTypeAwareCrawler(viewVisitor); + private final DepthTraversalTypeAwareCrawler subViewCrawler = new DepthTraversalTypeAwareCrawler(subViewVisitor); + private final DepthTraversalTypeAwareCrawler projectViewCrawler = new DepthTraversalTypeAwareCrawler(projectViewVisitor); @Test(expected = NullPointerException.class) public void visit_null_Component_throws_NPE() { - spyProjectViewVisitor.visit(null); + projectViewCrawler.visit(null); } @Test public void visit_projectView_with_depth_PROJECT_VIEW_calls_visit_projectView() { Component component = component(PROJECT_VIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitAny(component); - inOrder.verify(spyProjectViewVisitor).visitProjectView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitProjectView", component)); } @Test public void visit_subView_with_depth_PROJECT_VIEW_calls_visit_subView() { Component component = component(SUBVIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitAny(component); - inOrder.verify(spyProjectViewVisitor).visitSubView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitSubView", component)); } @Test public void visit_view_with_depth_PROJECT_VIEW_calls_visit_view() { Component component = component(VIEW, 1); - spyProjectViewVisitor.visit(component); + projectViewCrawler.visit(component); - inOrder.verify(spyProjectViewVisitor).visit(component); - inOrder.verify(spyProjectViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void visit_projectView_with_depth_SUBVIEW_does_not_call_visit_projectView_nor_visitAny() { Component component = component(PROJECT_VIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).isEmpty(); } @Test public void visit_subView_with_depth_SUBVIEW_calls_visit_subView() { Component component = component(SUBVIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verify(spySubViewVisitor).visitAny(component); - inOrder.verify(spySubViewVisitor).visitSubView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitSubView", component)); } @Test public void visit_view_with_depth_SUBVIEW_calls_visit_view() { Component component = component(VIEW, 1); - spySubViewVisitor.visit(component); + subViewCrawler.visit(component); - inOrder.verify(spySubViewVisitor).visit(component); - inOrder.verify(spySubViewVisitor).visitAny(component); - inOrder.verify(spySubViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void visit_projectView_with_depth_VIEW_does_not_call_visit_projectView_nor_visitAny() { Component component = component(PROJECT_VIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).isEmpty(); } @Test public void visit_subView_with_depth_VIEW_does_not_call_visit_subView_nor_visitAny() { Component component = component(SUBVIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).isEmpty(); } @Test public void visit_view_with_depth_VIEW_calls_visit_view_nor_visitAny() { Component component = component(VIEW, 1); - spyViewVisitor.visit(component); + viewCrawler.visit(component); - inOrder.verify(spyViewVisitor).visit(component); - inOrder.verify(spyViewVisitor).visitAny(component); - inOrder.verify(spyViewVisitor).visitView(component); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", component), + viewsCallRecord("visitView", component)); } @Test public void verify_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - spyProjectViewVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spyProjectViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyProjectViewVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyProjectViewVisitor).visitView(COMPONENT_TREE); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_2); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_3); - inOrder.verify(spyProjectViewVisitor).visit(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visitAny(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visitSubView(SUBVIEW_4); - inOrder.verify(spyProjectViewVisitor).visit(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visitAny(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visitProjectView(PROJECT_VIEW_5); - inOrder.verify(spyProjectViewVisitor).visit(PROJECT_VIEW_6); - inOrder.verify(spyProjectViewVisitor).visitAny(PROJECT_VIEW_6); - inOrder.verify(spyProjectViewVisitor).visitProjectView(PROJECT_VIEW_6); - inOrder.verifyNoMoreInteractions(); + projectViewCrawler.visit(COMPONENT_TREE); + + assertThat(projectViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE), + viewsCallRecord("visitAny", SUBVIEW_2), + viewsCallRecord("visitSubView", SUBVIEW_2), + viewsCallRecord("visitAny", SUBVIEW_3), + viewsCallRecord("visitSubView", SUBVIEW_3), + viewsCallRecord("visitAny", SUBVIEW_4), + viewsCallRecord("visitSubView", SUBVIEW_4), + viewsCallRecord("visitAny", PROJECT_VIEW_5), + viewsCallRecord("visitProjectView", PROJECT_VIEW_5), + viewsCallRecord("visitAny", PROJECT_VIEW_6), + viewsCallRecord("visitProjectView", PROJECT_VIEW_6)); } @Test public void verify_visit_call_when_visit_tree_with_depth_SUBVIEW() { - spySubViewVisitor.visit(COMPONENT_TREE); - - inOrder.verify(spySubViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spySubViewVisitor).visitView(COMPONENT_TREE); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_2); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_2); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_3); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_3); - inOrder.verify(spySubViewVisitor).visit(SUBVIEW_4); - inOrder.verify(spySubViewVisitor).visitSubView(SUBVIEW_4); - inOrder.verifyNoMoreInteractions(); + subViewCrawler.visit(COMPONENT_TREE); + + assertThat(subViewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE), + viewsCallRecord("visitAny", SUBVIEW_2), + viewsCallRecord("visitSubView", SUBVIEW_2), + viewsCallRecord("visitAny", SUBVIEW_3), + viewsCallRecord("visitSubView", SUBVIEW_3), + viewsCallRecord("visitAny", SUBVIEW_4), + viewsCallRecord("visitSubView", SUBVIEW_4)); } @Test public void verify_visit_call_when_visit_tree_with_depth_VIEW() { - spyViewVisitor.visit(COMPONENT_TREE); + viewCrawler.visit(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visit(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visitAny(COMPONENT_TREE); - inOrder.verify(spyViewVisitor).visitView(COMPONENT_TREE); - inOrder.verifyNoMoreInteractions(); + assertThat(viewVisitor.callsRecords).containsExactly( + viewsCallRecord("visitAny", COMPONENT_TREE), + viewsCallRecord("visitView", COMPONENT_TREE)); } private static Component component(final Component.Type type, final int ref, final Component... children) { return ViewsComponent.builder(type, ref).addChildren(children).build(); } + private static CallRecord viewsCallRecord(String methodName, Component component) { + return CallRecord.viewsCallRecord(methodName, component.getKey()); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsVisitorsCrawlerWithPathAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsVisitorsCrawlerWithPathAwareVisitorTest.java index da92e852afa..0d7718d0491 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsVisitorsCrawlerWithPathAwareVisitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ViewsVisitorsCrawlerWithPathAwareVisitorTest.java @@ -68,11 +68,11 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(PROJECT_VIEW, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(PROJECT_VIEW, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)), viewsCallRecord("visitAny", 11, 1, of(11, 1)), @@ -101,11 +101,11 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_SUBVIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(SUBVIEW, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(SUBVIEW, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)), viewsCallRecord("visitAny", 11, 1, of(11, 1)), @@ -126,11 +126,11 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_preOrder_visit_call_when_visit_tree_with_depth_VIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(VIEW, PRE_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(VIEW, PRE_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)) ).iterator(); @@ -139,11 +139,11 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT_VIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(PROJECT_VIEW, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(PROJECT_VIEW, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1111, 111, of(1111, 111, 11, 1)), viewsCallRecord("visitProjectView", 1111, 111, of(1111, 111, 11, 1)), viewsCallRecord("visitAny", 1112, 111, of(1112, 111, 11, 1)), @@ -172,11 +172,11 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_SUBVIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(SUBVIEW, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(SUBVIEW, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 111, 11, of(111, 11, 1)), viewsCallRecord("visitSubView", 111, 11, of(111, 11, 1)), viewsCallRecord("visitAny", 112, 11, of(112, 11, 1)), @@ -197,25 +197,25 @@ public class ViewsVisitorsCrawlerWithPathAwareVisitorTest { @Test public void verify_postOrder_visit_call_when_visit_tree_with_depth_VIEW() { - TestPathAwareVisitor visitor = new TestPathAwareVisitor(VIEW, POST_ORDER); + CallRecorderPathAwareVisitor visitor = new CallRecorderPathAwareVisitor(VIEW, POST_ORDER); VisitorsCrawler underTest = newVisitorsCrawler(visitor); underTest.visit(SOME_TREE_ROOT); - Iterator expected = of( + Iterator expected = of( viewsCallRecord("visitAny", 1, null, of(1)), viewsCallRecord("visitView", 1, null, of(1)) ).iterator(); verifyCallRecords(expected, visitor.callsRecords.iterator()); } - private static void verifyCallRecords(Iterator expected, Iterator actual) { + private static void verifyCallRecords(Iterator expected, Iterator actual) { while (expected.hasNext()) { assertThat(actual.next()).isEqualTo(expected.next()); } } - private static CallRecord viewsCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { - return CallRecord.viewsCallRecord(method, String.valueOf(currentRef), currentRef, parentRef, ROOT_REF, path); + private static PathAwareCallRecord viewsCallRecord(String method, int currentRef, @Nullable Integer parentRef, List path) { + return PathAwareCallRecord.viewsCallRecord(method, String.valueOf(currentRef), currentRef, parentRef, ROOT_REF, path); } private static VisitorsCrawler newVisitorsCrawler(ComponentVisitor componentVisitor) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/AverageFormulaExecutionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/AverageFormulaExecutionTest.java index 2132beb98a6..abf260cde66 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/AverageFormulaExecutionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/AverageFormulaExecutionTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.ReportComponent; import org.sonar.server.computation.measure.MeasureRepositoryRule; import org.sonar.server.computation.metric.MetricRepositoryRule; @@ -59,11 +60,11 @@ public class AverageFormulaExecutionTest { @Rule public PeriodsHolderRule periodsHolder = new PeriodsHolderRule(); - FormulaExecutorComponentCrawler underTest; + FormulaExecutorComponentVisitor underTest; @Before public void setUp() throws Exception { - underTest = FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) + underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) .buildFor(Lists.newArrayList( AverageFormula.Builder.newBuilder() .setOutputMetricKey(FUNCTION_COMPLEXITY_KEY) @@ -104,7 +105,7 @@ public class AverageFormulaExecutionTest { measureRepository.addRawMeasure(1211, COMPLEXITY_IN_FUNCTIONS_KEY, newMeasureBuilder().create(9)); measureRepository.addRawMeasure(1211, FUNCTIONS_KEY, newMeasureBuilder().create(2)); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly(entryOf(FUNCTION_COMPLEXITY_KEY, newMeasureBuilder().create(3d))); assertThat(toEntries(measureRepository.getAddedRawMeasures(11))).containsOnly(entryOf(FUNCTION_COMPLEXITY_KEY, newMeasureBuilder().create(2d))); @@ -131,7 +132,7 @@ public class AverageFormulaExecutionTest { treeRootHolder.setRoot(project); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty(); assertThat(measureRepository.getAddedRawMeasures(11)).isEmpty(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/DistributionFormulaExecutionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/DistributionFormulaExecutionTest.java index 8f6990451d7..8cb343ced58 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/DistributionFormulaExecutionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/DistributionFormulaExecutionTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.ReportComponent; import org.sonar.server.computation.measure.MeasureRepositoryRule; import org.sonar.server.computation.metric.MetricRepositoryRule; @@ -51,11 +52,11 @@ public class DistributionFormulaExecutionTest { @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - FormulaExecutorComponentCrawler underTest; + FormulaExecutorComponentVisitor underTest; @Before public void setUp() throws Exception { - underTest = FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) + underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) .buildFor(Lists.newArrayList(new DistributionFormula(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY))); } @@ -86,7 +87,7 @@ public class DistributionFormulaExecutionTest { measureRepository.addRawMeasure(1112, FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, newMeasureBuilder().create("0.5=0;3.5=2;6.5=1")); measureRepository.addRawMeasure(1211, FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, newMeasureBuilder().create("0.5=1;3.5=3;6.5=2")); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly(entryOf(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, newMeasureBuilder().create("0.5=4;3.5=10;6.5=12"))); assertThat(toEntries(measureRepository.getAddedRawMeasures(11))).containsOnly(entryOf(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, newMeasureBuilder().create("0.5=3;3.5=7;6.5=10"))); @@ -113,7 +114,7 @@ public class DistributionFormulaExecutionTest { treeRootHolder.setRoot(project); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty(); assertThat(measureRepository.getAddedRawMeasures(11)).isEmpty(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawlerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitorTest.java similarity index 95% rename from server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawlerTest.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitorTest.java index 1d998bba9b0..8070f6b95f0 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentCrawlerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitorTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.ReportComponent; import org.sonar.server.computation.formula.counter.IntVariationValue; import org.sonar.server.computation.measure.Measure; @@ -51,7 +52,7 @@ import static org.sonar.server.computation.measure.Measure.newMeasureBuilder; import static org.sonar.server.computation.measure.MeasureRepoEntry.entryOf; import static org.sonar.server.computation.measure.MeasureRepoEntry.toEntries; -public class FormulaExecutorComponentCrawlerTest { +public class FormulaExecutorComponentVisitorTest { public static final ReportComponent BALANCED_COMPONENT_TREE = ReportComponent.builder(PROJECT, 1) .addChildren( ReportComponent.builder(MODULE, 11) @@ -84,7 +85,7 @@ public class FormulaExecutorComponentCrawlerTest { public PeriodsHolderRule periodsHolder = new PeriodsHolderRule() .setPeriods(new Period(2, "some mode", null, 95l, 756l), new Period(5, "some other mode", null, 756L, 956L)); - FormulaExecutorComponentCrawler underTest = FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) + FormulaExecutorComponentVisitor underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) .withVariationSupport(periodsHolder) .buildFor(ImmutableList.of(new FakeFormula(), new FakeVariationFormula())); @@ -96,7 +97,7 @@ public class FormulaExecutorComponentCrawlerTest { measureRepository.addRawMeasure(1112, LINES_KEY, newMeasureBuilder().create(8)); measureRepository.addRawMeasure(1211, LINES_KEY, newMeasureBuilder().create(2)); - underTest.visit(BALANCED_COMPONENT_TREE); + new PathAwareCrawler<>(underTest).visit(BALANCED_COMPONENT_TREE); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly(entryOf(NCLOC_KEY, newMeasureBuilder().create(20))); assertThat(toEntries(measureRepository.getAddedRawMeasures(11))).containsOnly(entryOf(NCLOC_KEY, newMeasureBuilder().create(18))); @@ -117,10 +118,10 @@ public class FormulaExecutorComponentCrawlerTest { measureRepository.addRawMeasure(1112, LINES_KEY, newMeasureBuilder().create(8)); measureRepository.addRawMeasure(1211, LINES_KEY, newMeasureBuilder().create(2)); - FormulaExecutorComponentCrawler underTest = FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) + FormulaExecutorComponentVisitor underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) .withVariationSupport(periodsHolder) .buildFor(ImmutableList.of(new FakeMultiMetricFormula())); - underTest.visit(BALANCED_COMPONENT_TREE); + new PathAwareCrawler<>(underTest).visit(BALANCED_COMPONENT_TREE); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly( entryOf(NEW_LINES_TO_COVER_KEY, newMeasureBuilder().create(30)), @@ -156,7 +157,7 @@ public class FormulaExecutorComponentCrawlerTest { measureRepository.addRawMeasure(1112, NEW_LINES_TO_COVER_KEY, createMeasureWithVariation(8, 16)); measureRepository.addRawMeasure(1211, NEW_LINES_TO_COVER_KEY, createMeasureWithVariation(2, 4)); - underTest.visit(BALANCED_COMPONENT_TREE); + new PathAwareCrawler<>(underTest).visit(BALANCED_COMPONENT_TREE); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly(entryOf(NEW_IT_COVERAGE_KEY, createMeasureWithVariation(20, 40))); assertThat(toEntries(measureRepository.getAddedRawMeasures(11))).containsOnly(entryOf(NEW_IT_COVERAGE_KEY, createMeasureWithVariation(18, 36))); @@ -186,7 +187,7 @@ public class FormulaExecutorComponentCrawlerTest { ).build(); treeRootHolder.setRoot(project); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty(); assertThat(measureRepository.getAddedRawMeasures(11)).isEmpty(); @@ -205,7 +206,7 @@ public class FormulaExecutorComponentCrawlerTest { ).build(); treeRootHolder.setRoot(project); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty(); assertThat(measureRepository.getAddedRawMeasures(11)).isEmpty(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java index 1370ddd7d0a..084b9b3a7be 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.PathAwareCrawler; import org.sonar.server.computation.component.ReportComponent; import org.sonar.server.computation.measure.MeasureRepositoryRule; import org.sonar.server.computation.metric.MetricRepositoryRule; @@ -51,11 +52,11 @@ public class SumFormulaExecutionTest { @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - FormulaExecutorComponentCrawler underTest; + FormulaExecutorComponentVisitor underTest; @Before public void setUp() throws Exception { - underTest = FormulaExecutorComponentCrawler.newBuilder(metricRepository, measureRepository) + underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository) .buildFor(Lists.newArrayList(new SumFormula(LINES_KEY))); } @@ -86,7 +87,7 @@ public class SumFormulaExecutionTest { measureRepository.addRawMeasure(1112, LINES_KEY, newMeasureBuilder().create(8)); measureRepository.addRawMeasure(1211, LINES_KEY, newMeasureBuilder().create(2)); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(toEntries(measureRepository.getAddedRawMeasures(1))).containsOnly(entryOf(LINES_KEY, newMeasureBuilder().create(20))); assertThat(toEntries(measureRepository.getAddedRawMeasures(11))).containsOnly(entryOf(LINES_KEY, newMeasureBuilder().create(18))); @@ -113,7 +114,7 @@ public class SumFormulaExecutionTest { treeRootHolder.setRoot(project); - underTest.visit(project); + new PathAwareCrawler<>(underTest).visit(project); assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty(); assertThat(measureRepository.getAddedRawMeasures(11)).isEmpty(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java index 5b1cc83a36f..bddde48365c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java @@ -36,6 +36,7 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ComponentVisitor; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; import org.sonar.server.computation.component.TreeRootHolder; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.debt.Characteristic; import org.sonar.server.computation.metric.Metric; import org.sonar.server.computation.metric.MetricRepositoryRule; @@ -100,7 +101,8 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe checkAndInitProvidersState(); InternalKey internalKey = new InternalKey(component, metric); - checkState(!baseMeasures.containsKey(internalKey), format("Can not add a BaseMeasure twice for a Component (ref=%s) and Metric (key=%s)", component.getReportAttributes().getRef(), metric.getKey())); + checkState(!baseMeasures.containsKey(internalKey), + format("Can not add a BaseMeasure twice for a Component (ref=%s) and Metric (key=%s)", component.getReportAttributes().getRef(), metric.getKey())); baseMeasures.put(internalKey, measure); @@ -386,13 +388,15 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe private final Map componentsByRef = new HashMap<>(); public TreeComponentProvider(Component root) { - new DepthTraversalTypeAwareCrawler(Component.Type.FILE, ComponentVisitor.Order.PRE_ORDER) { - @Override - public void visitAny(Component component) { - checkState(!componentsByRef.containsKey(component.getReportAttributes().getRef()), "Tree contains more than one component with ref " + component.getReportAttributes().getRef()); - componentsByRef.put(component.getReportAttributes().getRef(), component); - } - }.visit(root); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(Component.Type.FILE, ComponentVisitor.Order.PRE_ORDER) { + @Override + public void visitAny(Component component) { + checkState(!componentsByRef.containsKey(component.getReportAttributes().getRef()), + "Tree contains more than one component with ref " + component.getReportAttributes().getRef()); + componentsByRef.put(component.getReportAttributes().getRef(), component); + } + }).visit(root); } @Override -- 2.39.5