From: Julien Lancelot Date: Wed, 27 May 2015 09:26:22 +0000 (+0200) Subject: SONAR-6589 Apply feedback from PR X-Git-Tag: 5.2-RC1~1826 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f5704c2461e720c2ef8c6f514d27b7caaed09a65;p=sonarqube.git SONAR-6589 Apply feedback from PR --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/Component.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/Component.java index 0f296ff859f..ab4170d128f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/Component.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/Component.java @@ -19,11 +19,11 @@ */ package org.sonar.server.computation.component; +import java.util.List; import org.sonar.server.computation.context.ComputationContext; import org.sonar.server.computation.event.EventRepository; import org.sonar.server.computation.measure.MeasureRepository; - -import java.util.List; +import org.sonar.server.computation.step.PopulateComponentsUuidAndKeyStep; public interface Component { enum Type { @@ -48,8 +48,14 @@ public interface Component { Type getType(); + /** + * Return the component uuid only when {@link PopulateComponentsUuidAndKeyStep} has been executed, otherwise it will throw an exception. + */ String getUuid(); + /** + * Return the component key only when {@link PopulateComponentsUuidAndKeyStep} has been executed, otherwise it will throw an exception. + */ String getKey(); // FIXME we should not expose a batch specific information diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java index a2f2d6ce27c..92e67c3c62a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java @@ -22,6 +22,12 @@ package org.sonar.server.computation.component; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.sonar.api.measures.Metric; import org.sonar.batch.protocol.Constants; import org.sonar.batch.protocol.output.BatchReport; @@ -33,14 +39,6 @@ import org.sonar.server.computation.event.EventRepository; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.db.DbClient; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import static com.google.common.base.Predicates.notNull; import static com.google.common.collect.ImmutableList.copyOf; import static com.google.common.collect.Iterables.filter; @@ -90,6 +88,9 @@ public class ComponentImpl implements Component { } public String getUuid() { + if (uuid == null) { + throw new UnsupportedOperationException(String.format("Component uuid of ref '%s' has not be fed yet", getRef())); + } return uuid; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java index cb8c0c39ef2..9f3368cff76 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java @@ -21,10 +21,9 @@ package org.sonar.server.computation.step; import com.google.common.collect.Lists; -import org.sonar.server.computation.ComputationContainer; - import java.util.Arrays; import java.util.List; +import org.sonar.server.computation.ComputationContainer; /** * Ordered list of steps to be executed @@ -37,7 +36,7 @@ public class ComputationSteps { */ public static List> orderedStepClasses() { return Arrays.asList( - FeedComponentUuidsStep.class, + PopulateComponentsUuidAndKeyStep.class, // Read report ParseReportStep.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedComponentUuidsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedComponentUuidsStep.java deleted file mode 100644 index ebdf1fd6779..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedComponentUuidsStep.java +++ /dev/null @@ -1,137 +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.step; - -import org.sonar.api.utils.internal.Uuids; -import org.sonar.batch.protocol.output.BatchReport; -import org.sonar.batch.protocol.output.BatchReportReader; -import org.sonar.core.component.ComponentDto; -import org.sonar.core.component.ComponentKeys; -import org.sonar.core.persistence.DbSession; -import org.sonar.server.computation.ComputationContext; -import org.sonar.server.computation.component.Component; -import org.sonar.server.computation.component.ComponentImpl; -import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; -import org.sonar.server.db.DbClient; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Read all components from the batch report and set components uuid and key - */ -public class FeedComponentUuidsStep implements ComputationStep { - - private final DbClient dbClient; - - public FeedComponentUuidsStep(DbClient dbClient) { - this.dbClient = dbClient; - } - - @Override - public void execute(final ComputationContext context) { - new ComponentDepthTraversalTypeAwareVisitor(context).visit(context.getRoot()); - } - - @Override - public String getDescription() { - return "Feed components uuid"; - } - - private class ComponentDepthTraversalTypeAwareVisitor extends DepthTraversalTypeAwareVisitor { - - private BatchReportReader reportReader; - private Map componentUuidByKey; - private String branch; - private Component nearestModule; - - public ComponentDepthTraversalTypeAwareVisitor(ComputationContext context) { - super(Component.Type.FILE, Order.PRE_ORDER); - this.componentUuidByKey = new HashMap<>(); - this.branch = context.getReportMetadata().hasBranch() ? context.getReportMetadata().getBranch() : null; - this.reportReader = context.getReportReader(); - this.nearestModule = null; - } - - @Override - public void visitProject(Component project) { - executeForProject(project); - nearestModule = project; - } - - @Override - public void visitModule(Component module) { - executeForModule(module); - nearestModule = module; - } - - @Override - public void visitDirectory(Component directory) { - executeForDirectoryAndFile(directory); - } - - @Override - public void visitFile(Component file) { - executeForDirectoryAndFile(file); - } - - private void executeForProject(Component component) { - BatchReport.Component project = reportReader.readComponent(component.getRef()); - String projectKey = ComponentKeys.createKey(project.getKey(), branch); - DbSession session = dbClient.openSession(false); - try { - List components = dbClient.componentDao().selectComponentsFromProjectKey(session, projectKey); - for (ComponentDto componentDto : components) { - componentUuidByKey.put(componentDto.getKey(), componentDto.uuid()); - } - - feedComponent((ComponentImpl) component, projectKey); - } finally { - session.close(); - } - } - - private void executeForModule(Component component) { - BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); - String componentKey = ComponentKeys.createKey(batchComponent.getKey(), branch); - feedComponent((ComponentImpl) component, componentKey); - } - - private void executeForDirectoryAndFile(Component component) { - BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); - // TODO fail if path is null - String componentKey = ComponentKeys.createEffectiveKey(nearestModule.getKey(), batchComponent.getPath()); - feedComponent((ComponentImpl) component, componentKey); - } - - private void feedComponent(ComponentImpl projectImpl, String componentKey) { - projectImpl.setKey(componentKey); - - String componentUuid = componentUuidByKey.get(componentKey); - if (componentUuid == null) { - projectImpl.setUuid(Uuids.create()); - } else { - projectImpl.setUuid(componentUuid); - } - } - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java index cc4a96dedba..bfc408816e7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java @@ -20,6 +20,7 @@ package org.sonar.server.computation.step; +import java.util.List; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.batch.protocol.output.BatchReportReader; import org.sonar.server.computation.ComputationContext; @@ -27,8 +28,6 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; import org.sonar.server.computation.issue.IssueComputation; -import java.util.List; - public class ParseReportStep implements ComputationStep { private final IssueComputation issueComputation; @@ -38,7 +37,7 @@ public class ParseReportStep implements ComputationStep { } @Override - public void execute(final ComputationContext context) { + public void execute(ComputationContext context) { IssueDepthTraversalTypeAwareVisitor visitor = new IssueDepthTraversalTypeAwareVisitor(context); visitor.visit(context.getRoot()); processDeletedComponents(context, visitor); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java index dd75874019d..f73c4c0c357 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java @@ -20,6 +20,9 @@ package org.sonar.server.computation.step; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; @@ -35,10 +38,6 @@ import org.sonar.server.computation.component.DbComponentsRefCache; import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; import org.sonar.server.db.DbClient; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class PersistComponentsStep implements ComputationStep { private final DbClient dbClient; @@ -220,7 +219,7 @@ public class PersistComponentsStep implements ComputationStep { } private static String getFileQualifier(BatchReport.Component reportComponent) { - return !reportComponent.getIsTest() ? Qualifiers.FILE : Qualifiers.UNIT_TEST_FILE; + return reportComponent.getIsTest() ? Qualifiers.UNIT_TEST_FILE : Qualifiers.FILE; } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java new file mode 100644 index 00000000000..b7655ee32b4 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java @@ -0,0 +1,140 @@ +/* + * 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.step; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Nullable; +import org.sonar.api.utils.internal.Uuids; +import org.sonar.batch.protocol.output.BatchReport; +import org.sonar.batch.protocol.output.BatchReportReader; +import org.sonar.core.component.ComponentDto; +import org.sonar.core.component.ComponentKeys; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.computation.ComputationContext; +import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.ComponentImpl; +import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; +import org.sonar.server.db.DbClient; + +/** + * Read all components from the batch report and set components uuid and key + */ +public class PopulateComponentsUuidAndKeyStep implements ComputationStep { + + private final DbClient dbClient; + + public PopulateComponentsUuidAndKeyStep(DbClient dbClient) { + this.dbClient = dbClient; + } + + @Override + public void execute(ComputationContext context) { + new ComponentDepthTraversalTypeAwareVisitor(context).visit(context.getRoot()); + } + + @Override + public String getDescription() { + return "Feed components uuid"; + } + + private class ComponentDepthTraversalTypeAwareVisitor extends DepthTraversalTypeAwareVisitor { + + private final BatchReportReader reportReader; + private final Map componentUuidByKey; + + @Nullable + private final String branch; + + private Component nearestModule; + + public ComponentDepthTraversalTypeAwareVisitor(ComputationContext context) { + super(Component.Type.FILE, Order.PRE_ORDER); + this.componentUuidByKey = new HashMap<>(); + this.branch = context.getReportMetadata().hasBranch() ? context.getReportMetadata().getBranch() : null; + this.reportReader = context.getReportReader(); + this.nearestModule = null; + } + + @Override + public void visitProject(Component project) { + executeForProject(project); + nearestModule = project; + } + + @Override + public void visitModule(Component module) { + executeForModule(module); + nearestModule = module; + } + + @Override + public void visitDirectory(Component directory) { + executeForDirectoryAndFile(directory); + } + + @Override + public void visitFile(Component file) { + executeForDirectoryAndFile(file); + } + + private void executeForProject(Component component) { + BatchReport.Component project = reportReader.readComponent(component.getRef()); + String projectKey = ComponentKeys.createKey(project.getKey(), branch); + DbSession session = dbClient.openSession(false); + try { + List components = dbClient.componentDao().selectComponentsFromProjectKey(session, projectKey); + for (ComponentDto componentDto : components) { + componentUuidByKey.put(componentDto.getKey(), componentDto.uuid()); + } + + feedComponent((ComponentImpl) component, projectKey); + } finally { + session.close(); + } + } + + private void executeForModule(Component component) { + BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); + String componentKey = ComponentKeys.createKey(batchComponent.getKey(), branch); + feedComponent((ComponentImpl) component, componentKey); + } + + private void executeForDirectoryAndFile(Component component) { + BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); + // TODO fail if path is null + String componentKey = ComponentKeys.createEffectiveKey(nearestModule.getKey(), batchComponent.getPath()); + feedComponent((ComponentImpl) component, componentKey); + } + + private void feedComponent(ComponentImpl component, String componentKey) { + component.setKey(componentKey); + + String componentUuid = componentUuidByKey.get(componentKey); + if (componentUuid == null) { + component.setUuid(Uuids.create()); + } else { + component.setUuid(componentUuid); + } + } + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java index d89444f2770..7ed17968743 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java @@ -49,14 +49,14 @@ public class ComputationStepsTest { mock(PersistFileSourcesStep.class), mock(PersistTestsStep.class), mock(IndexTestsStep.class), - mock(FeedComponentUuidsStep.class), + mock(PopulateComponentsUuidAndKeyStep.class), mock(PersistComponentsStep.class), mock(IndexTestsStep.class), mock(QualityProfileEventsStep.class) ); assertThat(registry.orderedSteps()).hasSize(20); - assertThat(registry.orderedSteps().get(0)).isInstanceOf(FeedComponentUuidsStep.class); + assertThat(registry.orderedSteps().get(0)).isInstanceOf(PopulateComponentsUuidAndKeyStep.class); assertThat(registry.orderedSteps().get(19)).isInstanceOf(SendIssueNotificationsStep.class); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/FeedComponentUuidsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/FeedComponentUuidsStepTest.java deleted file mode 100644 index fb92b615286..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/FeedComponentUuidsStepTest.java +++ /dev/null @@ -1,257 +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.step; - -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.config.Settings; -import org.sonar.batch.protocol.Constants; -import org.sonar.batch.protocol.output.BatchReport; -import org.sonar.batch.protocol.output.BatchReportReader; -import org.sonar.batch.protocol.output.BatchReportWriter; -import org.sonar.core.persistence.DbSession; -import org.sonar.core.persistence.DbTester; -import org.sonar.server.component.db.ComponentDao; -import org.sonar.server.computation.ComputationContext; -import org.sonar.server.computation.component.Component; -import org.sonar.server.computation.component.ComponentTreeBuilders; -import org.sonar.server.computation.language.LanguageRepository; -import org.sonar.server.db.DbClient; -import org.sonar.test.DbTests; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -@Category(DbTests.class) -public class FeedComponentUuidsStepTest extends BaseStepTest { - - private static final String PROJECT_KEY = "PROJECT_KEY"; - - @ClassRule - public static DbTester dbTester = new DbTester(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - File reportDir; - - DbSession session; - - DbClient dbClient; - - Settings projectSettings; - - LanguageRepository languageRepository = mock(LanguageRepository.class); - - FeedComponentUuidsStep sut; - - @Before - public void setup() throws Exception { - dbTester.truncateTables(); - session = dbTester.myBatis().openSession(false); - dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao()); - - reportDir = temp.newFolder(); - - projectSettings = new Settings(); - sut = new FeedComponentUuidsStep(dbClient); - } - - @Override - protected ComputationStep step() { - return sut; - } - - @Test - public void add_components() throws Exception { - File reportDir = temp.newFolder(); - BatchReportWriter writer = new BatchReportWriter(reportDir); - writer.writeMetadata(BatchReport.Metadata.newBuilder() - .setRootComponentRef(1) - .build()); - - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(1) - .setType(Constants.ComponentType.PROJECT) - .setKey(PROJECT_KEY) - .addChildRef(2) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(2) - .setType(Constants.ComponentType.MODULE) - .setKey("MODULE_KEY") - .addChildRef(3) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(3) - .setType(Constants.ComponentType.DIRECTORY) - .setPath("src/main/java/dir") - .addChildRef(4) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(4) - .setType(Constants.ComponentType.FILE) - .setPath("src/main/java/dir/Foo.java") - .build()); - - BatchReportReader batchReportReader = new BatchReportReader(reportDir); - ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, - dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); - sut.execute(context); - - Map componentsByRef = getComponentsByRef(context.getRoot()); - - assertThat(componentsByRef.get(1).getKey()).isEqualTo(PROJECT_KEY); - assertThat(componentsByRef.get(1).getUuid()).isNotNull(); - - assertThat(componentsByRef.get(2).getKey()).isEqualTo("MODULE_KEY"); - assertThat(componentsByRef.get(2).getUuid()).isNotNull(); - - assertThat(componentsByRef.get(3).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir"); - assertThat(componentsByRef.get(3).getUuid()).isNotNull(); - - assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir/Foo.java"); - assertThat(componentsByRef.get(4).getUuid()).isNotNull(); - } - - @Test - public void use_latest_module_for_files_key() throws Exception { - File reportDir = temp.newFolder(); - BatchReportWriter writer = new BatchReportWriter(reportDir); - writer.writeMetadata(BatchReport.Metadata.newBuilder() - .setRootComponentRef(1) - .build()); - - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(1) - .setType(Constants.ComponentType.PROJECT) - .setKey(PROJECT_KEY) - .setName("Project") - .addChildRef(2) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(2) - .setType(Constants.ComponentType.MODULE) - .setKey("MODULE_KEY") - .setName("Module") - .addChildRef(3) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(3) - .setType(Constants.ComponentType.MODULE) - .setKey("SUB_MODULE_KEY") - .setName("Sub Module") - .addChildRef(4) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(4) - .setType(Constants.ComponentType.DIRECTORY) - .setPath("src/main/java/dir") - .addChildRef(5) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(5) - .setType(Constants.ComponentType.FILE) - .setPath("src/main/java/dir/Foo.java") - .build()); - - BatchReportReader batchReportReader = new BatchReportReader(reportDir); - ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, - dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); - sut.execute(context); - - Map componentsByRef = getComponentsByRef(context.getRoot()); - - assertThat(componentsByRef.get(4).getKey()).isEqualTo("SUB_MODULE_KEY:src/main/java/dir"); - assertThat(componentsByRef.get(5).getKey()).isEqualTo("SUB_MODULE_KEY:src/main/java/dir/Foo.java"); - } - - @Test - public void use_branch_to_generate_keys() throws Exception { - File reportDir = temp.newFolder(); - BatchReportWriter writer = new BatchReportWriter(reportDir); - writer.writeMetadata(BatchReport.Metadata.newBuilder() - .setRootComponentRef(1) - .setBranch("origin/master") - .setProjectKey("") - .build()); - - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(1) - .setType(Constants.ComponentType.PROJECT) - .setKey(PROJECT_KEY) - .setName("Project") - .addChildRef(2) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(2) - .setType(Constants.ComponentType.MODULE) - .setKey("MODULE_KEY") - .setName("Module") - .addChildRef(3) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(3) - .setType(Constants.ComponentType.DIRECTORY) - .setPath("src/main/java/dir") - .addChildRef(4) - .build()); - writer.writeComponent(BatchReport.Component.newBuilder() - .setRef(4) - .setType(Constants.ComponentType.FILE) - .setPath("src/main/java/dir/Foo.java") - .build()); - - BatchReportReader batchReportReader = new BatchReportReader(reportDir); - ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, - dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); - sut.execute(context); - - Map componentsByRef = getComponentsByRef(context.getRoot()); - - assertThat(componentsByRef.get(1).getKey()).isEqualTo("PROJECT_KEY:origin/master"); - assertThat(componentsByRef.get(2).getKey()).isEqualTo("MODULE_KEY:origin/master"); - assertThat(componentsByRef.get(3).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir"); - assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir/Foo.java"); - } - - private static Map getComponentsByRef(Component root) { - Map componentsByRef = new HashMap<>(); - feedComponentByRef(root, componentsByRef); - return componentsByRef; - } - - private static void feedComponentByRef(Component component, Map map) { - map.put(component.getRef(), component); - for (Component child : component.getChildren()) { - feedComponentByRef(child, map); - } - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java index c6bdf2e8580..143052a7c23 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java @@ -20,6 +20,9 @@ package org.sonar.server.computation.step; +import java.io.File; +import java.util.Arrays; +import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -50,10 +53,6 @@ import org.sonar.server.db.DbClient; import org.sonar.server.source.db.FileSourceDao; import org.sonar.server.source.db.FileSourceDb; -import java.io.File; -import java.util.Arrays; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.mock; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStepTest.java new file mode 100644 index 00000000000..66140f7aa7f --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStepTest.java @@ -0,0 +1,256 @@ +/* + * 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.step; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.rules.TemporaryFolder; +import org.sonar.api.config.Settings; +import org.sonar.batch.protocol.Constants; +import org.sonar.batch.protocol.output.BatchReport; +import org.sonar.batch.protocol.output.BatchReportReader; +import org.sonar.batch.protocol.output.BatchReportWriter; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.DbTester; +import org.sonar.server.component.db.ComponentDao; +import org.sonar.server.computation.ComputationContext; +import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.ComponentTreeBuilders; +import org.sonar.server.computation.language.LanguageRepository; +import org.sonar.server.db.DbClient; +import org.sonar.test.DbTests; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +@Category(DbTests.class) +public class PopulateComponentsUuidAndKeyStepTest extends BaseStepTest { + + private static final String PROJECT_KEY = "PROJECT_KEY"; + + @ClassRule + public static DbTester dbTester = new DbTester(); + + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + File reportDir; + + DbSession session; + + DbClient dbClient; + + Settings projectSettings; + + LanguageRepository languageRepository = mock(LanguageRepository.class); + + PopulateComponentsUuidAndKeyStep sut; + + @Before + public void setup() throws Exception { + dbTester.truncateTables(); + session = dbTester.myBatis().openSession(false); + dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao()); + + reportDir = temp.newFolder(); + + projectSettings = new Settings(); + sut = new PopulateComponentsUuidAndKeyStep(dbClient); + } + + @Override + protected ComputationStep step() { + return sut; + } + + @Test + public void add_components() throws Exception { + File reportDir = temp.newFolder(); + BatchReportWriter writer = new BatchReportWriter(reportDir); + writer.writeMetadata(BatchReport.Metadata.newBuilder() + .setRootComponentRef(1) + .build()); + + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(1) + .setType(Constants.ComponentType.PROJECT) + .setKey(PROJECT_KEY) + .addChildRef(2) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(2) + .setType(Constants.ComponentType.MODULE) + .setKey("MODULE_KEY") + .addChildRef(3) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(3) + .setType(Constants.ComponentType.DIRECTORY) + .setPath("src/main/java/dir") + .addChildRef(4) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(4) + .setType(Constants.ComponentType.FILE) + .setPath("src/main/java/dir/Foo.java") + .build()); + + BatchReportReader batchReportReader = new BatchReportReader(reportDir); + ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, + dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); + sut.execute(context); + + Map componentsByRef = getComponentsByRef(context.getRoot()); + + assertThat(componentsByRef.get(1).getKey()).isEqualTo(PROJECT_KEY); + assertThat(componentsByRef.get(1).getUuid()).isNotNull(); + + assertThat(componentsByRef.get(2).getKey()).isEqualTo("MODULE_KEY"); + assertThat(componentsByRef.get(2).getUuid()).isNotNull(); + + assertThat(componentsByRef.get(3).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir"); + assertThat(componentsByRef.get(3).getUuid()).isNotNull(); + + assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:src/main/java/dir/Foo.java"); + assertThat(componentsByRef.get(4).getUuid()).isNotNull(); + } + + @Test + public void use_latest_module_for_files_key() throws Exception { + File reportDir = temp.newFolder(); + BatchReportWriter writer = new BatchReportWriter(reportDir); + writer.writeMetadata(BatchReport.Metadata.newBuilder() + .setRootComponentRef(1) + .build()); + + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(1) + .setType(Constants.ComponentType.PROJECT) + .setKey(PROJECT_KEY) + .setName("Project") + .addChildRef(2) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(2) + .setType(Constants.ComponentType.MODULE) + .setKey("MODULE_KEY") + .setName("Module") + .addChildRef(3) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(3) + .setType(Constants.ComponentType.MODULE) + .setKey("SUB_MODULE_KEY") + .setName("Sub Module") + .addChildRef(4) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(4) + .setType(Constants.ComponentType.DIRECTORY) + .setPath("src/main/java/dir") + .addChildRef(5) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(5) + .setType(Constants.ComponentType.FILE) + .setPath("src/main/java/dir/Foo.java") + .build()); + + BatchReportReader batchReportReader = new BatchReportReader(reportDir); + ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, + dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); + sut.execute(context); + + Map componentsByRef = getComponentsByRef(context.getRoot()); + + assertThat(componentsByRef.get(4).getKey()).isEqualTo("SUB_MODULE_KEY:src/main/java/dir"); + assertThat(componentsByRef.get(5).getKey()).isEqualTo("SUB_MODULE_KEY:src/main/java/dir/Foo.java"); + } + + @Test + public void use_branch_to_generate_keys() throws Exception { + File reportDir = temp.newFolder(); + BatchReportWriter writer = new BatchReportWriter(reportDir); + writer.writeMetadata(BatchReport.Metadata.newBuilder() + .setRootComponentRef(1) + .setBranch("origin/master") + .setProjectKey("") + .build()); + + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(1) + .setType(Constants.ComponentType.PROJECT) + .setKey(PROJECT_KEY) + .setName("Project") + .addChildRef(2) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(2) + .setType(Constants.ComponentType.MODULE) + .setKey("MODULE_KEY") + .setName("Module") + .addChildRef(3) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(3) + .setType(Constants.ComponentType.DIRECTORY) + .setPath("src/main/java/dir") + .addChildRef(4) + .build()); + writer.writeComponent(BatchReport.Component.newBuilder() + .setRef(4) + .setType(Constants.ComponentType.FILE) + .setPath("src/main/java/dir/Foo.java") + .build()); + + BatchReportReader batchReportReader = new BatchReportReader(reportDir); + ComputationContext context = new ComputationContext(batchReportReader, PROJECT_KEY, projectSettings, + dbClient, ComponentTreeBuilders.from(batchReportReader), languageRepository); + sut.execute(context); + + Map componentsByRef = getComponentsByRef(context.getRoot()); + + assertThat(componentsByRef.get(1).getKey()).isEqualTo("PROJECT_KEY:origin/master"); + assertThat(componentsByRef.get(2).getKey()).isEqualTo("MODULE_KEY:origin/master"); + assertThat(componentsByRef.get(3).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir"); + assertThat(componentsByRef.get(4).getKey()).isEqualTo("MODULE_KEY:origin/master:src/main/java/dir/Foo.java"); + } + + private static Map getComponentsByRef(Component root) { + Map componentsByRef = new HashMap<>(); + feedComponentByRef(root, componentsByRef); + return componentsByRef; + } + + private static void feedComponentByRef(Component component, Map map) { + map.put(component.getRef(), component); + for (Component child : component.getChildren()) { + feedComponentByRef(child, map); + } + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java index 4d22e16fd63..7ea5c1e066d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java @@ -20,6 +20,8 @@ package org.sonar.server.computation.step; +import java.io.File; +import java.io.IOException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -41,9 +43,6 @@ import org.sonar.server.computation.component.ProjectSettingsRepository; import org.sonar.server.computation.language.LanguageRepository; import org.sonar.server.db.DbClient; -import java.io.File; -import java.io.IOException; - import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock;