]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6118 Module UUID path on projects and modules must contain the component itself
authorJulien HENRY <julien.henry@sonarsource.com>
Fri, 13 Feb 2015 08:33:03 +0000 (09:33 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Fri, 13 Feb 2015 13:39:55 +0000 (14:39 +0100)
sonar-batch/src/main/java/org/sonar/batch/index/ResourcePersister.java
sonar-batch/src/test/java/org/sonar/batch/index/ResourcePersisterTest.java
sonar-batch/src/test/resources/org/sonar/batch/index/ResourcePersisterTest/shouldRemoveRootIndexIfResourceIsProject-result.xml
sonar-batch/src/test/resources/org/sonar/batch/index/ResourcePersisterTest/shouldRemoveRootIndexIfResourceIsProject.xml
sonar-batch/src/test/resources/org/sonar/batch/index/ResourcePersisterTest/shouldUpdateExistingResource-result.xml

index 8b739aada0264be35ab8d282fe17e68318c6a26f..0066e330959435ed735ed332136e07a9bca0e85c 100644 (file)
  */
 package org.sonar.batch.index;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.ResourceModel;
 import org.sonar.api.database.model.Snapshot;
-import org.sonar.api.resources.*;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Library;
+import org.sonar.api.resources.Project;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.resources.Resource;
+import org.sonar.api.resources.ResourceUtils;
+import org.sonar.api.resources.Scopes;
 import org.sonar.api.security.ResourcePermissions;
 import org.sonar.api.utils.SonarException;
 import org.sonar.api.utils.internal.Uuids;
@@ -34,6 +41,7 @@ import org.sonar.core.component.ScanGraph;
 import javax.annotation.Nullable;
 import javax.persistence.NonUniqueResultException;
 import javax.persistence.Query;
+
 import java.util.Date;
 import java.util.List;
 
@@ -41,6 +49,8 @@ import static org.sonar.api.utils.DateUtils.dateToLong;
 
 public class ResourcePersister implements ScanPersister {
 
+  @VisibleForTesting
+  static final String MODULE_UUID_PATH_SEPARATOR = ".";
   private static final String RESOURCE_ID = "resourceId";
   private static final String LAST = "last";
   private static final String VERSION = "version";
@@ -273,22 +283,29 @@ public class ResourcePersister implements ScanPersister {
     if (ResourceUtils.isLibrary(resource) && !Qualifiers.LIBRARY.equals(model.getQualifier())) {
       return;
     }
-    if (parentResource != null) {
+    if (parentResource == null) {
+      // Root module && libraries
+      model.setProjectUuid(model.getUuid());
+      model.setModuleUuidPath(MODULE_UUID_PATH_SEPARATOR + model.getUuid() + MODULE_UUID_PATH_SEPARATOR);
+    } else {
       ResourceModel parentModel = session.getSingleResult(ResourceModel.class, "id", parentResource.getId());
       model.setProjectUuid(parentModel.getProjectUuid());
-      if (Scopes.isProject(parentResource)) {
+      if (Scopes.isProject(resource)) {
+        // Sub module
+        model.setModuleUuid(parentResource.getUuid());
+        String parentModuleUuidPath = parentModel.getModuleUuidPath();
+        model.setModuleUuidPath(parentModuleUuidPath + model.getUuid() + MODULE_UUID_PATH_SEPARATOR);
+      } else if (Scopes.isProject(parentResource)) {
+        // Directory
         model.setModuleUuid(parentResource.getUuid());
         String parentModuleUuidPath = parentModel.getModuleUuidPath();
-        model.setModuleUuidPath(parentModuleUuidPath + parentModel.getUuid() + ".");
+        model.setModuleUuidPath(parentModuleUuidPath);
       } else {
+        // File
         model.setModuleUuid(parentModel.getModuleUuid());
         String parentModuleUuidPath = parentModel.getModuleUuidPath();
         model.setModuleUuidPath(parentModuleUuidPath);
       }
-    } else {
-      // Root module && libraries
-      model.setProjectUuid(model.getUuid());
-      model.setModuleUuidPath(".");
     }
   }
 
index 6a4506273b43b0cf409c752b4ccf874ae8670dd3..828b660613f1d9a73f3de67ae374caa6512602a5 100644 (file)
@@ -55,6 +55,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.sonar.batch.index.ResourcePersister.MODULE_UUID_PATH_SEPARATOR;
 
 public class ResourcePersisterTest extends AbstractDbUnitTestCase {
 
@@ -126,7 +127,7 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(newProject.uuid()).isNotNull();
       assertThat(newProject.projectUuid()).isEqualTo(newProject.uuid());
       assertThat(newProject.moduleUuid()).isNull();
-      assertThat(newProject.moduleUuidPath()).isEqualTo(".");
+      assertThat(newProject.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + newProject.uuid() + MODULE_UUID_PATH_SEPARATOR);
       // SONAR-3636 : created_at must be fed when inserting a new entry in the 'projects' table
       assertThat(newProject.getCreatedAt()).isNotNull();
     }
@@ -147,7 +148,7 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(newProject.uuid()).isNotNull();
       assertThat(newProject.projectUuid()).isEqualTo(newProject.uuid());
       assertThat(newProject.moduleUuid()).isNull();
-      assertThat(newProject.moduleUuidPath()).isEqualTo(".");
+      assertThat(newProject.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + newProject.uuid() + MODULE_UUID_PATH_SEPARATOR);
     }
   }
 
@@ -179,32 +180,35 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(root.uuid()).isNotNull();
       assertThat(root.projectUuid()).isEqualTo(root.uuid());
       assertThat(root.moduleUuid()).isNull();
-      assertThat(root.moduleUuidPath()).isEqualTo(".");
+      assertThat(root.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto a = session.getMapper(ComponentMapper.class).selectByKey("a");
       assertThat(a.uuid()).isNotNull();
       assertThat(a.projectUuid()).isEqualTo(root.uuid());
       assertThat(a.moduleUuid()).isEqualTo(root.uuid());
-      assertThat(a.moduleUuidPath()).isEqualTo("." + root.uuid() + ".");
+      assertThat(a.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + a.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto b = session.getMapper(ComponentMapper.class).selectByKey("b");
       assertThat(b.uuid()).isNotNull();
       assertThat(b.projectUuid()).isEqualTo(root.uuid());
       assertThat(b.moduleUuid()).isEqualTo(root.uuid());
-      assertThat(b.moduleUuidPath()).isEqualTo("." + root.uuid() + ".");
+      assertThat(b.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto b1 = session.getMapper(ComponentMapper.class).selectByKey("b1");
       assertThat(b1.uuid()).isNotNull();
       assertThat(b1.projectUuid()).isEqualTo(root.uuid());
       assertThat(b1.moduleUuid()).isEqualTo(b.uuid());
-      assertThat(b1.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + ".");
+      assertThat(b1.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto dir = session.getMapper(ComponentMapper.class).selectByKey("b1:src/main/java/org");
       assertThat(dir.uuid()).isNotNull();
       assertThat(dir.projectUuid()).isEqualTo(root.uuid());
       assertThat(dir.moduleUuid()).isEqualTo(b1.uuid());
-      assertThat(dir.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + "." + b1.uuid() + ".");
+      assertThat(dir.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto fileComp = session.getMapper(ComponentMapper.class).selectByKey("b1:src/main/java/org/Foo.java");
       assertThat(fileComp.uuid()).isNotNull();
       assertThat(fileComp.projectUuid()).isEqualTo(root.uuid());
       assertThat(fileComp.moduleUuid()).isEqualTo(b1.uuid());
-      assertThat(fileComp.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + "." + b1.uuid() + ".");
+      assertThat(fileComp.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
     }
   }
 
@@ -253,35 +257,38 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(root.uuid()).isNotNull();
       assertThat(root.projectUuid()).isEqualTo(root.uuid());
       assertThat(root.moduleUuid()).isNull();
-      assertThat(root.moduleUuidPath()).isEqualTo(".");
+      assertThat(root.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto a = session.getMapper(ComponentMapper.class).selectByKey("a");
       System.out.println("A: " + a.uuid());
       assertThat(a.uuid()).isNotNull();
       assertThat(a.projectUuid()).isEqualTo(root.uuid());
       assertThat(a.moduleUuid()).isEqualTo(root.uuid());
-      assertThat(a.moduleUuidPath()).isEqualTo("." + root.uuid() + ".");
+      assertThat(a.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + a.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto b = session.getMapper(ComponentMapper.class).selectByKey("b");
       System.out.println("B: " + b.uuid());
       assertThat(b.uuid()).isNotNull();
       assertThat(b.projectUuid()).isEqualTo(root.uuid());
       assertThat(b.moduleUuid()).isEqualTo(root.uuid());
-      assertThat(b.moduleUuidPath()).isEqualTo("." + root.uuid() + ".");
+      assertThat(b.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto b1 = session.getMapper(ComponentMapper.class).selectByKey("b1");
       System.out.println("B1: " + b1.uuid());
       assertThat(b1.uuid()).isNotNull();
       assertThat(b1.projectUuid()).isEqualTo(root.uuid());
       assertThat(b1.moduleUuid()).isEqualTo(b.uuid());
-      assertThat(b1.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + ".");
+      assertThat(b1.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto dir = session.getMapper(ComponentMapper.class).selectByKey("b1:src/main/java/org");
       assertThat(dir.uuid()).isNotNull();
       assertThat(dir.projectUuid()).isEqualTo(root.uuid());
       assertThat(dir.moduleUuid()).isEqualTo(b1.uuid());
-      assertThat(dir.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + "." + b1.uuid() + ".");
+      assertThat(dir.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
       ComponentDto fileComp = session.getMapper(ComponentMapper.class).selectByKey("b1:src/main/java/org/Foo.java");
       assertThat(fileComp.uuid()).isNotNull();
       assertThat(fileComp.projectUuid()).isEqualTo(root.uuid());
       assertThat(fileComp.moduleUuid()).isEqualTo(b1.uuid());
-      assertThat(fileComp.moduleUuidPath()).isEqualTo("." + root.uuid() + "." + b.uuid() + "." + b1.uuid() + ".");
+      assertThat(fileComp.moduleUuidPath()).isEqualTo(
+        MODULE_UUID_PATH_SEPARATOR + root.uuid() + MODULE_UUID_PATH_SEPARATOR + b.uuid() + MODULE_UUID_PATH_SEPARATOR + b1.uuid() + MODULE_UUID_PATH_SEPARATOR);
     }
   }
 
@@ -304,7 +311,7 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(newDir.uuid()).isNotNull();
       assertThat(newDir.projectUuid()).isEqualTo(newProject.uuid());
       assertThat(newDir.moduleUuid()).isEqualTo(newProject.uuid());
-      assertThat(newDir.moduleUuidPath()).isEqualTo("." + newProject.uuid() + ".");
+      assertThat(newDir.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + newProject.uuid() + MODULE_UUID_PATH_SEPARATOR);
     }
   }
 
@@ -340,7 +347,7 @@ public class ResourcePersisterTest extends AbstractDbUnitTestCase {
       assertThat(newLib.uuid()).isNotNull();
       assertThat(newLib.projectUuid()).isEqualTo(newLib.uuid());
       assertThat(newLib.moduleUuid()).isNull();
-      assertThat(newLib.moduleUuidPath()).isEqualTo(".");
+      assertThat(newLib.moduleUuidPath()).isEqualTo(MODULE_UUID_PATH_SEPARATOR + newLib.uuid() + MODULE_UUID_PATH_SEPARATOR);
     }
   }
 
index 32f00a7d0d8926cc655f6f13b20283a44be6557d..65b53bf24b090726fad789e1358c88f5b7979d64 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="[null]" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path="."
+  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="[null]" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path=".BCDE."
             name="Foo" long_name="Foo" description="some description"
             enabled="true" language="[null]" copy_resource_id="[null]" person_id="[null]" created_at="[null]" path="[null]" deprecated_kee="foo"/>
 
index fb8b855c622d6548a8922bd6a3dfce07f4091926..a7daee3a2ea58d6d5776dedb0853013a852881d6 100644 (file)
@@ -1,7 +1,7 @@
 <dataset>
 
   <!-- This project has a root_id which should be set to NULL (SONAR-1700) -->
-  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="12345" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path="[null]"
+  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="12345" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path=".BCDE."
             name="name" long_name="long name" description="description"
             enabled="true" language="java" copy_resource_id="[null]" person_id="[null]" created_at="[null]" path="[null]" deprecated_kee="foo"/>
 
index b38cce164ff584d3ac2603fb5ed4b245111e01ef..c3d031d246e1d8bb1992f34a8d88a3bb2dad5d05 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="[null]" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path="."
+  <projects id="1001" scope="PRJ" qualifier="TRK" kee="foo" root_id="[null]" uuid="BCDE" project_uuid="BCDE" module_uuid="[null]" module_uuid_path=".BCDE."
             name="new name" long_name="new name" description="new description"
             enabled="true" language="[null]" copy_resource_id="[null]" person_id="[null]" path="[null]" deprecated_kee="foo" />