Add REST endpoint to set the plugin configuration

Change-Id: Iee58d8fa7ac1502ae73598ff2ed6e2e29a50d909
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
index a329195..3ce1f0b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/Module.java
@@ -36,6 +36,7 @@
         bind(ImagesCollection.class);
         child(PROJECT_KIND, "images").to(ImagesCollection.class);
         get(CONFIG_KIND, "config").to(GetConfig.class);
+        put(CONFIG_KIND, "config").to(PutConfig.class);
       }
     });
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java
new file mode 100644
index 0000000..38964e4
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutConfig.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 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.imagare;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.CapabilityScope;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+
+import com.googlesource.gerrit.plugins.imagare.PutConfig.Input;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+import java.io.IOException;
+
+@RequiresCapability(value = GlobalCapability.ADMINISTRATE_SERVER, scope = CapabilityScope.CORE)
+public class PutConfig implements RestModifyView<ConfigResource, Input>{
+  public static class Input {
+    public String defaultProject;
+  }
+
+  private final PluginConfigFactory cfgFactory;
+  private final SitePaths sitePaths;
+  private final String pluginName;
+
+  @Inject
+  PutConfig(PluginConfigFactory cfgFactory, SitePaths sitePaths,
+      @PluginName String pluginName) throws IOException, ConfigInvalidException {
+    this.cfgFactory = cfgFactory;
+    this.sitePaths = sitePaths;
+    this.pluginName = pluginName;
+  }
+
+  @Override
+  public Response<String> apply(ConfigResource rsrc, Input input)
+      throws IOException, ConfigInvalidException {
+    if (input == null) {
+      input = new Input();
+    }
+    FileBasedConfig cfg =
+        new FileBasedConfig(sitePaths.gerrit_config, FS.DETECTED);
+    cfg.load();
+    if (input.defaultProject != null) {
+      cfg.setString("plugin", pluginName, "defaultProject",
+          Strings.emptyToNull(input.defaultProject));
+    }
+    cfg.save();
+    cfgFactory.getFromGerritConfig(pluginName, true);
+    return Response.<String> ok("OK");
+  }
+}
diff --git a/src/main/resources/Documentation/rest-api-config.md b/src/main/resources/Documentation/rest-api-config.md
index 4fd8bfb..daf8464 100644
--- a/src/main/resources/Documentation/rest-api-config.md
+++ b/src/main/resources/Documentation/rest-api-config.md
@@ -37,6 +37,26 @@
   }
 ```
 
+### <a id="put-config"> Put Config
+_PUT /config/server/@PLUGIN@~config_
+
+Sets the configuration of the @PLUGIN@ plugin.
+
+The new configuration must be specified as a [ConfigInfo](#config-info)
+entity in the request body. Not setting a parameter leaves the
+parameter unchanged.
+
+#### Request
+
+```
+  PUT /config/server/@PLUGIN@~config HTTP/1.0
+  Content-Type: application/json;charset=UTF-8
+
+  {
+    "default_project": "All-Images"
+  }
+```
+
 <a id="json-entities">JSON Entities
 -----------------------------------