Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
src/main/java/com/gitblit/wicket/GitBlitWebApp.java
@@ -25,13 +25,30 @@
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.application.IClassResolver;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.protocol.http.WebApplication;
import com.gitblit.GitBlit;
import ro.fortsoft.pf4j.PluginState;
import ro.fortsoft.pf4j.PluginWrapper;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.utils.StringUtils;
import com.gitblit.extensions.GitblitWicketPlugin;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
import com.gitblit.manager.IFilestoreManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IPluginManager;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IServicesManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.tickets.ITicketService;
import com.gitblit.transport.ssh.IPublicKeyManager;
import com.gitblit.utils.XssFilter;
import com.gitblit.wicket.pages.ActivityPage;
import com.gitblit.wicket.pages.BlamePage;
import com.gitblit.wicket.pages.BlobDiffPage;
@@ -42,45 +59,121 @@
import com.gitblit.wicket.pages.ComparePage;
import com.gitblit.wicket.pages.DocPage;
import com.gitblit.wicket.pages.DocsPage;
import com.gitblit.wicket.pages.EditFilePage;
import com.gitblit.wicket.pages.EditMilestonePage;
import com.gitblit.wicket.pages.EditRepositoryPage;
import com.gitblit.wicket.pages.EditTicketPage;
import com.gitblit.wicket.pages.ExportTicketPage;
import com.gitblit.wicket.pages.FederationRegistrationPage;
import com.gitblit.wicket.pages.FilestorePage;
import com.gitblit.wicket.pages.ForkPage;
import com.gitblit.wicket.pages.ForksPage;
import com.gitblit.wicket.pages.GitSearchPage;
import com.gitblit.wicket.pages.GravatarProfilePage;
import com.gitblit.wicket.pages.HistoryPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.LogoutPage;
import com.gitblit.wicket.pages.LuceneSearchPage;
import com.gitblit.wicket.pages.MetricsPage;
import com.gitblit.wicket.pages.MyDashboardPage;
import com.gitblit.wicket.pages.MyTicketsPage;
import com.gitblit.wicket.pages.NewMilestonePage;
import com.gitblit.wicket.pages.NewRepositoryPage;
import com.gitblit.wicket.pages.NewTicketPage;
import com.gitblit.wicket.pages.OverviewPage;
import com.gitblit.wicket.pages.PatchPage;
import com.gitblit.wicket.pages.ProjectPage;
import com.gitblit.wicket.pages.ProjectsPage;
import com.gitblit.wicket.pages.RawPage;
import com.gitblit.wicket.pages.ReflogPage;
import com.gitblit.wicket.pages.RepositoriesPage;
import com.gitblit.wicket.pages.ReviewProposalPage;
import com.gitblit.wicket.pages.SummaryPage;
import com.gitblit.wicket.pages.TagPage;
import com.gitblit.wicket.pages.TagsPage;
import com.gitblit.wicket.pages.TeamsPage;
import com.gitblit.wicket.pages.TicketsPage;
import com.gitblit.wicket.pages.TreePage;
import com.gitblit.wicket.pages.UserPage;
import com.gitblit.wicket.pages.UsersPage;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
public class GitBlitWebApp extends WebApplication {
@Singleton
public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
   private final Class<? extends WebPage> homePageClass = MyDashboardPage.class;
   private final Class<? extends WebPage> newRepositoryPageClass = NewRepositoryPage.class;
   private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>();
   private IStoredSettings settings;
   private final Provider<IPublicKeyManager> publicKeyManagerProvider;
   private final Provider<ITicketService> ticketServiceProvider;
   private final IStoredSettings settings;
   private final XssFilter xssFilter;
   private final IRuntimeManager runtimeManager;
   private final IPluginManager pluginManager;
   private final INotificationManager notificationManager;
   private final IUserManager userManager;
   private final IAuthenticationManager authenticationManager;
   private final IRepositoryManager repositoryManager;
   private final IProjectManager projectManager;
   private final IFederationManager federationManager;
   private final IGitblit gitblit;
   private final IServicesManager services;
   private final IFilestoreManager filestoreManager;
   @Inject
   public GitBlitWebApp(
         Provider<IPublicKeyManager> publicKeyManagerProvider,
         Provider<ITicketService> ticketServiceProvider,
         IRuntimeManager runtimeManager,
         IPluginManager pluginManager,
         INotificationManager notificationManager,
         IUserManager userManager,
         IAuthenticationManager authenticationManager,
         IRepositoryManager repositoryManager,
         IProjectManager projectManager,
         IFederationManager federationManager,
         IGitblit gitblit,
         IServicesManager services,
         IFilestoreManager filestoreManager) {
      super();
      this.publicKeyManagerProvider = publicKeyManagerProvider;
      this.ticketServiceProvider = ticketServiceProvider;
      this.settings = runtimeManager.getSettings();
      this.xssFilter = runtimeManager.getXssFilter();
      this.runtimeManager = runtimeManager;
      this.pluginManager = pluginManager;
      this.notificationManager = notificationManager;
      this.userManager = userManager;
      this.authenticationManager = authenticationManager;
      this.repositoryManager = repositoryManager;
      this.projectManager = projectManager;
      this.federationManager = federationManager;
      this.gitblit = gitblit;
      this.services = services;
      this.filestoreManager = filestoreManager;
   }
   @Override
   public void init() {
      super.init();
      settings = GitBlit.getSettings();
      // Setup page authorization mechanism
      boolean useAuthentication = settings.getBoolean(Keys.web.authenticateViewPages, false)
@@ -103,9 +196,9 @@
      // setup the standard gitweb-ish urls
      mount("/repositories", RepositoriesPage.class);
      mount("/overview", OverviewPage.class, "r", "h");
      mount("/overview", OverviewPage.class, "r");
      mount("/summary", SummaryPage.class, "r");
      mount("/reflog", ReflogPage.class, "r", "h");
      mount("/reflog", ReflogPage.class, "r");
      mount("/commits", LogPage.class, "r", "h");
      mount("/log", LogPage.class, "r", "h");
      mount("/tags", TagsPage.class, "r");
@@ -114,7 +207,6 @@
      mount("/tag", TagPage.class, "r", "h");
      mount("/tree", TreePage.class, "r", "h", "f");
      mount("/blob", BlobPage.class, "r", "h", "f");
      mount("/raw", RawPage.class, "r", "h", "f");
      mount("/blobdiff", BlobDiffPage.class, "r", "h", "f");
      mount("/commitdiff", CommitDiffPage.class, "r", "h");
      mount("/compare", ComparePage.class, "r", "h");
@@ -124,18 +216,30 @@
      mount("/metrics", MetricsPage.class, "r");
      mount("/blame", BlamePage.class, "r", "h", "f");
      mount("/users", UsersPage.class);
      mount("/teams", TeamsPage.class);
      mount("/logout", LogoutPage.class);
      // setup ticket urls
      mount("/tickets", TicketsPage.class, "r", "h");
      mount("/tickets/new", NewTicketPage.class, "r");
      mount("/tickets/edit", EditTicketPage.class, "r", "h");
      mount("/tickets/export", ExportTicketPage.class, "r", "h");
      mount("/milestones/new", NewMilestonePage.class, "r");
      mount("/milestones/edit", EditMilestonePage.class, "r", "h");
      mount("/mytickets", MyTicketsPage.class, "r", "h");
      // setup the markup document urls
      mount("/docs", DocsPage.class, "r");
      mount("/docs", DocsPage.class, "r", "h");
      mount("/doc", DocPage.class, "r", "h", "f");
      mount("/editfile", EditFilePage.class, "r", "h", "f");
      // federation urls
      mount("/proposal", ReviewProposalPage.class, "t");
      mount("/registration", FederationRegistrationPage.class, "u", "n");
      mount("/new", NewRepositoryPage.class);
      mount("/edit", EditRepositoryPage.class, "r");
      mount("/activity", ActivityPage.class, "r", "h");
      mount("/gravatar", GravatarProfilePage.class, "h");
      mount("/lucene", LuceneSearchPage.class);
      mount("/project", ProjectPage.class, "p");
      mount("/projects", ProjectsPage.class);
@@ -143,18 +247,40 @@
      mount("/forks", ForksPage.class, "r");
      mount("/fork", ForkPage.class, "r");
      
      // filestore URL
      mount("/filestore", FilestorePage.class);
      // allow started Wicket plugins to initialize
      for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) {
         if (PluginState.STARTED != pluginWrapper.getPluginState()) {
            continue;
         }
         if (pluginWrapper.getPlugin() instanceof GitblitWicketPlugin) {
            GitblitWicketPlugin wicketPlugin = (GitblitWicketPlugin) pluginWrapper.getPlugin();
            wicketPlugin.init(this);
         }
      }
       // customize the Wicket class resolver to load from plugins
      IClassResolver coreResolver = getApplicationSettings().getClassResolver();
        PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
        getApplicationSettings().setClassResolver(classResolver);
      getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
      super.init();
   }
   private void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, java.lang.String)
    */
   @Override
   public void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
      if (parameters == null) {
         parameters = new String[] {};
      }
      if (!settings.getBoolean(Keys.web.mountParameters, true)) {
         parameters = new String[] {};
      }
      mount(new GitblitParamUrlCodingStrategy(settings, location, clazz, parameters));
      mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters));
      // map the mount point to the cache control definition
      if (clazz.isAnnotationPresent(CacheControl.class)) {
@@ -163,15 +289,30 @@
      }
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#getHomePage()
    */
   @Override
   public Class<? extends WebPage> getHomePage() {
      return homePageClass;
   }
   public Class<? extends WebPage> getNewRepositoryPage() {
      return newRepositoryPageClass;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String)
    */
   @Override
   public boolean isCacheablePage(String mountPoint) {
      return cacheablePages.containsKey(mountPoint);
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#getCacheControl(java.lang.String)
    */
   @Override
   public CacheControl getCacheControl(String mountPoint) {
      return cacheablePages.get(mountPoint);
   }
@@ -180,77 +321,164 @@
   public final Session newSession(Request request, Response response) {
      GitBlitWebSession gitBlitWebSession = new GitBlitWebSession(request);
      String forcedLocale = settings.getString(Keys.web.forceDefaultLocale, null);
      if (!StringUtils.isEmpty(forcedLocale)) {
         gitBlitWebSession.setLocale(new Locale(forcedLocale));
      Locale forcedLocale = runtime().getLocale();
      if (forcedLocale != null) {
         gitBlitWebSession.setLocale(forcedLocale);
      }
      return gitBlitWebSession;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#settings()
    */
   @Override
   public IStoredSettings settings() {
      return settings;
   }
   /**
    * Is Gitblit running in debug mode?
    *
    * @return true if Gitblit is running in debug mode
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#xssFilter()
    */
   @Override
   public XssFilter xssFilter() {
      return xssFilter;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#isDebugMode()
    */
   @Override
   public boolean isDebugMode() {
      return GitBlit.isDebugMode();
      return runtimeManager.isDebugMode();
   }
   /*
    * These methods look strange... and they are... but they are the first
    * step towards modularization across multiple commits.
    */
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#getBootDate()
    */
   @Override
   public Date getBootDate() {
      return GitBlit.getBootDate();
      return runtimeManager.getBootDate();
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#getLastActivityDate()
    */
   @Override
   public Date getLastActivityDate() {
      return GitBlit.getLastActivityDate();
      return repositoryManager.getLastActivityDate();
   }
   public GitBlit runtime() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#runtime()
    */
   @Override
   public IRuntimeManager runtime() {
      return runtimeManager;
   }
   public GitBlit mail() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#plugins()
    */
   @Override
   public IPluginManager plugins() {
      return pluginManager;
   }
   public GitBlit users() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#notifier()
    */
   @Override
   public INotificationManager notifier() {
      return notificationManager;
   }
   public GitBlit session() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#users()
    */
   @Override
   public IUserManager users() {
      return userManager;
   }
   public GitBlit repositories() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#authentication()
    */
   @Override
   public IAuthenticationManager authentication() {
      return authenticationManager;
   }
   public GitBlit projects() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#keys()
    */
   @Override
   public IPublicKeyManager keys() {
      return publicKeyManagerProvider.get();
   }
   public GitBlit federation() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#repositories()
    */
   @Override
   public IRepositoryManager repositories() {
      return repositoryManager;
   }
   public GitBlit gitblit() {
      return GitBlit.self();
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#projects()
    */
   @Override
   public IProjectManager projects() {
      return projectManager;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#federation()
    */
   @Override
   public IFederationManager federation() {
      return federationManager;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#gitblit()
    */
   @Override
   public IGitblit gitblit() {
      return gitblit;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#services()
    */
   @Override
   public IServicesManager services() {
      return services;
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#tickets()
    */
   @Override
   public ITicketService tickets() {
      return ticketServiceProvider.get();
   }
   /* (non-Javadoc)
    * @see com.gitblit.wicket.Webapp#getTimezone()
    */
   @Override
   public TimeZone getTimezone() {
      return GitBlit.getTimezone();
      return runtimeManager.getTimezone();
   }
   @Override
   public final String getConfigurationType() {
      if (isDebugMode()) {
      if (runtimeManager.isDebugMode()) {
         return Application.DEVELOPMENT;
      }
      return Application.DEPLOYMENT;
@@ -259,4 +487,9 @@
   public static GitBlitWebApp get() {
      return (GitBlitWebApp) WebApplication.get();
   }
   @Override
   public IFilestoreManager filestore() {
      return filestoreManager;
   }
}