Add query methods to project API

Change-Id: I53f3b8611ea9c51c5325e80c17c123eea26b985e
This commit is contained in:
Xin Sun
2017-07-20 16:59:58 -07:00
parent d8dd1532c8
commit 36e64ac93a
2 changed files with 114 additions and 1 deletions

View File

@@ -58,6 +58,24 @@ public interface Projects {
ListRequest list();
/**
* Query projects.
*
* <p>Example code: {@code query().withQuery("name:project").get()}
*
* @return API for setting parameters and getting result.
*/
QueryRequest query();
/**
* Query projects.
*
* <p>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<ProjectInfo> 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();
}
}
}

View File

@@ -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<ListProjects> listProvider;
private final Provider<QueryProjects> queryProvider;
@Inject
ProjectsImpl(
ProjectsCollection projects,
ProjectApiImpl.Factory api,
Provider<ListProjects> listProvider) {
Provider<ListProjects> listProvider,
Provider<QueryProjects> 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<ProjectInfo> get() throws RestApiException {
return ProjectsImpl.this.query(this);
}
};
}
@Override
public QueryRequest query(String query) {
return query().withQuery(query);
}
private List<ProjectInfo> 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);
}
}
}