diff --git a/java/com/google/gerrit/acceptance/ExtensionRegistry.java b/java/com/google/gerrit/acceptance/ExtensionRegistry.java index 2371bd0c4f..a76c1cea38 100644 --- a/java/com/google/gerrit/acceptance/ExtensionRegistry.java +++ b/java/com/google/gerrit/acceptance/ExtensionRegistry.java @@ -15,6 +15,7 @@ package com.google.gerrit.acceptance; import com.google.gerrit.extensions.api.changes.ActionVisitor; +import com.google.gerrit.extensions.config.CapabilityDefinition; import com.google.gerrit.extensions.config.DownloadScheme; import com.google.gerrit.extensions.events.AccountIndexedListener; import com.google.gerrit.extensions.events.ChangeIndexedListener; @@ -47,6 +48,8 @@ import java.util.ArrayList; import java.util.List; public class ExtensionRegistry { + public static final String PLUGIN_NAME = "myPlugin"; + private final DynamicSet accountIndexedListeners; private final DynamicSet changeIndexedListeners; private final DynamicSet groupIndexedListeners; @@ -71,6 +74,7 @@ public class ExtensionRegistry { accountActivationValidationListeners; private final DynamicSet onSubmitValidationListeners; private final DynamicSet workInProgressStateChangedListeners; + private final DynamicMap capabilityDefinitions; @Inject ExtensionRegistry( @@ -96,7 +100,8 @@ public class ExtensionRegistry { DynamicSet groupBackends, DynamicSet accountActivationValidationListeners, DynamicSet onSubmitValidationListeners, - DynamicSet workInProgressStateChangedListeners) { + DynamicSet workInProgressStateChangedListeners, + DynamicMap capabilityDefinitions) { this.accountIndexedListeners = accountIndexedListeners; this.changeIndexedListeners = changeIndexedListeners; this.groupIndexedListeners = groupIndexedListeners; @@ -120,6 +125,7 @@ public class ExtensionRegistry { this.accountActivationValidationListeners = accountActivationValidationListeners; this.onSubmitValidationListeners = onSubmitValidationListeners; this.workInProgressStateChangedListeners = workInProgressStateChangedListeners; + this.capabilityDefinitions = capabilityDefinitions; } public Registration newRegistration() { @@ -227,6 +233,10 @@ public class ExtensionRegistry { return add(workInProgressStateChangedListeners, workInProgressStateChangedListener); } + public Registration add(CapabilityDefinition capabilityDefinition, String exportName) { + return add(capabilityDefinitions, capabilityDefinition, exportName); + } + private Registration add(DynamicSet dynamicSet, T extension) { return add(dynamicSet, extension, "gerrit"); } @@ -240,7 +250,7 @@ public class ExtensionRegistry { private Registration add(DynamicMap dynamicMap, T extension, String exportName) { RegistrationHandle registrationHandle = ((PrivateInternals_DynamicMapImpl) dynamicMap) - .put("myPlugin", exportName, Providers.of(extension)); + .put(PLUGIN_NAME, exportName, Providers.of(extension)); registrationHandles.add(registrationHandle); return this; } diff --git a/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java b/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java index 08c20ec268..ab712bff9d 100644 --- a/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java +++ b/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java @@ -44,6 +44,7 @@ import com.google.gerrit.extensions.client.ChangeStatus; import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.GroupInfo; import com.google.gerrit.extensions.common.WebLinkInfo; +import com.google.gerrit.extensions.config.CapabilityDefinition; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; @@ -455,6 +456,41 @@ public class AccessIT extends AbstractDaemonTest { .containsAtLeastElementsIn(accessSectionInfo.permissions.keySet()); } + @Test + public void addPluginGlobalCapability() throws Exception { + try (Registration registration = + extensionRegistry + .newRegistration() + .add( + new CapabilityDefinition() { + @Override + public String getDescription() { + return "A Plugin Global Capability"; + } + }, + "fooCapability")) { + ProjectAccessInput accessInput = newProjectAccessInput(); + AccessSectionInfo accessSectionInfo = newAccessSectionInfo(); + + PermissionInfo foo = newPermissionInfo(); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false); + foo.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); + accessSectionInfo.permissions.put(ExtensionRegistry.PLUGIN_NAME + "-fooCapability", foo); + + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); + + ProjectAccessInfo updatedAccessSectionInfo = + gApi.projects().name(allProjects.get()).access(accessInput); + assertThat( + updatedAccessSectionInfo + .local + .get(AccessSection.GLOBAL_CAPABILITIES) + .permissions + .keySet()) + .containsAtLeastElementsIn(accessSectionInfo.permissions.keySet()); + } + } + @Test public void addPermissionAsGlobalCapability() throws Exception { ProjectAccessInput accessInput = newProjectAccessInput();