From 9970fdc584b11d35cc60cb7ad57dee825b8340da Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 22 May 2015 10:23:27 +0200 Subject: [PATCH] SONAR-6259 Fix persistence of projects.root_id --- .../step/PersistComponentsStep.java | 28 ++++--- .../step/PersistComponentsStepTest.java | 75 ++++++++++++++++++- 2 files changed, 90 insertions(+), 13 deletions(-) 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 765f8aa4163..0c02731c497 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 @@ -62,38 +62,41 @@ public class PersistComponentsStep implements ComputationStep { Map 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) ? diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java index 1893f552f5e..d52f68c8c4f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java @@ -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(); -- 2.39.5