Support for TopMenu GitBlit item in Gerrit.

Allows to access GitBlit main links
(repositories, activities, search) directly
from Gerrit top-menu bar.

Change-Id: Iec48cacfc897af5fdf9f67aac2d2cfcd62e6905c
diff --git a/pom.xml b/pom.xml
index 899f374..cd18d7c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,8 @@
     <Gerrit-ApiVersion>${project.version}</Gerrit-ApiVersion>
     <Gerrit-ReloadMode>restart</Gerrit-ReloadMode>
     <Gerrit-InitStep>com.googlesource.gerrit.plugins.gitblit.GitBlitInitStep</Gerrit-InitStep>
-    <Gerrit-HttpModule>com.googlesource.gerrit.plugins.gitblit.GitBlitModule</Gerrit-HttpModule>
+    <Gerrit-Module>com.googlesource.gerrit.plugins.gitblit.GitBlitModule</Gerrit-Module>
+    <Gerrit-HttpModule>com.googlesource.gerrit.plugins.gitblit.GitBlitServletModule</Gerrit-HttpModule>
   </properties>
   <dependencies>
     <dependency>
@@ -161,6 +162,7 @@
             <transformer
               implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
               <manifestEntries>
+                <Gerrit-Module>${Gerrit-Module}</Gerrit-Module>
                 <Gerrit-HttpModule>${Gerrit-HttpModule}</Gerrit-HttpModule>
                 <Gerrit-InitStep>${Gerrit-InitStep}</Gerrit-InitStep>
                 <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitModule.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitModule.java
index 0590bb3..3f4f9cf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitModule.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// 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.
@@ -13,42 +13,15 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.gitblit;
 
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.TopMenu;
+import com.google.inject.AbstractModule;
 
-import com.gitblit.IUserService;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.servlet.ServletModule;
-import com.googlesource.gerrit.plugins.gitblit.app.GerritGitBlit;
-import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
-
-public class GitBlitModule extends ServletModule {
-  private static final Logger log = LoggerFactory.getLogger(GitBlitModule.class);
-
-  @Inject
-  public GitBlitModule(@PluginName final String name,
-      @GerritServerConfig final Config gerritConfig, final SitePaths sitePaths) {
-    log.info("Create GitBlitModule with name='" + name);
-  }
+public class GitBlitModule extends AbstractModule {
 
   @Override
-  protected void configureServlets() {
-    log.info("Configuring servlet and filters");
-    bind(IUserService.class).to(GerritToGitBlitUserService.class);
-    bind(GerritGitBlit.class);
-
-    serve("/pages/*").with(WrappedPagesServlet.class);
-    serve("/feed/*").with(WrappedSyndicationServlet.class);
-    serve("/zip/*").with(WrappedDownloadZipServlet.class);
-    serve("/logo.png").with(WrappedLogoServlet.class);
-    serve("/static/logo.png").with(WrappedLogoServlet.class);
-
-    filter("/*").through(GerritWicketFilter.class);
-    filter("/pages/*").through(WrappedPagesFilter.class);
-    filter("/feed/*").through(WrappedSyndicationFilter.class);
+  protected void configure() {
+    DynamicSet.bind(binder(), TopMenu.class).to(GitBlitTopMenu.class);
   }
+
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java
new file mode 100644
index 0000000..4ecdf54
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2012 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.gitblit;
+
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.gitblit.IUserService;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.servlet.ServletModule;
+import com.googlesource.gerrit.plugins.gitblit.app.GerritGitBlit;
+import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
+
+public class GitBlitServletModule extends ServletModule {
+  private static final Logger log = LoggerFactory.getLogger(GitBlitServletModule.class);
+
+  @Inject
+  public GitBlitServletModule(@PluginName final String name,
+      @GerritServerConfig final Config gerritConfig, final SitePaths sitePaths) {
+    log.info("Create GitBlitModule with name='" + name);
+  }
+
+  @Override
+  protected void configureServlets() {
+    log.info("Configuring servlet and filters");
+    bind(IUserService.class).to(GerritToGitBlitUserService.class);
+    bind(GerritGitBlit.class);
+
+    serve("/pages/*").with(WrappedPagesServlet.class);
+    serve("/feed/*").with(WrappedSyndicationServlet.class);
+    serve("/zip/*").with(WrappedDownloadZipServlet.class);
+    serve("/logo.png").with(WrappedLogoServlet.class);
+    serve("/static/logo.png").with(WrappedLogoServlet.class);
+
+    filter("/*").through(GerritWicketFilter.class);
+    filter("/pages/*").through(WrappedPagesFilter.class);
+    filter("/feed/*").through(WrappedSyndicationFilter.class);
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
new file mode 100644
index 0000000..83204ae
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
@@ -0,0 +1,47 @@
+package com.googlesource.gerrit.plugins.gitblit;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.webui.TopMenu;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+@Listen
+public class GitBlitTopMenu implements TopMenu {
+  private final MenuEntry fullMenuEntries;
+  private final MenuEntry restrictedMenuEntries;
+  private final Provider<CurrentUser> userProvider;
+
+  @Inject
+  public GitBlitTopMenu(final @PluginName String pluginName,
+      final Provider<CurrentUser> userProvider) {
+    this.userProvider = userProvider;
+
+    String gitBlitBaseUrl = "/plugins/" + pluginName + "/";
+    this.restrictedMenuEntries =
+        menu("Gitblit", item("Repositories", gitBlitBaseUrl + "repositories/"));
+    this.fullMenuEntries =
+        menu("GitBlit", item("Repositories", gitBlitBaseUrl + "repositories/"),
+            item("Activity", gitBlitBaseUrl + "activity/"),
+            item("Search", gitBlitBaseUrl + "lucene/"));
+  }
+
+  private MenuEntry menu(String name, MenuItem... items) {
+    return new MenuEntry(name, Arrays.asList(items));
+  }
+
+  private MenuItem item(String name, String url) {
+    return new MenuItem(name, url, "");
+  }
+
+  @Override
+  public List<MenuEntry> getEntries() {
+    return Arrays.asList(userProvider.get() instanceof AnonymousUser
+        ? restrictedMenuEntries : fullMenuEntries);
+  }
+}