diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2017-10-02 10:28:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-02 10:28:58 +0200 |
commit | 8115d8b7e41c38120650bac7432291c722b9a7c3 (patch) | |
tree | fa1799aab7cd353475b32d622b4a0408de84cac0 /server | |
parent | 583e42c16797bf57162ebd502e12241d8765a8fc (diff) | |
download | sonarqube-8115d8b7e41c38120650bac7432291c722b9a7c3.tar.gz sonarqube-8115d8b7e41c38120650bac7432291c722b9a7c3.zip |
SONAR-6959 Performance improvements
* Avoid creation of intermediary array
* SONAR-6959 Speed-up copy of custom measures in Compute Engine
* Use light object to get key/uuid map of components
* Avoid always formatting string
* Minor refactoring
* Avoid cost of hash
* Ajust perf tests
Diffstat (limited to 'server')
17 files changed, 154 insertions, 67 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java index 6e7db16ec98..b8ee31f72e7 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java @@ -43,6 +43,7 @@ import org.sonar.db.component.ComponentLinkDto; import org.sonar.db.component.ComponentLinkMapper; import org.sonar.db.component.ComponentMapper; import org.sonar.db.component.FilePathWithHashDto; +import org.sonar.db.component.KeyWithUuidDto; import org.sonar.db.component.ResourceDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotMapper; @@ -150,6 +151,7 @@ public class MyBatis implements Startable { confBuilder.loadAlias("DuplicationUnit", DuplicationUnitDto.class); confBuilder.loadAlias("Event", EventDto.class); confBuilder.loadAlias("FilePathWithHash", FilePathWithHashDto.class); + confBuilder.loadAlias("KeyWithUuid", KeyWithUuidDto.class); confBuilder.loadAlias("Group", GroupDto.class); confBuilder.loadAlias("GroupMembership", GroupMembershipDto.class); confBuilder.loadAlias("GroupPermission", GroupPermissionDto.class); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java index e3b3b556c6b..9e11072f09e 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java @@ -164,6 +164,10 @@ public class ComponentDao implements Dao { return mapper(session).selectComponentsFromProjectKeyAndScope(projectKey, null, false); } + public List<KeyWithUuidDto> selectUuidsByKeyFromProjectKey(DbSession session, String projectKey) { + return mapper(session).selectUuidsByKeyFromProjectKey(projectKey); + } + public List<ComponentDto> selectEnabledModulesFromProjectKey(DbSession session, String projectKey) { return mapper(session).selectComponentsFromProjectKeyAndScope(projectKey, Scopes.PROJECT, true); } @@ -174,7 +178,7 @@ public class ComponentDao implements Dao { public List<ComponentDto> selectByKeysAndBranch(DbSession session, Collection<String> keys, String branch) { List<String> dbKeys = keys.stream().map(k -> generateBranchKey(k, branch)).collect(toList()); - List<String> allKeys = Stream.of(keys, dbKeys) .flatMap(Collection::stream) .collect(toList()); + List<String> allKeys = Stream.of(keys, dbKeys).flatMap(Collection::stream).collect(toList()); return executeLargeInputs(allKeys, subKeys -> mapper(session).selectByKeysAndBranch(subKeys, branch)); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java index ca7da22e645..c99bab08f13 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java @@ -117,6 +117,11 @@ public interface ComponentMapper { @Param(value = "excludeDisabled") boolean excludeDisabled); /** + * Return keys and UUIDs of all components belonging to a project + */ + List<KeyWithUuidDto> selectUuidsByKeyFromProjectKey(@Param("projectKey") String projectKey); + + /** * Return technical projects from a view or a sub-view */ List<String> selectProjectsFromView(@Param("viewUuidLikeQuery") String viewUuidLikeQuery, @Param("projectViewUuid") String projectViewUuid); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/KeyWithUuidDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/KeyWithUuidDto.java new file mode 100644 index 00000000000..e1413063389 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/KeyWithUuidDto.java @@ -0,0 +1,42 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.component; + +import javax.annotation.concurrent.Immutable; + +@Immutable +public class KeyWithUuidDto { + + private final String kee; + private final String uuid; + + public KeyWithUuidDto(String kee, String uuid) { + this.kee = kee; + this.uuid = uuid; + } + + public String key() { + return kee; + } + + public String uuid() { + return uuid; + } +} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml index feaa6661866..2aaadf4d956 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -414,6 +414,15 @@ </if> </where> </select> + + <select id="selectUuidsByKeyFromProjectKey" parameterType="string" resultType="KeyWithUuid"> + SELECT + p.kee, p.uuid + FROM + projects p + INNER JOIN + projects root ON root.uuid=p.project_uuid AND root.kee=#{projectKey,jdbcType=VARCHAR} + </select> <select id="selectGhostProjects" parameterType="map" resultType="Component"> select distinct diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java index f37b5e0c2fc..140a3a0bfd3 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Supplier; +import java.util.stream.Collectors; import javax.annotation.Nullable; import org.assertj.core.api.ListAssert; import org.junit.Rule; @@ -47,6 +48,7 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; import static org.assertj.core.api.Assertions.tuple; import static org.assertj.guava.api.Assertions.assertThat; import static org.sonar.db.component.ComponentTesting.newDirectory; @@ -581,6 +583,34 @@ public class ComponentDaoTest { } @Test + public void select_uuids_by_key_from_project() { + ComponentDto project = db.components().insertPrivateProject(); + ComponentDto removedProject = db.components().insertPrivateProject(p -> p.setEnabled(false)); + ComponentDto module = db.components().insertComponent(newModuleDto(project)); + ComponentDto removedModule = db.components().insertComponent(newModuleDto(project).setEnabled(false)); + ComponentDto subModule = db.components().insertComponent(newModuleDto(module)); + ComponentDto removedSubModule = db.components().insertComponent(newModuleDto(module).setEnabled(false)); + ComponentDto directory = db.components().insertComponent(newDirectory(subModule, "src")); + ComponentDto removedDirectory = db.components().insertComponent(newDirectory(subModule, "src2").setEnabled(false)); + ComponentDto file = db.components().insertComponent(newFileDto(subModule, directory)); + ComponentDto removedFile = db.components().insertComponent(newFileDto(subModule, directory).setEnabled(false)); + + Map<String, String> uuidsByKey = underTest.selectUuidsByKeyFromProjectKey(dbSession, project.getDbKey()) + .stream().collect(Collectors.toMap(KeyWithUuidDto::key, KeyWithUuidDto::uuid)); + + assertThat(uuidsByKey).containsOnly( + entry(project.getDbKey(), project.uuid()), + entry(module.getDbKey(), module.uuid()), + entry(removedModule.getDbKey(), removedModule.uuid()), + entry(subModule.getDbKey(), subModule.uuid()), + entry(removedSubModule.getDbKey(), removedSubModule.uuid()), + entry(directory.getDbKey(), directory.uuid()), + entry(removedDirectory.getDbKey(), removedDirectory.uuid()), + entry(file.getDbKey(), file.uuid()), + entry(removedFile.getDbKey(), removedFile.uuid())); + } + + @Test public void select_enabled_modules_from_project() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto removedProject = db.components().insertPrivateProject(p -> p.setEnabled(false)); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java index 100c92cdae9..6b46eba027d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java @@ -28,7 +28,6 @@ import javax.annotation.concurrent.Immutable; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; -import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; import static org.apache.commons.lang.StringUtils.trimToNull; @@ -66,7 +65,7 @@ public class ComponentImpl implements Component { public Type getType() { return type; } - + @Override public Status getStatus() { return status; @@ -140,7 +139,7 @@ public class ComponentImpl implements Component { private static final String REPORT_ATTRIBUTES_CANNOT_BE_NULL = "reportAttributes can't be null"; private static final String NAME_CANNOT_BE_NULL = "name can't be null"; private static final String STATUS_CANNOT_BE_NULL = "status can't be null"; - + private final Type type; private Status status; private ReportAttributes reportAttributes; @@ -170,7 +169,7 @@ public class ComponentImpl implements Component { public String getUuid() { return uuid; } - + public Builder setStatus(Status status) { this.status = requireNonNull(status, STATUS_CANNOT_BE_NULL); return this; @@ -201,11 +200,11 @@ public class ComponentImpl implements Component { return this; } - public Builder addChildren(Component... c) { - for (Component component : c) { + public Builder addChildren(List<Component> components) { + for (Component component : components) { checkArgument(component.getType().isReportType()); } - this.children.addAll(asList(c)); + this.children.addAll(components); return this; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentTreeBuilder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentTreeBuilder.java index 275bc96e7b7..0581d636b86 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentTreeBuilder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentTreeBuilder.java @@ -19,7 +19,9 @@ */ package org.sonar.server.computation.task.projectanalysis.component; +import java.util.List; import java.util.function.Function; +import java.util.stream.Collectors; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.db.component.SnapshotDto; @@ -80,12 +82,12 @@ public class ComponentTreeBuilder { return buildComponent(project, project); } - private Component[] buildChildren(ScannerReport.Component component, ScannerReport.Component parentModule) { + private List<Component> buildChildren(ScannerReport.Component component, ScannerReport.Component parentModule) { return component.getChildRefList() .stream() .map(scannerComponentSupplier::apply) .map(c -> buildComponent(c, parentModule)) - .toArray(Component[]::new); + .collect(Collectors.toList()); } private ComponentImpl buildComponent(ScannerReport.Component component, ScannerReport.Component closestModule) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentUuidFactory.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentUuidFactory.java index 6cf3c218706..4319130a253 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentUuidFactory.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentUuidFactory.java @@ -25,16 +25,16 @@ import java.util.Map; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.KeyWithUuidDto; public class ComponentUuidFactory { private final Map<String, String> uuidsByKey = new HashMap<>(); public ComponentUuidFactory(DbClient dbClient, DbSession dbSession, String rootKey) { - List<ComponentDto> components = dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, rootKey); - for (ComponentDto dto : components) { - uuidsByKey.put(dto.getDbKey(), dto.uuid()); + List<KeyWithUuidDto> keys = dbClient.componentDao().selectUuidsByKeyFromProjectKey(dbSession, rootKey); + for (KeyWithUuidDto dto : keys) { + uuidsByKey.put(dto.key(), dto.uuid()); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java index 6e6341dad9b..985b0d51050 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java @@ -45,7 +45,6 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTreeQuery; import org.sonar.db.component.ComponentTreeQuery.Strategy; import org.sonar.db.source.FileSourceDto; -import org.sonar.server.computation.task.projectanalysis.analysis.Analysis; import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.server.computation.task.projectanalysis.component.Component; import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit; @@ -93,8 +92,7 @@ public class FileMoveDetectionStep implements ComputationStep { @Override public void execute() { // do nothing if no files in db (first analysis) - Analysis baseProjectAnalysis = analysisMetadataHolder.getBaseAnalysis(); - if (baseProjectAnalysis == null) { + if (analysisMetadataHolder.isFirstAnalysis()) { LOG.debug("First analysis. Do nothing."); return; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java index 4322f608694..685d537813f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java @@ -46,8 +46,8 @@ public class ComponentIssuesRepositoryImpl implements MutableComponentIssuesRepo public List<DefaultIssue> getIssues(Component component) { checkState(this.component != null && this.issues != null, "Issues have not been initialized"); checkArgument(component.equals(this.component), - String.format("Only issues from component '%s' are available, but wanted component is '%s'.", - this.component.getReportAttributes().getRef(), component.getReportAttributes().getRef())); + "Only issues from component '%s' are available, but wanted component is '%s'.", + this.component.getReportAttributes().getRef(), component.getReportAttributes().getRef()); return issues; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepository.java index 7392ff616f8..751a962bf20 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepository.java @@ -19,28 +19,25 @@ */ package org.sonar.server.computation.task.projectanalysis.measure; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.FluentIterable.from; -import static java.lang.String.format; -import static java.util.Objects.requireNonNull; - +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSetMultimap; +import com.google.common.collect.SetMultimap; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; - import javax.annotation.Nonnull; import javax.annotation.Nullable; - import org.sonar.server.computation.task.projectanalysis.component.Component; import org.sonar.server.computation.task.projectanalysis.metric.Metric; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableSetMultimap; -import com.google.common.collect.SetMultimap; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.collect.FluentIterable.from; +import static java.lang.String.format; +import static java.util.Objects.requireNonNull; /** * Map based implementation of MeasureRepository which supports only raw measures. @@ -112,9 +109,8 @@ public final class MapBasedRawMeasureRepository<T> implements MeasureRepository private static void checkValueTypeConsistency(Metric metric, Measure measure) { checkArgument( measure.getValueType() == Measure.ValueType.NO_VALUE || measure.getValueType() == metric.getType().getValueType(), - format( - "Measure's ValueType (%s) is not consistent with the Metric's ValueType (%s)", - measure.getValueType(), metric.getType().getValueType())); + "Measure's ValueType (%s) is not consistent with the Metric's ValueType (%s)", + measure.getValueType(), metric.getType().getValueType()); } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SymbolsLineReader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SymbolsLineReader.java index a78b4914b0d..d569478ce9a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SymbolsLineReader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SymbolsLineReader.java @@ -25,7 +25,7 @@ import com.google.common.collect.SetMultimap; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -115,7 +115,7 @@ public class SymbolsLineReader implements LineReader { } private static Map<ScannerReport.Symbol, Integer> createIdsBySymbolMap(List<ScannerReport.Symbol> symbols) { - Map<ScannerReport.Symbol, Integer> map = new HashMap<>(symbols.size()); + Map<ScannerReport.Symbol, Integer> map = new IdentityHashMap<>(symbols.size()); int symbolId = 1; for (ScannerReport.Symbol symbol : symbols) { map.put(symbol, symbolId); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStep.java index 15a9fe732d8..9621e30f871 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStep.java @@ -54,17 +54,21 @@ public class CustomMeasuresCopyStep implements ComputationStep { @Override public void execute() { - new DepthTraversalTypeAwareCrawler( - new TypeAwareVisitorAdapter(CrawlerDepthLimit.LEAVES, ComponentVisitor.Order.PRE_ORDER) { - @Override - public void visitAny(Component component) { - copy(component); - } - }).visit(treeRootHolder.getRoot()); + try (DbSession session = dbClient.openSession(false)) { + CrawlerDepthLimit depthLimit = new CrawlerDepthLimit.Builder(Component.Type.MODULE) + .withViewsMaxDepth(Component.Type.PROJECT_VIEW); + new DepthTraversalTypeAwareCrawler( + new TypeAwareVisitorAdapter(depthLimit, ComponentVisitor.Order.PRE_ORDER) { + @Override + public void visitAny(Component component) { + copy(component, session); + } + }).visit(treeRootHolder.getRoot()); + } } - private void copy(Component component) { - for (CustomMeasureDto dto : loadCustomMeasures(component)) { + private void copy(Component component, DbSession session) { + for (CustomMeasureDto dto : loadCustomMeasures(component, session)) { Metric metric = metricRepository.getById(dto.getMetricId()); // else metric is not found and an exception is raised Measure measure = dtoToMeasure(dto, metric); @@ -72,10 +76,8 @@ public class CustomMeasuresCopyStep implements ComputationStep { } } - private List<CustomMeasureDto> loadCustomMeasures(Component component) { - try (DbSession session = dbClient.openSession(false)) { - return dbClient.customMeasureDao().selectByComponentUuid(session, component.getUuid()); - } + private List<CustomMeasureDto> loadCustomMeasures(Component component, DbSession session) { + return dbClient.customMeasureDao().selectByComponentUuid(session, component.getUuid()); } @VisibleForTesting diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistMeasuresStep.java index a20e36e22f2..69d10747645 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistMeasuresStep.java @@ -82,12 +82,9 @@ public class PersistMeasuresStep implements ComputationStep { @Override public void execute() { - DbSession dbSession = dbClient.openSession(true); - try { + try (DbSession dbSession = dbClient.openSession(true)) { new DepthTraversalTypeAwareCrawler(new MeasureVisitor(dbSession)).visit(treeRootHolder.getRoot()); dbSession.commit(); - } finally { - dbSession.close(); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java index df3d2148023..780df24568e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java @@ -20,6 +20,7 @@ package org.sonar.server.computation.task.projectanalysis.component; import java.util.Arrays; +import java.util.Collections; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -183,7 +184,7 @@ public class ComponentImplTest { .setUuid(UUID) .setStatus(Status.UNAVAILABLE) .setReportAttributes(ReportAttributes.newBuilder(1).build()) - .addChildren(child) + .addChildren(Collections.singletonList(child)) .build(); assertThat(componentImpl.getChildren()).hasSize(1); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStepTest.java index d0abe802756..2203c13b121 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStepTest.java @@ -52,11 +52,11 @@ import static org.sonar.server.computation.task.projectanalysis.measure.MeasureR import static org.sonar.server.computation.task.projectanalysis.measure.MeasureRepoEntry.toEntries; import static org.sonar.server.computation.task.projectanalysis.step.CustomMeasuresCopyStep.dtoToMeasure; - public class CustomMeasuresCopyStepTest { private static final int PROJECT_REF = 1; private static final int MODULE_REF = 11; + private static final int MODULE2_REF = 12; private static final int SUB_MODULE_REF = 111; private static final int DIR_REF = 1111; private static final int FILE1_REF = 11111; @@ -64,6 +64,7 @@ public class CustomMeasuresCopyStepTest { private static final String PROJECT_UUID = "PROJECT"; private static final String MODULE_UUID = "MODULE"; + private static final String MODULE2_UUID = "MODULE2"; private static final String SUB_MODULE_UUID = "SUB_MODULE"; private static final String DIR_UUID = "DIR"; private static final String FILE1_UUID = "FILE1"; @@ -102,12 +103,12 @@ public class CustomMeasuresCopyStepTest { @Test public void copy_custom_measures_on_report() { - // File2 has no custom measure insertCustomMeasure(FILE1_UUID, FLOAT_METRIC, 3.14); insertCustomMeasure(DIR_UUID, FLOAT_METRIC, 123d); insertCustomMeasure(SUB_MODULE_UUID, STRING_METRIC, "sub-module"); insertCustomMeasure(MODULE_UUID, STRING_METRIC, "module"); insertCustomMeasure(PROJECT_UUID, STRING_METRIC, "project"); + // Module2 has no custom measure treeRootHolder.setRoot( builder(PROJECT, PROJECT_REF).setUuid(PROJECT_UUID) @@ -119,23 +120,23 @@ public class CustomMeasuresCopyStepTest { ReportComponent.builder(DIRECTORY, DIR_REF).setUuid(DIR_UUID) .addChildren( ReportComponent.builder(FILE, FILE1_REF).setUuid(FILE1_UUID).build(), - ReportComponent.builder(FILE, FILE2_REF).setUuid(FILE2_UUID).build() - ) - .build() - ) - .build() - ) - .build()) + ReportComponent.builder(FILE, FILE2_REF).setUuid(FILE2_UUID).build()) + .build()) + .build()) + .build(), + ReportComponent.builder(MODULE, MODULE2_REF).setUuid(MODULE2_UUID).build()) .build()); underTest.execute(); - assertRawMeasureValue(FILE1_REF, FLOAT_METRIC.getKey(), 3.1d); + assertNoRawMeasureValue(FILE1_REF); assertNoRawMeasureValue(FILE2_REF); - assertRawMeasureValue(DIR_REF, FLOAT_METRIC.getKey(), 123d); + assertNoRawMeasureValue(DIR_REF); assertRawMeasureValue(SUB_MODULE_REF, STRING_METRIC.getKey(), "sub-module"); assertRawMeasureValue(MODULE_REF, STRING_METRIC.getKey(), "module"); assertRawMeasureValue(PROJECT_REF, STRING_METRIC.getKey(), "project"); + assertNoRawMeasureValue(MODULE2_REF); + } @Test @@ -148,8 +149,7 @@ public class CustomMeasuresCopyStepTest { ViewsComponent.builder(VIEW, VIEW_REF).setUuid("VIEW") .addChildren( ViewsComponent.builder(SUBVIEW, SUBVIEW_REF).setUuid("SUBVIEW").build(), - ViewsComponent.builder(PROJECT_VIEW, PROJECT_VIEW_REF).setUuid("PROJECT_VIEW").build() - ) + ViewsComponent.builder(PROJECT_VIEW, PROJECT_VIEW_REF).setUuid("PROJECT_VIEW").build()) .build()); underTest.execute(); |