Projects: Add convenience methods for creating projects

The old idiom:
  api.projects().name("foo").create(in);
more closely matches the REST API, but makes less sense in Java where
we don't necessarily require a hierarchical structure, and we can
infer the project name from the input.

The above becomes the simpler:
  api.projects().create(in);

Also include a method to create with just a name.

Change-Id: Ib789854bd22e1a15ceebf37c57382ca4079c4459
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
index 7de4712..33e4f97 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -38,8 +38,7 @@
     String name = "foo";
     assertThat(name).isEqualTo(
         gApi.projects()
-            .name(name)
-            .create()
+            .create(name)
             .get()
             .name);
   }
@@ -49,8 +48,7 @@
     String name = "foo";
     assertThat(name).isEqualTo(
         gApi.projects()
-            .name(name + ".git")
-            .create()
+            .create(name + ".git")
             .get()
             .name);
   }
@@ -69,10 +67,8 @@
     ProjectInput in = new ProjectInput();
     in.name = "baz";
     gApi.projects()
-        .name("baz")
         .create(in);
     gApi.projects()
-        .name("baz")
         .create(in);
   }
 
@@ -89,8 +85,8 @@
   public void listProjects() throws Exception {
     List<ProjectInfo> initialProjects = gApi.projects().list().get();
 
-    gApi.projects().name("foo").create();
-    gApi.projects().name("bar").create();
+    gApi.projects().create("foo");
+    gApi.projects().create("bar");
 
     List<ProjectInfo> allProjects = gApi.projects().list().get();
     assertThat(allProjects).hasSize(initialProjects.size() + 2);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index 68c9a5e..78132a9 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -49,7 +49,7 @@
   @Test
   public void testCreateProjectApi() throws Exception {
     final String newProjectName = "newProject";
-    ProjectInfo p = gApi.projects().name(newProjectName).create().get();
+    ProjectInfo p = gApi.projects().create(newProjectName).get();
     assertThat(p.name).isEqualTo(newProjectName);
     ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
     assertThat(projectState).isNotNull();
@@ -60,7 +60,7 @@
   @Test
   public void testCreateProjectApiWithGitSuffix() throws Exception {
     final String newProjectName = "newProject";
-    ProjectInfo p = gApi.projects().name(newProjectName + ".git").create().get();
+    ProjectInfo p = gApi.projects().create(newProjectName + ".git").get();
     assertThat(p.name).isEqualTo(newProjectName);
     ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
     assertThat(projectState).isNotNull();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
index c12b719..fda48f5 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -81,7 +81,7 @@
     ProjectInput projectInput = new ProjectInput();
     projectInput.name = "some-project";
     projectInput.description = "Description of some-project";
-    gApi.projects().name(projectInput.name).create(projectInput);
+    gApi.projects().create(projectInput);
 
     // description not be included in the results by default.
     Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
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 ab0d3ae..7a626f1 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
@@ -40,6 +40,24 @@
    */
   ProjectApi name(String name) throws RestApiException;
 
+  /**
+   * Create a project using the default configuration.
+   *
+   * @param name project name.
+   * @return API for accessing the newly-created project.
+   * @throws RestApiException if an error occurred.
+   */
+  ProjectApi create(String name) throws RestApiException;
+
+  /**
+   * Create a project.
+   *
+   * @param in project creation input; name must be set.
+   * @return API for accessing the newly-created project.
+   * @throws RestApiException if an error occurred.
+   */
+  ProjectApi create(ProjectInput in) throws RestApiException;
+
   ListRequest list();
 
   public abstract class ListRequest {
@@ -164,6 +182,16 @@
     }
 
     @Override
+    public ProjectApi create(ProjectInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectApi create(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
     public ListRequest list() {
       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 f8c9880..db31d42 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
@@ -15,6 +15,7 @@
 package com.google.gerrit.server.api.projects;
 
 import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
 import com.google.gerrit.extensions.api.projects.Projects;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -57,6 +58,18 @@
   }
 
   @Override
+  public ProjectApi create(String name) throws RestApiException {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    return create(in);
+  }
+
+  @Override
+  public ProjectApi create(ProjectInput in) throws RestApiException {
+    return name(in.name).create(in);
+  }
+
+  @Override
   public ListRequest list() {
     return new ListRequest() {
       @Override
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
index 4e151b3..b93eb75 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
@@ -181,7 +181,7 @@
           input.pluginConfigValues = parsePluginConfigValues(pluginConfigValues);
         }
 
-        gApi.projects().name(projectName).create(input);
+        gApi.projects().create(input);
       } else {
         List<Project.NameKey> parentCandidates =
             suggestParentCandidates.getNameKeys();