From 36e64ac93aac4e8c4616fe37a6464ce0d69d4f8b Mon Sep 17 00:00:00 2001 From: Xin Sun Date: Thu, 20 Jul 2017 16:59:58 -0700 Subject: [PATCH] Add query methods to project API Change-Id: I53f3b8611ea9c51c5325e80c17c123eea26b985e --- .../extensions/api/projects/Projects.java | 78 +++++++++++++++++++ .../server/api/projects/ProjectsImpl.java | 37 ++++++++- 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java index e4a659ce28..02cce3a88f 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java @@ -58,6 +58,24 @@ public interface Projects { ListRequest list(); + /** + * Query projects. + * + *

Example code: {@code query().withQuery("name:project").get()} + * + * @return API for setting parameters and getting result. + */ + QueryRequest query(); + + /** + * Query projects. + * + *

Shortcut API for {@code query().withQuery(String)}. + * + * @see #query() + */ + QueryRequest query(String query); + abstract class ListRequest { public enum FilterType { CODE, @@ -171,6 +189,56 @@ public interface Projects { } } + /** + * API for setting parameters and getting result. Used for {@code query()}. + * + * @see #query() + */ + abstract class QueryRequest { + private String query; + private int limit; + private int start; + + /** Execute query and returns the matched projects as list. */ + public abstract List get() throws RestApiException; + + /** + * Set query. + * + * @param query needs to be in human-readable form. + */ + public QueryRequest withQuery(String query) { + this.query = query; + return this; + } + + /** + * Set limit for returned list of projects. Optional; server-default is used when not provided. + */ + public QueryRequest withLimit(int limit) { + this.limit = limit; + return this; + } + + /** Set number of projects to skip. Optional; no projects are skipped when not provided. */ + public QueryRequest withStart(int start) { + this.start = start; + return this; + } + + public String getQuery() { + return query; + } + + public int getLimit() { + return limit; + } + + public int getStart() { + return start; + } + } + /** * A default implementation which allows source compatibility when adding new methods to the * interface. @@ -195,5 +263,15 @@ public interface Projects { public ListRequest list() { throw new NotImplementedException(); } + + @Override + public QueryRequest query() { + throw new NotImplementedException(); + } + + @Override + public QueryRequest query(String query) { + throw new NotImplementedException(); + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java index 702a7e92ee..9490075795 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java @@ -22,14 +22,18 @@ import com.google.gerrit.extensions.api.projects.Projects; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.project.ListProjects; import com.google.gerrit.server.project.ListProjects.FilterType; import com.google.gerrit.server.project.ProjectsCollection; +import com.google.gerrit.server.project.QueryProjects; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import java.util.List; import java.util.SortedMap; @Singleton @@ -37,15 +41,18 @@ class ProjectsImpl implements Projects { private final ProjectsCollection projects; private final ProjectApiImpl.Factory api; private final Provider listProvider; + private final Provider queryProvider; @Inject ProjectsImpl( ProjectsCollection projects, ProjectApiImpl.Factory api, - Provider listProvider) { + Provider listProvider, + Provider queryProvider) { this.projects = projects; this.api = api; this.listProvider = listProvider; + this.queryProvider = queryProvider; } @Override @@ -124,4 +131,32 @@ class ProjectsImpl implements Projects { return lp.apply(); } + + @Override + public QueryRequest query() { + return new QueryRequest() { + @Override + public List get() throws RestApiException { + return ProjectsImpl.this.query(this); + } + }; + } + + @Override + public QueryRequest query(String query) { + return query().withQuery(query); + } + + private List query(QueryRequest r) throws RestApiException { + try { + QueryProjects myQueryProjects = queryProvider.get(); + myQueryProjects.setQuery(r.getQuery()); + myQueryProjects.setLimit(r.getLimit()); + myQueryProjects.setStart(r.getStart()); + + return myQueryProjects.apply(TopLevelResource.INSTANCE); + } catch (OrmException e) { + throw new RestApiException("Cannot query projects", e); + } + } }