Merge "ListProjects: print projects list using secondary index" into stable-2.16
diff --git a/java/com/google/gerrit/server/restapi/project/ListProjects.java b/java/com/google/gerrit/server/restapi/project/ListProjects.java
index 4357702..f145314 100644
--- a/java/com/google/gerrit/server/restapi/project/ListProjects.java
+++ b/java/com/google/gerrit/server/restapi/project/ListProjects.java
@@ -313,7 +313,7 @@
throws BadRequestException, PermissionBackendException {
if (format == OutputFormat.TEXT) {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
- display(buf);
+ displayToStream(buf);
return BinaryResult.create(buf.toByteArray())
.setContentType("text/plain")
.setCharacterEncoding(UTF_8);
@@ -340,6 +340,7 @@
&& isNullOrEmpty(matchSubstring) // TODO: see Issue 10446
&& type == FilterType.ALL
&& showBranch.isEmpty()
+ && !showTree
? Optional.of(stateToQuery())
: Optional.empty();
}
@@ -379,7 +380,47 @@
return p;
}
- public SortedMap<String, ProjectInfo> display(@Nullable OutputStream displayOutputStream)
+ private void printQueryResults(String query, PrintWriter out) throws BadRequestException {
+ try {
+ if (format.isJson()) {
+ format.newGson().toJson(applyAsQuery(query), out);
+ } else {
+ newProjectsNamesStream(query).forEach(out::println);
+ }
+ out.flush();
+ } catch (OrmException | MethodNotAllowedException e) {
+ logger.atWarning().withCause(e).log(
+ "Internal error while processing the query '{}' request", query);
+ throw new BadRequestException("Internal error while processing the query request");
+ }
+ }
+
+ private Stream<String> newProjectsNamesStream(String query)
+ throws OrmException, MethodNotAllowedException, BadRequestException {
+ Stream<String> projects =
+ queryProjectsProvider.get().withQuery(query).apply().stream().map(p -> p.name).skip(start);
+ if (limit > 0) {
+ projects = projects.limit(limit);
+ }
+
+ return projects;
+ }
+
+ public void displayToStream(OutputStream displayOutputStream)
+ throws BadRequestException, PermissionBackendException {
+ PrintWriter stdout =
+ new PrintWriter(new BufferedWriter(new OutputStreamWriter(displayOutputStream, UTF_8)));
+ Optional<String> projectsQuery = expressAsProjectsQuery();
+
+ if (projectsQuery.isPresent()) {
+ printQueryResults(projectsQuery.get(), stdout);
+ } else {
+ display(stdout);
+ }
+ }
+
+ @Nullable
+ public SortedMap<String, ProjectInfo> display(@Nullable PrintWriter stdout)
throws BadRequestException, PermissionBackendException {
if (all && state != null) {
throw new BadRequestException("'all' and 'state' may not be used together");
@@ -394,12 +435,6 @@
}
}
- PrintWriter stdout = null;
- if (displayOutputStream != null) {
- stdout =
- new PrintWriter(new BufferedWriter(new OutputStreamWriter(displayOutputStream, UTF_8)));
- }
-
if (type == FilterType.PARENT_CANDIDATES) {
// Historically, PARENT_CANDIDATES implied showDescription.
showDescription = true;
diff --git a/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
index d04e2d3..9f2ffa9 100644
--- a/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
+++ b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
@@ -41,6 +41,6 @@
throw die("--tree and --description options are not compatible.");
}
}
- impl.display(out);
+ impl.displayToStream(out);
}
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
index 7b24019..b996abe 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -126,7 +126,7 @@
try (ByteArrayOutputStream displayOut = new ByteArrayOutputStream()) {
listProjects.setStart(numInitialProjects);
- listProjects.display(displayOut);
+ listProjects.displayToStream(displayOut);
List<String> lines =
Splitter.on("\n").omitEmptyStrings().splitToList(new String(displayOut.toByteArray()));
@@ -156,7 +156,7 @@
listProjects.setStart(numInitialProjects);
listProjects.setFormat(jsonFormat);
- listProjects.display(displayOut);
+ listProjects.displayToStream(displayOut);
String projectsJsonOutput = new String(displayOut.toByteArray());