Migrate Changes#query and Projects#list to a more fluent interface

This syntax allows more compact userland code.
Thanks to Dave Borowitz for this suggestion.

Example:
  changes.query("is:open")
    .withLimit(5)
    .get();

Change-Id: I676e58c5d50c5599908df19f9384cc1e6d2aed8e
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
index ecf0d9e..201a0bd 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
@@ -30,49 +30,43 @@
       throws RestApiException;
   ChangeApi create(ChangeInfo in) throws RestApiException;
 
-  /**
-   * Shorthand for {@link #query(QueryParameter)} without any conditions (i.e. lists all changes).
-   */
-  List<ChangeInfo> query() throws RestApiException;
-  List<ChangeInfo> query(QueryParameter queryParameter) throws RestApiException;
+  QueryRequest query();
+  QueryRequest query(String query);
 
-  public class QueryParameter {
+  public abstract class QueryRequest {
     private String query;
     private int limit;
     private int start;
     private EnumSet<ListChangesOption> options = EnumSet.noneOf(ListChangesOption.class);
 
-    public QueryParameter() {}
+    public abstract List<ChangeInfo> get() throws RestApiException;
 
-    public QueryParameter(String query) {
-      this.query = query;
-    }
-
-    public QueryParameter withQuery(String query) {
+    public QueryRequest withQuery(String query) {
       this.query = query;
       return this;
     }
 
-    public QueryParameter withLimit(int limit) {
+    public QueryRequest withLimit(int limit) {
       this.limit = limit;
       return this;
     }
 
-    public QueryParameter withStart(int start) {
+    public QueryRequest withStart(int start) {
       this.start = start;
       return this;
     }
 
-    public QueryParameter withOption(ListChangesOption options) {
+    public QueryRequest withOption(ListChangesOption options) {
       this.options.add(options);
       return this;
     }
-    public QueryParameter withOptions(ListChangesOption... options) {
+
+    public QueryRequest withOptions(ListChangesOption... options) {
       this.options.addAll(Arrays.asList(options));
       return this;
     }
 
-    public QueryParameter withOptions(EnumSet<ListChangesOption> options) {
+    public QueryRequest withOptions(EnumSet<ListChangesOption> options) {
       this.options = options;
       return this;
     }
@@ -120,12 +114,12 @@
     }
 
     @Override
-    public List<ChangeInfo> query() throws RestApiException {
+    public QueryRequest query() {
       throw new NotImplementedException();
     }
 
     @Override
-    public List<ChangeInfo> query(QueryParameter queryParameter) throws RestApiException {
+    public QueryRequest query(String query) {
       throw new NotImplementedException();
     }
   }
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 02351cd..9c0cfd8 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
@@ -23,37 +23,32 @@
 public interface Projects {
   ProjectApi name(String name) throws RestApiException;
 
-  List<ProjectInfo> list() throws RestApiException;
-  List<ProjectInfo> list(ListParameter listParameter) throws RestApiException;
+  ListRequest list();
 
-  public class ListParameter {
+  public abstract class ListRequest {
     private boolean description;
     private String prefix;
     private int limit;
     private int start;
 
-    public ListParameter() {}
+    public abstract List<ProjectInfo> get() throws RestApiException;
 
-    public ListParameter(String prefix) {
-      this.prefix = prefix;
-    }
-
-    public ListParameter withDescription(boolean description) {
+    public ListRequest withDescription(boolean description) {
       this.description = description;
       return this;
     }
 
-    public ListParameter withPrefix(String prefix) {
+    public ListRequest withPrefix(String prefix) {
       this.prefix = prefix;
       return this;
     }
 
-    public ListParameter withLimit(int limit) {
+    public ListRequest withLimit(int limit) {
       this.limit = limit;
       return this;
     }
 
-    public ListParameter withStart(int start) {
+    public ListRequest withStart(int start) {
       this.start = start;
       return this;
     }
@@ -86,12 +81,7 @@
     }
 
     @Override
-    public List<ProjectInfo> list() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ProjectInfo> list(ListParameter listParameter) throws RestApiException {
+    public ListRequest list() {
       throw new NotImplementedException();
     }
   }