*/
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;
import javax.annotation.Nullable;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
+
import java.util.Date;
import java.util.List;
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";
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(".");
}
}
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 {
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();
}
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);
}
}
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);
}
}
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);
}
}
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);
}
}
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);
}
}