From 53293c67e569bb35667bc3c997e821f8fd6f70b2 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Wed, 31 Jul 2019 13:54:30 -0500 Subject: Simplify MeasureRepository interface --- .../projectanalysis/duplication/Duplication.java | 10 +++--- .../measure/MapBasedRawMeasureRepository.java | 24 ++------------ .../ce/task/projectanalysis/measure/Measure.java | 9 ++++-- .../projectanalysis/measure/MeasureRepository.java | 14 +++----- .../measure/MeasureRepositoryImpl.java | 16 +++------- .../step/PersistLiveMeasuresStep.java | 13 +++----- .../projectanalysis/step/PersistMeasuresStep.java | 24 +++++++------- .../duplication/DuplicationMeasuresTest.java | 12 +++---- .../duplication/ViewsDuplicationMeasuresTest.java | 10 +++--- .../projectanalysis/issue/IssueCounterTest.java | 20 ++++++++---- .../measure/MapBasedRawMeasureRepositoryTest.java | 16 ---------- .../measure/MeasureRepositoryImplTest.java | 25 +++------------ .../MaintainabilityMeasuresVisitorTest.java | 2 +- ...bilityAndSecurityRatingMeasuresVisitorTest.java | 3 +- .../step/NewSizeMeasuresStepTest.java | 12 +++---- .../step/ReportCommentMeasuresStepTest.java | 8 ++--- .../projectanalysis/measure/MeasureRepoEntry.java | 11 +++---- .../measure/MeasureRepositoryRule.java | 37 +++++++--------------- 18 files changed, 94 insertions(+), 172 deletions(-) diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/Duplication.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/Duplication.java index bcff1d73fc6..c3a1d37893e 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/Duplication.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/duplication/Duplication.java @@ -19,11 +19,9 @@ */ package org.sonar.ce.task.projectanalysis.duplication; +import java.util.Arrays; import java.util.Comparator; import java.util.List; -import java.util.Objects; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.function.Function; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -92,19 +90,19 @@ public final class Duplication { return false; } Duplication that = (Duplication) o; - return original.equals(that.original) && duplicates.equals(that.duplicates); + return original.equals(that.original) && Arrays.equals(duplicates, that.duplicates); } @Override public int hashCode() { - return Objects.hash(original, duplicates); + return Arrays.deepHashCode(new Object[] {original, duplicates}); } @Override public String toString() { return "Duplication{" + "original=" + original + - ", duplicates=" + duplicates + + ", duplicates=" + Arrays.toString(duplicates) + '}'; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepository.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepository.java index b86e55b5b68..817040abce7 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepository.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepository.java @@ -19,13 +19,10 @@ */ package org.sonar.ce.task.projectanalysis.measure; -import com.google.common.collect.ImmutableSetMultimap; -import com.google.common.collect.SetMultimap; import gnu.trove.map.hash.THashMap; import java.util.Collections; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.function.Function; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.metric.Metric; @@ -103,26 +100,9 @@ public final class MapBasedRawMeasureRepository implements MeasureRepository } @Override - public Set getRawMeasures(Component component, Metric metric) { - requireNonNull(metric); - requireNonNull(component); - Optional measure = find(component, metric); - return measure.isPresent() ? Collections.singleton(measure.get()) : Collections.emptySet(); - } - - @Override - public SetMultimap getRawMeasures(Component component) { + public Map getRawMeasures(Component component) { T componentKey = componentToKey.apply(component); - Map rawMeasures = measures.get(componentKey); - if (rawMeasures == null) { - return ImmutableSetMultimap.of(); - } - - ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder(); - for (Map.Entry entry : rawMeasures.entrySet()) { - builder.put(entry.getKey(), entry.getValue()); - } - return builder.build(); + return measures.getOrDefault(componentKey, Collections.emptyMap()); } private Optional find(Component component, Metric metric) { diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/Measure.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/Measure.java index 8d73b7e9669..1bcc58d7529 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/Measure.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/Measure.java @@ -571,9 +571,12 @@ public interface Measure { } Level level = source.getValueType() == ValueType.LEVEL ? source.getLevelValue() : null; QualityGateStatus status = source.hasQualityGateStatus() ? source.getQualityGateStatus() : qualityGateStatus; - boolean hasVar = source.hasVariation(); - - Double var = hasVar ? source.getVariation() : variation; + Double var; + if (source.hasVariation()) { + var = source.getVariation(); + } else { + var = variation; + } return new MeasureImpl(source.getValueType(), value, source.getData(), level, status, var); } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepository.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepository.java index 57d3d529bf3..72db440481d 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepository.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepository.java @@ -19,9 +19,8 @@ */ package org.sonar.ce.task.projectanalysis.measure; -import com.google.common.collect.SetMultimap; +import java.util.Map; import java.util.Optional; -import java.util.Set; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.metric.Metric; import org.sonar.ce.task.projectanalysis.metric.MetricImpl; @@ -45,21 +44,16 @@ public interface MeasureRepository { */ Optional getRawMeasure(Component component, Metric metric); - /** - * Returns the {@link Measure}s for the specified {@link Component} and the specified {@link Metric}. - */ - Set getRawMeasures(Component component, Metric metric); - /** * Returns the {@link Measure}s for the specified {@link Component} mapped by their metric key. */ - SetMultimap getRawMeasures(Component component); + Map getRawMeasures(Component component); /** * Adds the specified measure for the specified Component and Metric. There can be no more than one measure for a * specific combination of Component, Metric. * - * @throws NullPointerException if any of the arguments is null + * @throws NullPointerException if any of the arguments is null * @throws UnsupportedOperationException when trying to add a measure when one already exists for the specified Component/Metric paar */ void add(Component component, Metric metric, Measure measure); @@ -68,7 +62,7 @@ public interface MeasureRepository { * Updates the specified measure for the specified Component and Metric. There can be no more than one measure for a * specific combination of Component, Metric. * - * @throws NullPointerException if any of the arguments is null + * @throws NullPointerException if any of the arguments is null * @throws UnsupportedOperationException when trying to update a non existing measure */ void update(Component component, Metric metric, Measure measure); diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImpl.java index 6fd9e0394ba..eec67d313f9 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImpl.java @@ -19,8 +19,8 @@ */ package org.sonar.ce.task.projectanalysis.measure; -import com.google.common.collect.SetMultimap; import java.util.HashSet; +import java.util.Map; import java.util.Optional; import java.util.Set; import org.sonar.ce.task.projectanalysis.batch.BatchReportReader; @@ -47,7 +47,7 @@ public class MeasureRepositoryImpl implements MeasureRepository { private final ReportMetricValidator reportMetricValidator; private MeasureDtoToMeasure measureTransformer = new MeasureDtoToMeasure(); - private final Set loadedComponents = new HashSet<>(); + private final Set loadedComponents = new HashSet<>(); public MeasureRepositoryImpl(DbClient dbClient, BatchReportReader reportReader, MetricRepository metricRepository, ReportMetricValidator reportMetricValidator) { @@ -96,19 +96,14 @@ public class MeasureRepositoryImpl implements MeasureRepository { } @Override - public Set getRawMeasures(Component component, Metric metric) { - loadBatchMeasuresForComponent(component); - return delegate.getRawMeasures(component, metric); - } - - @Override - public SetMultimap getRawMeasures(Component component) { + public Map getRawMeasures(Component component) { loadBatchMeasuresForComponent(component); return delegate.getRawMeasures(component); } private void loadBatchMeasuresForComponent(Component component) { - if (component.getReportAttributes().getRef() == null || loadedComponents.contains(component.getUuid())) { + Integer ref = component.getReportAttributes().getRef(); + if (ref == null || !loadedComponents.add(ref)) { return; } @@ -122,7 +117,6 @@ public class MeasureRepositoryImpl implements MeasureRepository { } } } - loadedComponents.add(component.getUuid()); } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistLiveMeasuresStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistLiveMeasuresStep.java index a20eaeba147..5e1951a5df3 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistLiveMeasuresStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistLiveMeasuresStep.java @@ -19,14 +19,13 @@ */ package org.sonar.ce.task.projectanalysis.step; -import com.google.common.collect.Multimap; import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Stream; import javax.annotation.Nonnull; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit; @@ -42,7 +41,6 @@ import org.sonar.ce.task.projectanalysis.metric.MetricRepository; import org.sonar.ce.task.step.ComputationStep; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.measure.LiveMeasureComparator; import org.sonar.db.measure.LiveMeasureDto; import static java.util.Arrays.asList; @@ -107,21 +105,20 @@ public class PersistLiveMeasuresStep implements ComputationStep { @Override public void visitAny(Component component) { List metricIds = new ArrayList<>(); - Multimap measures = measureRepository.getRawMeasures(component); + Map measures = measureRepository.getRawMeasures(component); List dtos = new ArrayList<>(); - for (Map.Entry> measuresByMetricKey : measures.asMap().entrySet()) { + for (Map.Entry measuresByMetricKey : measures.entrySet()) { String metricKey = measuresByMetricKey.getKey(); if (NOT_TO_PERSIST_ON_FILE_METRIC_KEYS.contains(metricKey) && component.getType() == Component.Type.FILE) { continue; } Metric metric = metricRepository.getByKey(metricKey); Predicate notBestValueOptimized = BestValueOptimization.from(metric, component).negate(); - measuresByMetricKey.getValue().stream() + Measure m = measuresByMetricKey.getValue(); + Stream.of(m) .filter(NonEmptyMeasure.INSTANCE) .filter(notBestValueOptimized) .map(measure -> measureToMeasureDto.toLiveMeasureDto(measure, metric, component)) - // To prevent deadlock, live measures are ordered the same way as in LiveMeasureComputerImpl#refreshComponentsOnSameProject - .sorted(LiveMeasureComparator.INSTANCE) .forEach(lm -> { dtos.add(lm); metricIds.add(metric.getId()); diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistMeasuresStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistMeasuresStep.java index 1fd6f718120..28ed0071205 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistMeasuresStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistMeasuresStep.java @@ -19,8 +19,6 @@ */ package org.sonar.ce.task.projectanalysis.step; -import com.google.common.collect.Multimap; -import java.util.Collection; import java.util.Map; import java.util.function.Predicate; import javax.annotation.Nonnull; @@ -109,21 +107,25 @@ public class PersistMeasuresStep implements ComputationStep { } private void persistMeasures(Component component) { - Multimap measures = measureRepository.getRawMeasures(component); - for (Map.Entry> measuresByMetricKey : measures.asMap().entrySet()) { - String metricKey = measuresByMetricKey.getKey(); + Map measures = measureRepository.getRawMeasures(component); + MeasureDao measureDao = dbClient.measureDao(); + + for (Map.Entry e : measures.entrySet()) { + Measure measure = e.getValue(); + if (!NonEmptyMeasure.INSTANCE.test(measure)) { + continue; + } + String metricKey = e.getKey(); Metric metric = metricRepository.getByKey(metricKey); - MeasureDao measureDao = dbClient.measureDao(); - measuresByMetricKey.getValue().stream().filter(NonEmptyMeasure.INSTANCE).forEach(measure -> { - MeasureDto measureDto = measureToMeasureDto.toMeasureDto(measure, metric, component); - measureDao.insert(session, measureDto); - inserts++; - }); + MeasureDto measureDto = measureToMeasureDto.toMeasureDto(measure, metric, component); + measureDao.insert(session, measureDto); + inserts++; } } } + private enum NonEmptyMeasure implements Predicate { INSTANCE; diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasuresTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasuresTest.java index 86c8fdfa239..6c11486f4e6 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasuresTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/DuplicationMeasuresTest.java @@ -340,15 +340,11 @@ public class DuplicationMeasuresTest { duplicationRepository.addDuplication(fileRef, original, duplicates); } - private void addRawMeasure(int componentRef, String metricKey, int value) { - measureRepository.addRawMeasure(componentRef, metricKey, newMeasureBuilder().create(value)); - } - private void assertNoRawMeasures(String metricKey) { - assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isEmpty(); + assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isNull(); } private void assertNoRawMeasure(int componentRef, String metricKey) { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/ViewsDuplicationMeasuresTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/ViewsDuplicationMeasuresTest.java index 6420f9445b4..8ee2a332b23 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/ViewsDuplicationMeasuresTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/duplication/ViewsDuplicationMeasuresTest.java @@ -292,11 +292,11 @@ public class ViewsDuplicationMeasuresTest { } private void assertNoRawMeasures(String metricKey) { - assertThat(measureRepository.getAddedRawMeasures(PROJECT_VIEW_1_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(PROJECT_VIEW_2_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(SUB_SUBVIEW_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(SUBVIEW_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isEmpty(); + assertThat(measureRepository.getAddedRawMeasures(PROJECT_VIEW_1_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(PROJECT_VIEW_2_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(SUB_SUBVIEW_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(SUBVIEW_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isNull(); } private void assertNoNewRawMeasuresOnProjectViews() { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java index 9debfdcb271..7a5477afc2d 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java @@ -21,7 +21,10 @@ package org.sonar.ce.task.projectanalysis.issue; import java.util.Arrays; import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; import org.assertj.core.data.MapEntry; import org.junit.Rule; @@ -32,6 +35,8 @@ import org.sonar.ce.task.projectanalysis.analysis.Branch; import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderRule; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; +import org.sonar.ce.task.projectanalysis.measure.Measure; +import org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry; import org.sonar.ce.task.projectanalysis.measure.MeasureRepositoryRule; import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule; import org.sonar.ce.task.projectanalysis.period.Period; @@ -103,8 +108,6 @@ import static org.sonar.api.rule.Severity.MAJOR; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder; import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.entryOf; -import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.toEntries; -import static org.sonar.core.util.stream.MoreCollectors.toList; public class IssueCounterTest { @@ -395,18 +398,21 @@ public class IssueCounterTest { @SafeVarargs private final void assertVariations(Component componentRef, MapEntry... entries) { - assertThat(measureRepository.getRawMeasures(componentRef).entries() + assertThat(measureRepository.getRawMeasures(componentRef).entrySet() .stream() .filter(e -> e.getValue().hasVariation()) .map(e -> entry(e.getKey(), (int) e.getValue().getVariation()))) - .contains(entries); + .contains(entries); } @SafeVarargs private final void assertMeasures(Component componentRef, Map.Entry... entries) { - assertThat(toEntries(measureRepository.getRawMeasures(componentRef))) - .containsAll(stream(entries).map(e -> entryOf(e.getKey(), newMeasureBuilder().create(e.getValue()))) - .collect(toList())); + List expected = stream(entries) + .map(e -> entryOf(e.getKey(), newMeasureBuilder().create(e.getValue()))) + .collect(Collectors.toList()); + + assertThat(measureRepository.getRawMeasures(componentRef).entrySet().stream().map(e -> entryOf(e.getKey(), e.getValue()))) + .containsAll(expected); } private static DefaultIssue createIssue(@Nullable String resolution, String status, String severity) { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepositoryTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepositoryTest.java index 3a069e64823..9eb857a7deb 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepositoryTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MapBasedRawMeasureRepositoryTest.java @@ -246,20 +246,4 @@ public class MapBasedRawMeasureRepositoryTest { assertThat(underTest.getRawMeasure(OTHER_COMPONENT, metric1)).isNotPresent(); assertThat(underTest.getRawMeasure(FILE_COMPONENT, metric2)).isNotPresent(); } - - @Test(expected = NullPointerException.class) - public void getRawMeasures_for_metric_throws_NPE_if_Component_arg_is_null() { - underTest.getRawMeasures(null, metric1); - } - - @Test(expected = NullPointerException.class) - public void getRawMeasures_for_metric_throws_NPE_if_Metric_arg_is_null() { - underTest.getRawMeasures(FILE_COMPONENT, null); - } - - @Test - public void getRawMeasures_for_metric_returns_empty_if_repository_is_empty() { - assertThat(underTest.getRawMeasures(FILE_COMPONENT, metric1)).isEmpty(); - } - } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImplTest.java index 099ef41b6c3..68253569a7d 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImplTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryImplTest.java @@ -22,11 +22,11 @@ package org.sonar.ce.task.projectanalysis.measure; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; -import com.google.common.collect.SetMultimap; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.List; +import java.util.Map; import java.util.Optional; import javax.annotation.Nullable; import org.junit.Before; @@ -393,23 +393,6 @@ public class MeasureRepositoryImplTest { underTest.update(FILE_COMPONENT, metric1, Measure.updatedMeasureBuilder(measure.get()).create()); } - @Test - public void getRawMeasures_for_metric_throws_NPE_if_Component_arg_is_null() { - expectedException.expect(NullPointerException.class); - underTest.getRawMeasures(null, metric1); - } - - @Test - public void getRawMeasures_for_metric_throws_NPE_if_Metric_arg_is_null() { - expectedException.expect(NullPointerException.class); - underTest.getRawMeasures(FILE_COMPONENT, null); - } - - @Test - public void getRawMeasures_for_metric_returns_empty_if_repository_is_empty() { - assertThat(underTest.getRawMeasures(FILE_COMPONENT, metric1)).isEmpty(); - } - @Test public void getRawMeasures_returns_added_measures_over_batch_measures() { when(reportMetricValidator.validate(METRIC_KEY_1)).thenReturn(true); @@ -421,11 +404,11 @@ public class MeasureRepositoryImplTest { Measure addedMeasure = SOME_MEASURE; underTest.add(FILE_COMPONENT, metric1, addedMeasure); - SetMultimap rawMeasures = underTest.getRawMeasures(FILE_COMPONENT); + Map rawMeasures = underTest.getRawMeasures(FILE_COMPONENT); assertThat(rawMeasures.keySet()).hasSize(2); - assertThat(rawMeasures.get(METRIC_KEY_1)).containsOnly(addedMeasure); - assertThat(rawMeasures.get(METRIC_KEY_2)).extracting(Measure::getStringValue).containsOnly("some value"); + assertThat(rawMeasures.get(METRIC_KEY_1)).isEqualTo(addedMeasure); + assertThat(rawMeasures.get(METRIC_KEY_2)).extracting(Measure::getStringValue).isEqualTo("some value"); } private static MeasureDto createMeasureDto(int metricId, String componentUuid, String analysisUuid) { diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/MaintainabilityMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/MaintainabilityMeasuresVisitorTest.java index 6af0fe5cb74..2c8ade4ce3e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/MaintainabilityMeasuresVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/MaintainabilityMeasuresVisitorTest.java @@ -124,7 +124,7 @@ public class MaintainabilityMeasuresVisitorTest { underTest.visit(root); - assertThat(toEntries(measureRepository.getRawMeasures(root))) + assertThat(measureRepository.getRawMeasures(root).entrySet().stream().map(e -> entryOf(e.getKey(), e.getValue()))) .containsOnly( entryOf(DEVELOPMENT_COST_KEY, newMeasureBuilder().create("0")), entryOf(SQALE_DEBT_RATIO_KEY, newMeasureBuilder().create(0d, 1)), diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java index 5bace1873f6..55e3bcb8a94 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java @@ -111,7 +111,8 @@ public class ReliabilityAndSecurityRatingMeasuresVisitorTest { underTest.visit(root); - assertThat(toEntries(measureRepository.getRawMeasures(root))) + assertThat(measureRepository.getRawMeasures(root) + .entrySet().stream().map(e -> entryOf(e.getKey(), e.getValue()))) .containsOnly( entryOf(RELIABILITY_RATING_KEY, createRatingMeasure(A)), entryOf(SECURITY_RATING_KEY, createRatingMeasure(A))); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/NewSizeMeasuresStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/NewSizeMeasuresStepTest.java index ca324627a33..779eed755c0 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/NewSizeMeasuresStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/NewSizeMeasuresStepTest.java @@ -381,11 +381,11 @@ public class NewSizeMeasuresStepTest { } private void assertNoRawMeasures(String metricKey) { - assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(FILE_3_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(FILE_4_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metricKey)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isEmpty(); + assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(FILE_3_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(FILE_4_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metricKey)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metricKey)).isNull(); } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportCommentMeasuresStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportCommentMeasuresStepTest.java index 0c4d9a305c1..96097ed096e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportCommentMeasuresStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportCommentMeasuresStepTest.java @@ -274,9 +274,9 @@ public class ReportCommentMeasuresStepTest { } private void assertNoNewMeasures(String metric) { - assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metric)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metric)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metric)).isEmpty(); - assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metric)).isEmpty(); + assertThat(measureRepository.getAddedRawMeasures(FILE_1_REF).get(metric)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(FILE_2_REF).get(metric)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(DIRECTORY_REF).get(metric)).isNull(); + assertThat(measureRepository.getAddedRawMeasures(ROOT_REF).get(metric)).isNull(); } } diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepoEntry.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepoEntry.java index 2cf7fc130c6..2ef63f3aa15 100644 --- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepoEntry.java +++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepoEntry.java @@ -19,13 +19,12 @@ */ package org.sonar.ce.task.projectanalysis.measure; -import com.google.common.base.Function; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.SetMultimap; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.sonar.ce.task.projectanalysis.component.Component; @@ -40,7 +39,7 @@ import org.sonar.ce.task.projectanalysis.component.Component; * {@link Measure#equals(Object)} only care about the ruleId and characteristicId. *

*

- * In order to explore the content of the SetMultimap, use {@link #toEntries(SetMultimap)} to convert it + * In order to explore the content of the Map, use {@link #toEntries(Map)} to convert it * to an Iterable of {@link MeasureRepoEntry} and then take benefit of AssertJ API, eg.: *

  * assertThat(MeasureRepoEntry.toEntries(measureRepository.getAddedRawMeasures(componentRef))).containsOnly(
@@ -63,8 +62,8 @@ public final class MeasureRepoEntry {
     return EntryToMeasureRepoEntry.INSTANCE;
   }
 
-  public static Iterable toEntries(SetMultimap data) {
-    return FluentIterable.from(data.entries()).transform(toMeasureRepoEntry()).toList();
+  public static Iterable toEntries(Map data) {
+    return data.entrySet().stream().map(toMeasureRepoEntry()).collect(Collectors.toList());
   }
 
   public static MeasureRepoEntry entryOf(String metricKey, Measure measure) {
diff --git a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java
index 2c579151024..ba766121376 100644
--- a/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java
+++ b/server/sonar-ce-task-projectanalysis/src/testFixtures/java/org/sonar/ce/task/projectanalysis/measure/MeasureRepositoryRule.java
@@ -21,13 +21,11 @@ package org.sonar.ce.task.projectanalysis.measure;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.SetMultimap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -41,7 +39,6 @@ import org.sonar.ce.task.projectanalysis.component.TreeRootHolderComponentProvid
 import org.sonar.ce.task.projectanalysis.metric.Metric;
 import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.FluentIterable.from;
 import static com.google.common.collect.Maps.filterKeys;
@@ -98,7 +95,7 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
     return this;
   }
 
-  public SetMultimap getRawMeasures(int componentRef) {
+  public Map getRawMeasures(int componentRef) {
     return getRawMeasures(componentProvider.getByRef(componentRef));
   }
 
@@ -106,7 +103,7 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
    * Return measures that were added by the step (using {@link #add(Component, Metric, Measure)}).
    * It does not contain the one added in the test by {@link #addRawMeasure(int, String, Measure)}
    */
-  public SetMultimap getAddedRawMeasures(int componentRef) {
+  public Map getAddedRawMeasures(int componentRef) {
     checkAndInitProvidersState();
 
     return getAddedRawMeasures(componentProvider.getByRef(componentRef));
@@ -127,26 +124,22 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
   public Optional getAddedRawMeasure(int componentRef, String metricKey) {
     checkAndInitProvidersState();
 
-    Set measures = getAddedRawMeasures(componentProvider.getByRef(componentRef)).get(metricKey);
-    if (measures.isEmpty()) {
-      return Optional.empty();
-    }
-    checkArgument(measures.size() == 1, String.format("There is more than one measure on metric '%s' for component '%s'", metricKey, componentRef));
-    return Optional.of(measures.iterator().next());
+    Measure measure = getAddedRawMeasures(componentProvider.getByRef(componentRef)).get(metricKey);
+    return Optional.ofNullable(measure);
   }
 
   /**
    * Return measures that were added by the step (using {@link #add(Component, Metric, Measure)}).
    * It does not contain the one added in the test by {@link #addRawMeasure(int, String, Measure)}
    */
-  public SetMultimap getAddedRawMeasures(Component component) {
+  public Map getAddedRawMeasures(Component component) {
     checkAndInitProvidersState();
 
-    ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder();
+    Map builder = new HashMap<>();
     for (Map.Entry entry : from(filterKeys(rawMeasures, hasComponentRef(component)).entrySet()).filter(isAddedMeasure)) {
       builder.put(entry.getKey().getMetricKey(), entry.getValue());
     }
-    return builder.build();
+    return builder;
   }
 
   public MeasureRepositoryRule addRawMeasure(int componentRef, String metricKey, Measure measure) {
@@ -174,17 +167,9 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
   }
 
   @Override
-  public Set getRawMeasures(Component component, Metric metric) {
-    return from(filterKeys(rawMeasures, hasComponentRef(component)).entrySet()).filter(new MatchMetric(metric)).transform(ToMeasure.INSTANCE).toSet();
-  }
-
-  @Override
-  public SetMultimap getRawMeasures(Component component) {
-    ImmutableSetMultimap.Builder builder = ImmutableSetMultimap.builder();
-    for (Map.Entry entry : filterKeys(rawMeasures, hasComponentRef(component)).entrySet()) {
-      builder.put(entry.getKey().getMetricKey(), entry.getValue());
-    }
-    return builder.build();
+  public Map getRawMeasures(Component component) {
+    return filterKeys(rawMeasures, hasComponentRef(component)).entrySet().stream()
+      .collect(Collectors.toMap(k -> k.getKey().getMetricKey(), e -> e.getValue()));
   }
 
   private HasComponentRefPredicate hasComponentRef(Component component) {
-- 
cgit v1.2.3