Add extension points for adding download schemes and commands

Implementing the new extension points doesn't have any effect yet.
This is also why they are not yet documented. The documentation will
be added later once Gerrit makes use of them.

Change-Id: I30f46a1a4188d31a0aa825ad64cd794253932053
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java
new file mode 100644
index 0000000..83f3fc4
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java
@@ -0,0 +1,33 @@
+// 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.config;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public abstract class DownloadCommand {
+  /**
+   * Returns the download command for the given download scheme, project and
+   * ref.
+   *
+   * @param scheme the download scheme for which the command should be returned
+   * @param project the name of the project for which the download command
+   *        should be returned
+   * @param ref the change ref
+   * @return the download command
+   */
+  public abstract String getCommand(DownloadScheme scheme, String project,
+      String ref);
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java
new file mode 100644
index 0000000..1a9e754
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java
@@ -0,0 +1,34 @@
+// 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.config;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public abstract class DownloadScheme {
+  /**
+   * Returns the URL of this download scheme.
+   *
+   * @param project the name of the project for which the URL should be returned
+   * @return URL of the download scheme
+   */
+  public abstract String getUrl(String project);
+
+  /** @return whether this scheme requires authentication */
+  public abstract boolean isAuthRequired();
+
+  /** @return whether the download scheme is enabled */
+  public abstract boolean isEnabled();
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
index ca20868..6a90165 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -20,6 +20,8 @@
 import com.google.gerrit.audit.AuditModule;
 import com.google.gerrit.common.ChangeListener;
 import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.events.NewProjectCreatedListener;
@@ -241,6 +243,8 @@
     DynamicItem.itemOf(binder(), AvatarProvider.class);
     DynamicSet.setOf(binder(), LifecycleListener.class);
     DynamicSet.setOf(binder(), TopMenu.class);
+    DynamicMap.mapOf(binder(), DownloadScheme.class);
+    DynamicMap.mapOf(binder(), DownloadCommand.class);
 
     bind(AnonymousUser.class);