Expose getter to return values stored in the SharedRefDB
Feature: Issue 12251
Change-Id: Ic997c13f75c0bf30f25a5082b8fecee86186414e
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabase.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabase.java
index c2e222b..4217751 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabase.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabase.java
@@ -15,6 +15,7 @@
package com.gerritforge.gerrit.globalrefdb;
import com.google.gerrit.reviewdb.client.Project;
+import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
@@ -81,4 +82,14 @@
* @throws GlobalRefDbSystemError project cannot be removed due to a system error.
*/
void remove(Project.NameKey project) throws GlobalRefDbSystemError;
+
+ /**
+ * Return value for a specific project and ref name
+ *
+ * @param project project name
+ * @param refName reference name
+ * @return {@link java.util.Optional} of the value
+ * @throws GlobalRefDbSystemError value cannot be returned due to a system error.
+ */
+ <T> Optional<T> get(Project.NameKey project, String refName) throws GlobalRefDbSystemError;
}
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/FakeGlobalRefDatabase.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/FakeGlobalRefDatabase.java
index 498cd76..d96f532 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/FakeGlobalRefDatabase.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/FakeGlobalRefDatabase.java
@@ -16,6 +16,7 @@
import com.google.common.collect.MapMaker;
import com.google.gerrit.reviewdb.client.Project;
+import java.util.Optional;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
@@ -86,6 +87,14 @@
keyValueStore.remove(project);
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> Optional<T> get(Project.NameKey project, String refName)
+ throws GlobalRefDbSystemError {
+ return Optional.ofNullable((T) projectRefDb(project).get(refName))
+ .map(v -> ((AtomicReference<T>) v).get());
+ }
+
private ConcurrentMap<String, AtomicReference<ObjectId>> projectRefDb(Project.NameKey project) {
ConcurrentMap<String, AtomicReference<ObjectId>> projectRefDb = keyValueStore.get(project);
if (projectRefDb == null) {
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabaseTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabaseTest.java
index b1bad65..9e2ee81 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabaseTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/GlobalRefDatabaseTest.java
@@ -18,6 +18,7 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.reviewdb.client.RefNames;
+import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.eclipse.jgit.lib.ObjectId;
@@ -152,6 +153,20 @@
}
}
+ @Test
+ public void shouldReturnValueInTheGlobalRefDB() {
+ objectUnderTest.compareAndPut(project, initialRef, objectId1);
+ Optional<ObjectId> o = objectUnderTest.get(project, initialRef.getName());
+ assertThat(o.isPresent()).isTrue();
+ assertThat(o.get()).isEqualTo(objectId1);
+ }
+
+ @Test
+ public void shouldReturnEmptyIfValueIsNotInTheGlobalRefDB() {
+ Optional<ObjectId> o = objectUnderTest.get(project, "nonExistentRef");
+ assertThat(o.isPresent()).isFalse();
+ }
+
private Ref ref(String refName, ObjectId objectId) {
return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
}