aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-db/src
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2016-11-17 11:38:24 +0100
committerGitHub <noreply@github.com>2016-11-17 11:38:24 +0100
commita8fa19a4065443dc3aee7fad766229e207c1d506 (patch)
tree3fd88d86c10dad1feb54343b86756289ae4a9fcc /sonar-db/src
parent4bfa8e9c56b484052bb82b0ec617fc682a46c59c (diff)
downloadsonarqube-a8fa19a4065443dc3aee7fad766229e207c1d506.tar.gz
sonarqube-a8fa19a4065443dc3aee7fad766229e207c1d506.zip
SONAR-8391 fix NPE when id is invalid in SNAPSHOTS.PATH
Diffstat (limited to 'sonar-db/src')
-rw-r--r--sonar-db/src/main/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjects.java12
-rw-r--r--sonar-db/src/test/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjectsTest.java18
2 files changed, 23 insertions, 7 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjects.java b/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjects.java
index 4402a1bac62..13efc5f4684 100644
--- a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjects.java
+++ b/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjects.java
@@ -27,6 +27,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import javax.annotation.Nullable;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -117,8 +118,15 @@ public class PopulateUuidPathColumnOnProjects extends BaseDataChange {
}
List<String> componentUuidPath = Arrays.stream(snapshot.snapshotPath)
- .mapToObj(snapshotId -> relations.snapshotsById.get(snapshotId).componentUuid)
- .collect(toCollection(() -> new ArrayList<>(snapshot.snapshotPath.length)));
+ .mapToObj(snapshotId -> relations.snapshotsById.get(snapshotId))
+ .filter(Objects::nonNull)
+ .map(s -> s.componentUuid)
+ .collect(toCollection(() -> new ArrayList<>()));
+ if (componentUuidPath.size() != snapshot.snapshotPath.length) {
+ LOG.trace("Some component UUIDs not found for snapshots [{}]", snapshot.snapshotPath);
+ return false;
+ }
+
update.setString(1, PATH_SEPARATOR + PATH_JOINER.join(componentUuidPath) + PATH_SEPARATOR);
update.setString(2, componentUuid);
return true;
diff --git a/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjectsTest.java b/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjectsTest.java
index 717c9d1f8ea..b109bd8c8af 100644
--- a/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjectsTest.java
+++ b/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateUuidPathColumnOnProjectsTest.java
@@ -117,6 +117,19 @@ public class PopulateUuidPathColumnOnProjectsTest {
verifyNoNullPath();
}
+ @Test
+ public void ignore_snapshots_with_invalid_snapshots_in_path() throws SQLException {
+ insert(QUALIFIER_PROJECT, A_PROJECT_UUID, A_PROJECT_UUID, new Snapshot(1L, "", true));
+ // the ID 999999 is unknown in the path
+ insert(QUALIFIER_DIR, A_DIR_UUID, A_PROJECT_UUID, new Snapshot(2L, "1.999999.", true));
+
+ underTest.execute();
+
+ verifyPath(A_PROJECT_UUID, ".");
+ // path of orphans is the path to project only
+ verifyPath(A_DIR_UUID, format(".%s.", A_PROJECT_UUID));
+ }
+
private void insert(String qualifier, String uuid, String rootUuid, Snapshot... snapshots) {
db.executeInsert(
TABLE_PROJECTS,
@@ -144,11 +157,6 @@ public class PopulateUuidPathColumnOnProjectsTest {
assertThat(row.get("UUID_PATH")).isEqualTo(expectedUuidPath);
}
- private void verifyProjectUuid(String componentUuid, String expectedProjectUuid) {
- Map<String, Object> row = db.selectFirst("select project_uuid from projects where uuid='" + componentUuid + "'");
- assertThat(row.get("PROJECT_UUID")).isEqualTo(expectedProjectUuid);
- }
-
private void verifyNoNullPath() {
assertThat(db.select("select * from projects where uuid_path is null or uuid_path = ''")).isEmpty();
}