]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6259 Fix persistence of projects.root_id
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 22 May 2015 08:23:27 +0000 (10:23 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 22 May 2015 08:23:38 +0000 (10:23 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java

index 765f8aa41630b7f1d4f3603cf22effb687e343cb..0c02731c497ba89a39d08d941f2a792744abfea0 100644 (file)
@@ -62,38 +62,41 @@ public class PersistComponentsStep implements ComputationStep {
       Map<String, ComponentDto> componentDtosByKey = componentDtosByKey(components);
       int rootComponentRef = context.getReportMetadata().getRootComponentRef();
       ComponentContext componentContext = new ComponentContext(context, session, componentDtosByKey);
-      recursivelyProcessComponent(componentContext, rootComponentRef, null);
+      recursivelyProcessComponent(componentContext, rootComponentRef, null, null);
       session.commit();
     } finally {
       session.close();
     }
   }
 
-  private void recursivelyProcessComponent(ComponentContext componentContext, int componentRef, @Nullable ComponentDto moduleParent) {
+  private void recursivelyProcessComponent(ComponentContext componentContext, int componentRef, @Nullable ComponentDto parentModule, @Nullable ComponentDto project) {
     BatchReportReader reportReader = componentContext.context.getReportReader();
     BatchReport.Component reportComponent = reportReader.readComponent(componentRef);
-    ComponentDto componentDto = processComponent(componentContext, reportComponent, moduleParent);
+    ComponentDto componentDto = processComponent(componentContext, reportComponent, parentModule, project);
     dbComponentsRefCache.addComponent(componentRef, new DbComponentsRefCache.DbComponent(componentDto.getId(), componentDto.getKey(), componentDto.uuid()));
 
     for (Integer childRef : reportComponent.getChildRefList()) {
       // If current component is not a module or a project, we need to keep the parent reference to the nearest module
-      ComponentDto nextModuleParent = !reportComponent.getType().equals(Constants.ComponentType.PROJECT) && !reportComponent.getType().equals(Constants.ComponentType.MODULE) ?
-        moduleParent : componentDto;
-      recursivelyProcessComponent(componentContext, childRef, nextModuleParent);
+      ComponentDto nextParent = !reportComponent.getType().equals(Constants.ComponentType.PROJECT) && !reportComponent.getType().equals(Constants.ComponentType.MODULE) ?
+        parentModule : componentDto;
+      // Keep reference to the project
+      ComponentDto nextProject = reportComponent.getType().equals(Constants.ComponentType.PROJECT) ? componentDto : project;
+      recursivelyProcessComponent(componentContext, childRef, nextParent, nextProject);
     }
   }
 
-  private ComponentDto processComponent(ComponentContext componentContext, BatchReport.Component reportComponent, @Nullable ComponentDto moduleParent) {
+  private ComponentDto processComponent(ComponentContext componentContext, BatchReport.Component reportComponent, @Nullable ComponentDto parentModule,
+                                        @Nullable ComponentDto project) {
     ComputeComponentsRefCache.ComputeComponent cacheComputeComponent = computeComponentsRefCache.getByRef(reportComponent.getRef());
     String componentKey = cacheComputeComponent.getKey();
     String componentUuid = cacheComputeComponent.getUuid();
     ComponentDto existingComponent = componentContext.componentDtosByKey.get(componentKey);
     if (existingComponent == null) {
-      ComponentDto component = createComponent(reportComponent, componentKey, componentUuid, moduleParent);
+      ComponentDto component = createComponent(reportComponent, componentKey, componentUuid, parentModule, project);
       dbClient.componentDao().insert(componentContext.dbSession, component);
       return component;
     } else {
-      ComponentDto component = createComponent(reportComponent, componentKey, existingComponent.uuid(), moduleParent);
+      ComponentDto component = createComponent(reportComponent, componentKey, existingComponent.uuid(), parentModule, project);
       if (updateComponent(existingComponent, component)) {
         dbClient.componentDao().update(componentContext.dbSession, existingComponent);
       }
@@ -101,7 +104,8 @@ public class PersistComponentsStep implements ComputationStep {
     }
   }
 
-  private ComponentDto createComponent(BatchReport.Component reportComponent, String componentKey, String uuid, @Nullable ComponentDto parentModule) {
+  private ComponentDto createComponent(BatchReport.Component reportComponent, String componentKey, String uuid, @Nullable ComponentDto parentModule,
+                                       @Nullable ComponentDto project) {
     ComponentDto component = new ComponentDto();
     component.setUuid(uuid);
     component.setKey(componentKey);
@@ -125,8 +129,8 @@ public class PersistComponentsStep implements ComputationStep {
         component.setLanguage(reportComponent.getLanguage());
       }
     }
-    if (parentModule != null) {
-      component.setParentProjectId(parentModule.getId());
+    if (parentModule != null && project != null) {
+      component.setParentProjectId(component.scope().equals(Scopes.PROJECT) ? project.getId() : parentModule.getId());
       component.setProjectUuid(parentModule.projectUuid());
       component.setModuleUuid(parentModule.uuid());
       component.setModuleUuidPath(reportComponent.getType().equals(Constants.ComponentType.MODULE) ?
index 1893f552f5e16d0b06add5b711a0c03d8d5a44ff..d52f68c8c4fefb0e21391585d34ba6c5dd76f1ad 100644 (file)
@@ -353,6 +353,79 @@ public class PersistComponentsStepTest extends BaseStepTest {
     assertThat(file.parentProjectId()).isEqualTo(module.getId());
   }
 
+  @Test
+  public void compute_parent_project_id_from_first_module() throws Exception {
+    computeComponentsRefCache.addComponent(1, new ComputeComponentsRefCache.ComputeComponent("PROJECT_KEY", "ABCD"));
+    computeComponentsRefCache.addComponent(2, new ComputeComponentsRefCache.ComputeComponent("MODULE_KEY", "BCDE"));
+    computeComponentsRefCache.addComponent(3, new ComputeComponentsRefCache.ComputeComponent("SUB_MODULE_1_KEY", "CDEF"));
+    computeComponentsRefCache.addComponent(4, new ComputeComponentsRefCache.ComputeComponent("SUB_MODULE_2_KEY", "DEFG"));
+    computeComponentsRefCache.addComponent(5, new ComputeComponentsRefCache.ComputeComponent("SUB_MODULE_2_KEY:src/main/java/dir", "EFGH"));
+
+    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_1_KEY")
+      .setName("Sub Module 1")
+      .addChildRef(4)
+      .build());
+    writer.writeComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("SUB_MODULE_2_KEY")
+      .setName("Sub Module 2")
+      .addChildRef(5)
+      .build());
+    writer.writeComponent(BatchReport.Component.newBuilder()
+      .setRef(5)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .build());
+
+    sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto()));
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(5);
+
+    ComponentDto project = dbClient.componentDao().selectNullableByKey(session, "PROJECT_KEY");
+    assertThat(project).isNotNull();
+    assertThat(project.parentProjectId()).isNull();
+
+    ComponentDto module = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(module).isNotNull();
+    assertThat(module.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto subModule1 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_1_KEY");
+    assertThat(subModule1).isNotNull();
+    assertThat(subModule1.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto subModule2 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY");
+    assertThat(subModule2).isNotNull();
+    assertThat(subModule2.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY:src/main/java/dir");
+    assertThat(directory).isNotNull();
+    assertThat(directory.parentProjectId()).isEqualTo(subModule2.getId());
+  }
+
   @Test
   public void nothing_to_persist() throws Exception {
     computeComponentsRefCache.addComponent(1, new ComputeComponentsRefCache.ComputeComponent("PROJECT_KEY", "ABCD"));
@@ -561,7 +634,7 @@ public class PersistComponentsStepTest extends BaseStepTest {
     assertThat(moduleBReloaded.moduleUuid()).isEqualTo(moduleAreloaded.uuid());
     assertThat(moduleBReloaded.moduleUuidPath()).isEqualTo(moduleAreloaded.moduleUuidPath() + moduleBReloaded.uuid() + ".");
     assertThat(moduleBReloaded.projectUuid()).isEqualTo(project.uuid());
-    assertThat(moduleBReloaded.parentProjectId()).isEqualTo(moduleAreloaded.getId());
+    assertThat(moduleBReloaded.parentProjectId()).isEqualTo(project.getId());
 
     ComponentDto directoryReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B:src/main/java/dir");
     assertThat(directoryReloaded).isNotNull();