Support inheritance for project specific download commands

Change-Id: Ib87fb241364af665b1ce0a8a012da58ad1de1656
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
index 913d5ee..15052a1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
@@ -135,7 +135,7 @@
     if (dc != null) {
       dc.add(p, command);
     } else {
-      dc = new ProjectDownloadCommand(p, command);
+      dc = new ProjectDownloadCommand(projectCache, p, command);
       projectDownloadCommands.put(name, dc);
       registrationHandles.put(name,
           map().put(pluginName, name.replaceAll("-", " "), provider(dc)));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
index f3a5ee5..be3246a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
@@ -14,23 +14,29 @@
 
 package com.googlesource.gerrit.plugins.download.command.project;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
 import com.google.gerrit.extensions.config.DownloadCommand;
 import com.google.gerrit.extensions.config.DownloadScheme;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
 
 import java.util.Map;
 
 public class ProjectDownloadCommand extends DownloadCommand {
+  private final ProjectCache projectCache;
   private final Map<Project.NameKey, String> commands;
 
-  ProjectDownloadCommand(Project.NameKey project, String command) {
+  ProjectDownloadCommand(ProjectCache projectCache, Project.NameKey project,
+      String command) {
+    this.projectCache = projectCache;
     this.commands = Maps.newHashMap();
     add(project, command);
   }
 
   public void add(Project.NameKey project, String command) {
-    commands.put(project, command);
+    commands.put(project, Strings.nullToEmpty(command));
   }
 
   public void remove(Project.NameKey project) {
@@ -43,12 +49,24 @@
 
   @Override
   public String getCommand(DownloadScheme scheme, String project, String ref) {
-    String command = commands.get(new Project.NameKey(project));
+    Project.NameKey projectName = new Project.NameKey(project);
+    String command = commands.get(projectName);
+    if (command == null) {
+      ProjectState projectState = projectCache.get(projectName);
+      if (projectState != null) {
+        for (ProjectState parent : projectState.parents()) {
+          command = commands.get(parent.getProject().getNameKey());
+          if (command != null) {
+            break;
+          }
+        }
+      }
+    }
     if (command != null) {
       command = command.replaceAll("\\$\\{ref\\}", ref)
           .replaceAll("\\$\\{url\\}", scheme.getUrl(project))
           .replaceAll("\\$\\{project\\}", project);
     }
-    return command;
+    return Strings.emptyToNull(command);
   }
 }
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index b85a370..aefc166 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -1 +1,5 @@
 This plugin adds support for project specific download commands.
+
+Project specific download commands that are defined on a parent project
+are inherited by the child projects. Child projects can overwrite the
+inherited download command or remove it by assigning no value to it.