]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6589 Apply feedback from PR 331/head
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 27 May 2015 09:26:22 +0000 (11:26 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 27 May 2015 09:49:39 +0000 (11:49 +0200)
12 files changed:
server/sonar-server/src/main/java/org/sonar/server/computation/component/Component.java
server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/FeedComponentUuidsStep.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/FeedComponentUuidsStepTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStepTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java

index 0f296ff859f67d6f166ab9d079a8117360347472..ab4170d128f411cf0a75a14063cc6c9890d7bf4d 100644 (file)
  */
 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
index a2f2d6ce27cf345e3abc5b2c8b7ecc7639461033..92e67c3c62a969c7abc2b08d36e3de37e81db10b 100644 (file)
@@ -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;
   }
 
index cb8c0c39ef27efeb2c62dd064e12f988dd044d02..9f3368cff76ecfd07edfa81ebf7bb9a5196303f4 100644 (file)
 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<Class<? extends ComputationStep>> 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 (file)
index ebdf1fd..0000000
+++ /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<String, String> 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<ComponentDto> 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);
-      }
-    }
-  }
-}
index cc4a96dedba0574fe2794ff9b9eede7e4b1088a0..bfc408816e7af28cce6adb810032301daacc2313 100644 (file)
@@ -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);
index dd75874019dc6d73ac9656385d3e04def90ec7c1..f73c4c0c3570afa1414c528b3d944209e386c4ee 100644 (file)
@@ -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 (file)
index 0000000..b7655ee
--- /dev/null
@@ -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<String, String> 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<ComponentDto> 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);
+      }
+    }
+  }
+}
index d89444f2770acaf437187f5896969fa85cdd4f57..7ed179687435fd627a1dc0956fb24b72141203b1 100644 (file)
@@ -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 (file)
index fb92b61..0000000
+++ /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<Integer, Component> 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<Integer, Component> 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<Integer, Component> 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<Integer, Component> getComponentsByRef(Component root) {
-    Map<Integer, Component> componentsByRef = new HashMap<>();
-    feedComponentByRef(root, componentsByRef);
-    return componentsByRef;
-  }
-
-  private static void feedComponentByRef(Component component, Map<Integer, Component> map) {
-    map.put(component.getRef(), component);
-    for (Component child : component.getChildren()) {
-      feedComponentByRef(child, map);
-    }
-  }
-
-}
index c6bdf2e858084fc7504651b512af81d679f4a7ba..143052a7c238ee9db4719bc707fd7f2e20d64292 100644 (file)
@@ -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 (file)
index 0000000..66140f7
--- /dev/null
@@ -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<Integer, Component> 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<Integer, Component> 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<Integer, Component> 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<Integer, Component> getComponentsByRef(Component root) {
+    Map<Integer, Component> componentsByRef = new HashMap<>();
+    feedComponentByRef(root, componentsByRef);
+    return componentsByRef;
+  }
+
+  private static void feedComponentByRef(Component component, Map<Integer, Component> map) {
+    map.put(component.getRef(), component);
+    for (Component child : component.getChildren()) {
+      feedComponentByRef(child, map);
+    }
+  }
+
+}
index 4d22e16fd635d02b607764d9f461b3d029aab2b1..7ea5c1e066d40549b6e26986b97fff200763553f 100644 (file)
@@ -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;