Support to enable/disable the ITS integration in the UI

On the ProjectInfoScreen there is now a dropdown list for the
plugin.<its-name>.enabled parameter which offers the values true,
false, enforced and INHERIT. Project owners can change this parameter
and save it. If the ITS integration is enforced by a parent project
the dropdown list is disabled.

Change-Id: I30c96770186d3d7c627794d42ae673181ea7688b
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
index 53d1d17..52bca59 100644
--- a/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
+++ b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
@@ -15,19 +15,24 @@
 package com.googlesource.gerrit.plugins.hooks;
 
 import com.google.gerrit.common.ChangeListener;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.server.config.FactoryModule;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.ProjectConfigEntry;
 import com.google.gerrit.server.git.validators.CommitValidationListener;
 
 import com.googlesource.gerrit.plugins.hooks.its.ItsConfig;
+import com.googlesource.gerrit.plugins.hooks.its.ItsHookEnabledConfigEntry;
 import com.googlesource.gerrit.plugins.hooks.validation.ItsValidateComment;
+import com.googlesource.gerrit.plugins.hooks.workflow.ActionController;
 import com.googlesource.gerrit.plugins.hooks.workflow.ActionRequest;
 import com.googlesource.gerrit.plugins.hooks.workflow.Condition;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterAddComment;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterAddRelatedLinkToChangeId;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterAddRelatedLinkToGitWeb;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterChangeState;
-import com.googlesource.gerrit.plugins.hooks.workflow.ActionController;
 import com.googlesource.gerrit.plugins.hooks.workflow.Property;
 import com.googlesource.gerrit.plugins.hooks.workflow.Rule;
 import com.googlesource.gerrit.plugins.hooks.workflow.action.AddComment;
@@ -37,8 +42,20 @@
 
 public class ItsHookModule extends FactoryModule {
 
+  private final String pluginName;
+  private final PluginConfigFactory pluginCfgFactory;
+
+  public ItsHookModule(@PluginName String pluginName,
+      PluginConfigFactory pluginCfgFactory) {
+    this.pluginName = pluginName;
+    this.pluginCfgFactory = pluginCfgFactory;
+  }
+
   @Override
   protected void configure() {
+    bind(ProjectConfigEntry.class)
+        .annotatedWith(Exports.named("enabled"))
+        .toInstance(new ItsHookEnabledConfigEntry(pluginName, pluginCfgFactory));
     bind(ItsConfig.class);
     DynamicSet.bind(binder(), ChangeListener.class).to(
         GerritHookFilterAddRelatedLinkToChangeId.class);
diff --git a/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsHookEnabledConfigEntry.java b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsHookEnabledConfigEntry.java
new file mode 100644
index 0000000..03b7d52
--- /dev/null
+++ b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsHookEnabledConfigEntry.java
@@ -0,0 +1,47 @@
+// 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.googlesource.gerrit.plugins.hooks.its;
+
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.project.ProjectState;
+
+import java.util.Arrays;
+
+public class ItsHookEnabledConfigEntry extends ProjectConfigEntry {
+  private final String pluginName;
+  private final PluginConfigFactory pluginCfgFactory;
+
+  public ItsHookEnabledConfigEntry(String pluginName,
+      PluginConfigFactory pluginCfgFactory) {
+    super("Enable " + pluginName + " integration", "false",
+        Arrays.asList(new String[] {"false", "true", "enforced"}), true);
+    this.pluginName = pluginName;
+    this.pluginCfgFactory = pluginCfgFactory;
+  }
+
+  @Override
+  public boolean isEditable(ProjectState project) {
+    for (ProjectState parentState : project.parents()) {
+      PluginConfig parentCfg =
+          pluginCfgFactory.getFromProjectConfig(parentState, pluginName);
+      if ("enforced".equals(parentCfg.getString("enabled"))) {
+        return false;
+      }
+    }
+    return true;
+  }
+}