Add support for plugin-owned capabilities

Plugin contributed SSH commands and UiActions can now be annotated
with plugin-owned capabilities.

Capability scope was introduced to differentiate between plugin-owned
capabilities and core capabilities. Per default the scope of
@RequiresCapability annotation is CapabilityScope.CONTEXT, i. e. when
@RequiresCapability is used within a plugin the scope of the capability is
assumed to be that plugin. If @RequiresCapability is used within the core
Gerrit Code Review server (and thus is outside of a plugin) the scope is the
core server and will use the GlobalCapability known to Gerrit Code Review
server.

If a plugin needs to use a core capability name (e.g. "administrateServer")
this can be specified by setting scope = CapabilityScope.CORE:

  @RequiresCapability(value="administrateServer", scope=CapabilityScope.CORE)

Change-Id: I82f7a6fef2a47613a1fd9c7474ff568db3ca84a2
This commit is contained in:
David Ostrovsky
2013-06-15 14:46:23 +02:00
parent 362963311e
commit 7066cc064e
13 changed files with 339 additions and 46 deletions

View File

@@ -0,0 +1,36 @@
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.annotations;
/** Declared scope of a capability named by {@link RequiresCapability}. */
public enum CapabilityScope {
/**
* Scope is assumed based on the context.
*
* When {@code @RequiresCapability} is used within a plugin the scope of the
* capability is assumed to be that plugin.
*
* If {@code @RequiresCapability} is used within the core Gerrit Code Review
* server (and thus is outside of a plugin) the scope is the core server and
* will use {@link com.google.gerrit.common.data.GlobalCapability}.
*/
CONTEXT,
/** Scope is only the plugin. */
PLUGIN,
/** Scope is the core server. */
CORE;
}

View File

@@ -27,5 +27,9 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RUNTIME)
public @interface RequiresCapability {
/** Name of the capability required to invoke this action. */
String value();
/** Scope of the named capability. */
CapabilityScope scope() default CapabilityScope.CONTEXT;
}