Add configuration to disable granting project ownership

Change-Id: I658c752a6786c08103195da3cadbbbeb186d6fa8
diff --git a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
index 1b38573..3a8f982 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
@@ -77,9 +77,12 @@
       "Project name must start with parent project name, e.g. %s."
           + SEE_DOCUMENTATION_MSG;
 
-  /* package */ static final String DELEGATE_PROJECT_CREATION_TO =
+  static final String DELEGATE_PROJECT_CREATION_TO =
       "delegateProjectCreationTo";
 
+  static final String DISABLE_GRANTING_PROJECT_OWNERSHIP =
+      "disableGrantingProjectOwnership";
+
   private final CreateGroup.Factory createGroupFactory;
   private final String documentationUrl;
   private final AllProjectsNameProvider allProjectsName;
@@ -122,11 +125,25 @@
 
     // If we reached that point, it means we allow project creation. Make the
     // user an owner if not already by inheritance.
-    if (!parentCtrl.isOwner()) {
+    if (!parentCtrl.isOwner() && !configDisableGrantingOwnership(parentCtrl)) {
       args.ownerIds.add(createGroup(name + "-admins"));
     }
   }
 
+  private boolean configDisableGrantingOwnership(ProjectControl parentCtrl)
+      throws ValidationException {
+    try {
+      return cfg
+          .getFromProjectConfigWithInheritance(
+              parentCtrl.getProject().getNameKey(), pluginName)
+          .getBoolean(DISABLE_GRANTING_PROJECT_OWNERSHIP, false);
+    } catch (NoSuchProjectException e) {
+      log.error("Failed to check project config for "
+          + parentCtrl.getProject().getName() + ": " + e.getMessage(), e);
+      throw new ValidationException(AN_ERROR_OCCURRED_MSG);
+    }
+  }
+
   private AccountGroup.UUID createGroup(String name)
       throws ValidationException {
     try {
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index ee094c5..a967a52 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -80,3 +80,14 @@
 	```
 - Click `Publish` button, review, vote and submit the change to apply new
 configuration
+
+Ownership of a project created by delegated user is given automatically to that
+user by adding him to a group named `<root-project-name>-admins`. It is
+possible to disable granting the ownership by configuring
+`disableGrantingProjectOwnership` in the `project.config` of
+`refs/meta/config` branch of the parent project:
+
+```
+[plugin "@PLUGIN@"]
+disableGrantingProjectOwnership = true
+```
diff --git a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
index e76f94b..23f0bea 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
@@ -275,6 +275,37 @@
   }
 
   @Test
+  public void shouldNotMakeUserOwnerIfNotAlreadyOwnerByInheritanceAndGrantingIsDisabled()
+      throws Exception {
+    String parent = name("parentProject");
+    ProjectInput in = new ProjectInput();
+    in.permissionsOnly = true;
+    adminRestSession.put("/projects/" + parent, in).assertCreated();
+
+    String delegatingGroup = name("someGroup");
+    GroupApi dGroup = gApi.groups().create(delegatingGroup);
+    dGroup.addMembers(user.username);
+    Project.NameKey parentNameKey = new Project.NameKey(parent);
+    ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
+    String gId = gApi.groups().id(delegatingGroup).get().id;
+    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
+        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig(PLUGIN_NAME).setBoolean(
+        ProjectCreationValidator.DISABLE_GRANTING_PROJECT_OWNERSHIP, true);
+    saveProjectConfig(parentNameKey, cfg);
+
+    in = new ProjectInput();
+    in.parent = parent;
+    String childProject = parent + "/childProject";
+    userRestSession.put("/projects/" + Url.encode(childProject), in)
+        .assertCreated();
+    ProjectState projectState =
+        projectCache.get(new Project.NameKey(childProject));
+    assertThat(projectState.getOwners().size()).isEqualTo(0);
+  }
+
+  @Test
   public void shouldBlockCreationIfGroupRefIsNotUsed() throws Exception {
     String ownerGroup = name("groupA");
     gApi.groups().create(ownerGroup);