REST API to retrieve Project’s replication status
Expose a new REST API to return the list of replication statuses
associated to a project.
GET /projects/myproject/replication
returns a JSON Array of replication events as they are returned
by Gerrit stream events.
Change-Id: I7d601191f0a66352e41c621e2ef2f869e249fb24
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
index f6f4c71..0521cef 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GuiceModule.java
@@ -16,8 +16,10 @@
import com.google.gerrit.common.EventListener;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestApiModule;
import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.project.ProjectResource;
import com.google.gson.Gson;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
@@ -31,8 +33,9 @@
import com.googlesource.gerrit.plugins.github.oauth.IdentifiedUserGitHubLoginProvider;
import com.googlesource.gerrit.plugins.github.oauth.UserScopedProvider;
import com.googlesource.gerrit.plugins.github.replication.GerritGsonProvider;
-import com.googlesource.gerrit.plugins.github.replication.ReplicationStatusListener;
+import com.googlesource.gerrit.plugins.github.replication.ListProjectReplicationStatus;
import com.googlesource.gerrit.plugins.github.replication.ReplicationStatusFlatFile;
+import com.googlesource.gerrit.plugins.github.replication.ReplicationStatusListener;
import com.googlesource.gerrit.plugins.github.replication.ReplicationStatusStore;
public class GuiceModule extends AbstractModule {
@@ -52,6 +55,14 @@
install(new FactoryModuleBuilder()
.build(GitHubGroupMembership.Factory.class));
+ install(new RestApiModule() {
+ @Override
+ protected void configure() {
+ get(ProjectResource.PROJECT_KIND, "replication").to(
+ ListProjectReplicationStatus.class);
+ }
+ });
+
bind(ReplicationStatusStore.class).to(ReplicationStatusFlatFile.class)
.in(Scopes.SINGLETON);
bind(Gson.class).toProvider(GerritGsonProvider.class);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ListProjectReplicationStatus.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ListProjectReplicationStatus.java
new file mode 100644
index 0000000..868ac5b
--- /dev/null
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ListProjectReplicationStatus.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.github.replication;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+
+public class ListProjectReplicationStatus implements RestReadView<ProjectResource> {
+ private final ReplicationStatusStore statusStore;
+
+ @Inject
+ public ListProjectReplicationStatus(ReplicationStatusStore statusStore) {
+ this.statusStore = statusStore;
+ }
+
+ @Override
+ public Object apply(ProjectResource resource) throws AuthException,
+ BadRequestException, ResourceConflictException, Exception {
+ return statusStore.list(resource.getNameKey());
+ }
+}
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusFlatFile.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusFlatFile.java
index 3bf0645..4d5a033 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusFlatFile.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusFlatFile.java
@@ -19,20 +19,32 @@
import static java.nio.file.StandardOpenOption.WRITE;
import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.List;
import com.google.gerrit.extensions.annotations.PluginData;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.inject.Inject;
+import com.google.inject.Provider;
public class ReplicationStatusFlatFile implements ReplicationStatusStore {
private final Path pluginData;
+ private final Gson gson;
@Inject
- public ReplicationStatusFlatFile(@PluginData Path pluginData) {
+ public ReplicationStatusFlatFile(@PluginData Path pluginData,
+ Provider<Gson> gsonProvider) {
this.pluginData = pluginData;
+ this.gson = gsonProvider.get();
}
@Override
@@ -56,4 +68,24 @@
return sanitizedKey;
}
+ @Override
+ public List<JsonObject> list(Project.NameKey parentKey) throws IOException {
+ Path projectPath = pluginData.resolve(getSanitizedKey(parentKey.get()));
+ final List<JsonObject> entries = new ArrayList<>();
+ Files.walkFileTree(projectPath, new SimpleFileVisitor<Path>() {
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
+ throws IOException {
+ try (Reader fileReader =
+ Files.newBufferedReader(file, StandardCharsets.UTF_8)) {
+ JsonObject json = gson.fromJson(fileReader, JsonObject.class);
+ entries.add(json);
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ return entries;
+ }
+
}
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusStore.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusStore.java
index 701869b..75c1872 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusStore.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/replication/ReplicationStatusStore.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.github.replication;
import java.io.IOException;
+import java.util.List;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gson.JsonObject;
@@ -23,4 +24,6 @@
public void set(Project.NameKey projectKey, String refKey,
JsonObject statusEvent) throws IOException;
+
+ public List<JsonObject> list(Project.NameKey projectKey) throws IOException;
}