James Moger
2014-03-30 413e9b486b1a84960d4c8ddac130e87280f64c6a
src/main/java/com/gitblit/GitBlit.java
@@ -15,741 +15,352 @@
 */
package com.gitblit;
import java.io.File;
import java.util.Collection;
import java.util.Date;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import javax.inject.Singleton;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.lib.Repository;
import com.gitblit.Constants.FederationRequest;
import com.gitblit.Constants.FederationToken;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.manager.GitblitManager;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
import com.gitblit.manager.IGitblitManager;
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.ISessionManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.models.FederationModel;
import com.gitblit.models.FederationProposal;
import com.gitblit.models.FederationSet;
import com.gitblit.models.ForkModel;
import com.gitblit.models.GitClientApplication;
import com.gitblit.models.Metric;
import com.gitblit.models.ProjectModel;
import com.gitblit.models.RegistrantAccessPermission;
import com.gitblit.manager.ServicesManager;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.SearchResult;
import com.gitblit.models.ServerSettings;
import com.gitblit.models.ServerStatus;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
import com.gitblit.tickets.BranchTicketService;
import com.gitblit.tickets.FileTicketService;
import com.gitblit.tickets.ITicketService;
import com.gitblit.tickets.NullTicketService;
import com.gitblit.tickets.RedisTicketService;
import com.gitblit.transport.ssh.IPublicKeyManager;
import com.gitblit.utils.StringUtils;
import dagger.Module;
import dagger.ObjectGraph;
import dagger.Provides;
/**
 * GitBlit is an aggregate interface delegate.  It implements all the manager
 * interfaces and delegates all methods calls to the actual manager implementations.
 * It's primary purpose is to provide complete management control to the git
 * upload and receive pack functions.
 * GitBlit is the aggregate manager for the Gitblit webapp.  It provides all
 * management functions and also manages some long-running services.
 *
 * @author James Moger
 *
 */
public class GitBlit implements IRuntimeManager,
                        INotificationManager,
                        IUserManager,
                        ISessionManager,
                        IRepositoryManager,
                        IProjectManager,
                        IGitblitManager,
                        IFederationManager {
public class GitBlit extends GitblitManager {
   private final IRuntimeManager runtimeManager;
   private final ObjectGraph injector;
   private final INotificationManager notificationManager;
   private final ServicesManager servicesManager;
   private final IUserManager userManager;
   private final ISessionManager sessionManager;
   private final IRepositoryManager repositoryManager;
   private final IProjectManager projectManager;
   private final IGitblitManager gitblitManager;
   private final IFederationManager federationManager;
   private ITicketService ticketService;
   public GitBlit(
         IRuntimeManager runtimeManager,
         IPluginManager pluginManager,
         INotificationManager notificationManager,
         IUserManager userManager,
         ISessionManager sessionManager,
         IAuthenticationManager authenticationManager,
         IPublicKeyManager publicKeyManager,
         IRepositoryManager repositoryManager,
         IProjectManager projectManager,
         IGitblitManager gitblitManager,
         IFederationManager federationManager) {
      this.runtimeManager = runtimeManager;
      this.notificationManager = notificationManager;
      this.userManager = userManager;
      this.sessionManager = sessionManager;
      this.repositoryManager = repositoryManager;
      this.projectManager = projectManager;
      this.gitblitManager = gitblitManager;
      this.federationManager = federationManager;
      super(runtimeManager,
            pluginManager,
            notificationManager,
            userManager,
            authenticationManager,
            publicKeyManager,
            repositoryManager,
            projectManager,
            federationManager);
      this.injector = ObjectGraph.create(getModules());
      this.servicesManager = new ServicesManager(this);
   }
   @Override
   public GitBlit start() {
      super.start();
      logger.info("Starting services manager...");
      servicesManager.start();
      configureTicketService();
      return this;
   }
   @Override
   public GitBlit stop() {
      super.stop();
      servicesManager.stop();
      ticketService.stop();
      return this;
   }
   /*
    * ISTOREDSETTINGS
    *
    * these methods are necessary for (nearly) seamless Groovy hook operation
    * after the massive refactor.
    */
   public boolean getBoolean(String key, boolean defaultValue) {
      return runtimeManager.getSettings().getBoolean(key, defaultValue);
   }
   public String getString(String key, String defaultValue) {
      return runtimeManager.getSettings().getString(key, defaultValue);
   }
   public int getInteger(String key, int defaultValue) {
      return runtimeManager.getSettings().getInteger(key, defaultValue);
   }
   public List<String> getStrings(String key) {
      return runtimeManager.getSettings().getStrings(key);
   }
   /*
    * RUNTIME MANAGER
    */
   @Override
   public File getBaseFolder() {
      return runtimeManager.getBaseFolder();
   }
   @Override
   public void setBaseFolder(File folder) {
      runtimeManager.setBaseFolder(folder);
   }
   @Override
   public Date getBootDate() {
      return runtimeManager.getBootDate();
   }
   @Override
   public ServerSettings getSettingsModel() {
      return runtimeManager.getSettingsModel();
   }
   @Override
   public boolean isServingRepositories() {
      return runtimeManager.isServingRepositories();
      return servicesManager.isServingRepositories();
   }
   @Override
   public TimeZone getTimezone() {
      return runtimeManager.getTimezone();
   protected Object [] getModules() {
      return new Object [] { new GitBlitModule()};
   }
   @Override
   public boolean isDebugMode() {
      return runtimeManager.isDebugMode();
   }
   @Override
   public File getFileOrFolder(String key, String defaultFileOrFolder) {
      return runtimeManager.getFileOrFolder(key, defaultFileOrFolder);
   }
   @Override
   public File getFileOrFolder(String fileOrFolder) {
      return runtimeManager.getFileOrFolder(fileOrFolder);
   }
   @Override
   public IStoredSettings getSettings() {
      return runtimeManager.getSettings();
   }
   @Override
   public boolean updateSettings(Map<String, String> updatedSettings) {
      return runtimeManager.updateSettings(updatedSettings);
   }
   @Override
   public ServerStatus getStatus() {
      return runtimeManager.getStatus();
   }
   /*
    * NOTIFICATION MANAGER
   /**
    * Returns a list of repository URLs and the user access permission.
    *
    * @param request
    * @param user
    * @param repository
    * @return a list of repository urls
    */
   @Override
   public void sendMailToAdministrators(String subject, String message) {
      notificationManager.sendMailToAdministrators(subject, message);
   public List<RepositoryUrl> getRepositoryUrls(HttpServletRequest request, UserModel user, RepositoryModel repository) {
      if (user == null) {
         user = UserModel.ANONYMOUS;
      }
      String username = StringUtils.encodeUsername(UserModel.ANONYMOUS.equals(user) ? "" : user.username);
      List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
      // http/https url
      if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
         AccessPermission permission = user.getRepositoryPermission(repository).permission;
         if (permission.exceeds(AccessPermission.NONE)) {
            list.add(new RepositoryUrl(getRepositoryUrl(request, username, repository), permission));
         }
      }
      // ssh daemon url
      String sshDaemonUrl = servicesManager.getSshDaemonUrl(request, user, repository);
      if (!StringUtils.isEmpty(sshDaemonUrl)) {
         AccessPermission permission = user.getRepositoryPermission(repository).permission;
         if (permission.exceeds(AccessPermission.NONE)) {
            list.add(new RepositoryUrl(sshDaemonUrl, permission));
         }
      }
      // git daemon url
      String gitDaemonUrl = servicesManager.getGitDaemonUrl(request, user, repository);
      if (!StringUtils.isEmpty(gitDaemonUrl)) {
         AccessPermission permission = servicesManager.getGitDaemonAccessPermission(user, repository);
         if (permission.exceeds(AccessPermission.NONE)) {
            list.add(new RepositoryUrl(gitDaemonUrl, permission));
         }
      }
      // add all other urls
      // {0} = repository
      // {1} = username
      for (String url : settings.getStrings(Keys.web.otherUrls)) {
         if (url.contains("{1}")) {
            // external url requires username, only add url IF we have one
            if (!StringUtils.isEmpty(username)) {
               list.add(new RepositoryUrl(MessageFormat.format(url, repository.name, username), null));
            }
         } else {
            // external url does not require username
            list.add(new RepositoryUrl(MessageFormat.format(url, repository.name), null));
         }
      }
      return list;
   }
   @Override
   public void sendMail(String subject, String message, Collection<String> toAddresses) {
      notificationManager.sendMail(subject, message, toAddresses);
   }
   @Override
   public void sendMail(String subject, String message, String... toAddresses) {
      notificationManager.sendMail(subject, message, toAddresses);
   }
   @Override
   public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
      notificationManager.sendHtmlMail(subject, message, toAddresses);
   }
   @Override
   public void sendHtmlMail(String subject, String message, String... toAddresses) {
      notificationManager.sendHtmlMail(subject, message, toAddresses);
   }
   /*
    * SESSION MANAGER
   /**
    * Detect renames and reindex as appropriate.
    */
   @Override
   public UserModel authenticate(String username, char[] password) {
      return sessionManager.authenticate(username, password);
   public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
         boolean isCreate) throws GitBlitException {
      RepositoryModel oldModel = null;
      boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
      if (isRename) {
         oldModel = repositoryManager.getRepositoryModel(repositoryName);
      }
      super.updateRepositoryModel(repositoryName, repository, isCreate);
      if (isRename && ticketService != null) {
         ticketService.rename(oldModel, repository);
      }
   }
   @Override
   public UserModel authenticate(HttpServletRequest httpRequest) {
      return sessionManager.authenticate(httpRequest, false);
   }
   @Override
   public UserModel authenticate(HttpServletRequest httpRequest, boolean requiresCertificate) {
      return sessionManager.authenticate(httpRequest, requiresCertificate);
   }
   @Override
   public void setCookie(HttpServletResponse response, UserModel user) {
      sessionManager.setCookie(response, user);
   }
   @Override
   public void logout(HttpServletResponse response, UserModel user) {
      sessionManager.logout(response, user);
   }
   /*
    * USER MANAGER
   /**
    * Delete the user and all associated public ssh keys.
    */
   @Override
   public boolean supportsAddUser() {
      return userManager.supportsAddUser();
   }
   @Override
   public boolean supportsCredentialChanges(UserModel user) {
      return userManager.supportsCredentialChanges(user);
   }
   @Override
   public boolean supportsDisplayNameChanges(UserModel user) {
      return userManager.supportsDisplayNameChanges(user);
   }
   @Override
   public boolean supportsEmailAddressChanges(UserModel user) {
      return userManager.supportsEmailAddressChanges(user);
   }
   @Override
   public boolean supportsTeamMembershipChanges(UserModel user) {
      return userManager.supportsTeamMembershipChanges(user);
   }
   @Override
   public List<String> getAllUsernames() {
      return userManager.getAllUsernames();
   }
   @Override
   public List<UserModel> getAllUsers() {
      return userManager.getAllUsers();
   }
   @Override
   public boolean deleteUser(String username) {
      return userManager.deleteUser(username);
   }
   @Override
   public UserModel getUserModel(String username) {
      return userManager.getUserModel(username);
   }
   @Override
   public List<TeamModel> getAllTeams() {
      return userManager.getAllTeams();
   }
   @Override
   public TeamModel getTeamModel(String teamname) {
      return userManager.getTeamModel(teamname);
   }
   @Override
   public boolean supportsCookies() {
      return userManager.supportsCookies();
   }
   @Override
   public String getCookie(UserModel model) {
      return userManager.getCookie(model);
   }
   @Override
   public UserModel getUserModel(char[] cookie) {
      return userManager.getUserModel(cookie);
   }
   @Override
   public boolean updateUserModel(UserModel model) {
      return userManager.updateUserModel(model);
   }
   @Override
   public boolean updateUserModels(Collection<UserModel> models) {
      return userManager.updateUserModels(models);
   }
   @Override
   public boolean updateUserModel(String username, UserModel model) {
      return userManager.updateUserModel(username, model);
      UserModel user = userManager.getUserModel(username);
      return deleteUserModel(user);
   }
   @Override
   public boolean deleteUserModel(UserModel model) {
      return userManager.deleteUserModel(model);
      boolean success = userManager.deleteUserModel(model);
      if (success) {
         getPublicKeyManager().removeAllKeys(model.username);
      }
      return success;
   }
   @Override
   public List<String> getAllTeamNames() {
      return userManager.getAllTeamNames();
   }
   @Override
   public List<String> getTeamNamesForRepositoryRole(String role) {
      return userManager.getTeamNamesForRepositoryRole(role);
   }
   @Override
   public boolean updateTeamModel(TeamModel model) {
      return userManager.updateTeamModel(model);
   }
   @Override
   public boolean updateTeamModels(Collection<TeamModel> models) {
      return userManager.updateTeamModels(models);
   }
   @Override
   public boolean updateTeamModel(String teamname, TeamModel model) {
      return userManager.updateTeamModel(teamname, model);
   }
   @Override
   public boolean deleteTeamModel(TeamModel model) {
      return userManager.deleteTeamModel(model);
   }
   @Override
   public List<String> getUsernamesForRepositoryRole(String role) {
      return userManager.getUsernamesForRepositoryRole(role);
   }
   @Override
   public boolean renameRepositoryRole(String oldRole, String newRole) {
      return userManager.renameRepositoryRole(oldRole, newRole);
   }
   @Override
   public boolean deleteRepositoryRole(String role) {
      return userManager.deleteRepositoryRole(role);
   }
   @Override
   public boolean deleteTeam(String teamname) {
      return userManager.deleteTeam(teamname);
   }
   /*
    * REPOSITORY MANAGER
   /**
    * Delete the repository and all associated tickets.
    */
   @Override
   public Date getLastActivityDate() {
      return repositoryManager.getLastActivityDate();
   }
   @Override
   public File getRepositoriesFolder() {
      return repositoryManager.getRepositoriesFolder();
   }
   @Override
   public File getHooksFolder() {
      return repositoryManager.getHooksFolder();
   }
   @Override
   public File getGrapesFolder() {
      return repositoryManager.getGrapesFolder();
   }
   @Override
   public List<RegistrantAccessPermission> getUserAccessPermissions(UserModel user) {
      return repositoryManager.getUserAccessPermissions(user);
   }
   @Override
   public List<RegistrantAccessPermission> getUserAccessPermissions(RepositoryModel repository) {
      return repositoryManager.getUserAccessPermissions(repository);
   }
   @Override
   public boolean setUserAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions) {
      return repositoryManager.setUserAccessPermissions(repository, permissions);
   }
   @Override
   public List<String> getRepositoryUsers(RepositoryModel repository) {
      return repositoryManager.getRepositoryUsers(repository);
   }
   @Override
   public List<RegistrantAccessPermission> getTeamAccessPermissions(RepositoryModel repository) {
      return repositoryManager.getTeamAccessPermissions(repository);
   }
   @Override
   public boolean setTeamAccessPermissions(RepositoryModel repository, Collection<RegistrantAccessPermission> permissions) {
      return repositoryManager.setTeamAccessPermissions(repository, permissions);
   }
   @Override
   public List<String> getRepositoryTeams(RepositoryModel repository) {
      return repositoryManager.getRepositoryTeams(repository);
   }
   @Override
   public void addToCachedRepositoryList(RepositoryModel model) {
      repositoryManager.addToCachedRepositoryList(model);
   }
   @Override
   public void resetRepositoryListCache() {
      repositoryManager.resetRepositoryListCache();
   }
   @Override
   public List<String> getRepositoryList() {
      return repositoryManager.getRepositoryList();
   }
   @Override
   public Repository getRepository(String repositoryName) {
      return repositoryManager.getRepository(repositoryName);
   }
   @Override
   public Repository getRepository(String repositoryName, boolean logError) {
      return repositoryManager.getRepository(repositoryName, logError);
   }
   @Override
   public List<RepositoryModel> getRepositoryModels(UserModel user) {
      return repositoryManager.getRepositoryModels(user);
   }
   @Override
   public RepositoryModel getRepositoryModel(UserModel user, String repositoryName) {
      return repositoryManager.getRepositoryModel(repositoryName);
   }
   @Override
   public RepositoryModel getRepositoryModel(String repositoryName) {
      return repositoryManager.getRepositoryModel(repositoryName);
   }
   @Override
   public long getStarCount(RepositoryModel repository) {
      return repositoryManager.getStarCount(repository);
   }
   @Override
   public boolean hasRepository(String repositoryName) {
      return repositoryManager.hasRepository(repositoryName);
   }
   @Override
   public boolean hasRepository(String repositoryName, boolean caseSensitiveCheck) {
      return repositoryManager.hasRepository(repositoryName, caseSensitiveCheck);
   }
   @Override
   public boolean hasFork(String username, String origin) {
      return repositoryManager.hasFork(username, origin);
   }
   @Override
   public String getFork(String username, String origin) {
      return repositoryManager.getFork(username, origin);
   }
   @Override
   public ForkModel getForkNetwork(String repository) {
      return repositoryManager.getForkNetwork(repository);
   }
   @Override
   public long updateLastChangeFields(Repository r, RepositoryModel model) {
      return repositoryManager.updateLastChangeFields(r, model);
   }
   @Override
   public List<Metric> getRepositoryDefaultMetrics(RepositoryModel model, Repository repository) {
      return repositoryManager.getRepositoryDefaultMetrics(model, repository);
   }
   @Override
   public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
         boolean isCreate) throws GitBlitException {
      repositoryManager.updateRepositoryModel(repositoryName, repository, isCreate);
   }
   @Override
   public void updateConfiguration(Repository r, RepositoryModel repository) {
      repositoryManager.updateConfiguration(r, repository);
   public boolean deleteRepository(String repositoryName) {
      RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
      return deleteRepositoryModel(repository);
   }
   @Override
   public boolean deleteRepositoryModel(RepositoryModel model) {
      return repositoryManager.deleteRepositoryModel(model);
      boolean success = repositoryManager.deleteRepositoryModel(model);
      if (success && ticketService != null) {
         ticketService.deleteAll(model);
      }
      return success;
   }
   @Override
   public boolean deleteRepository(String repositoryName) {
      return repositoryManager.deleteRepository(repositoryName);
   }
   @Override
   public List<String> getAllScripts() {
      return repositoryManager.getAllScripts();
   }
   @Override
   public List<String> getPreReceiveScriptsInherited(RepositoryModel repository) {
      return repositoryManager.getPreReceiveScriptsInherited(repository);
   }
   @Override
   public List<String> getPreReceiveScriptsUnused(RepositoryModel repository) {
      return repositoryManager.getPreReceiveScriptsUnused(repository);
   }
   @Override
   public List<String> getPostReceiveScriptsInherited(RepositoryModel repository) {
      return repositoryManager.getPostReceiveScriptsInherited(repository);
   }
   @Override
   public List<String> getPostReceiveScriptsUnused(RepositoryModel repository) {
      return repositoryManager.getPostReceiveScriptsUnused(repository);
   }
   @Override
   public List<SearchResult> search(String query, int page, int pageSize, List<String> repositories) {
      return repositoryManager.search(query, page, pageSize, repositories);
   }
   @Override
   public boolean isCollectingGarbage() {
      return repositoryManager.isCollectingGarbage();
   }
   @Override
   public boolean isCollectingGarbage(String repositoryName) {
      return repositoryManager.isCollectingGarbage(repositoryName);
   }
   /*
    * PROJECT MANAGER
   /**
    * Returns the configured ticket service.
    *
    * @return a ticket service
    */
   @Override
   public List<ProjectModel> getProjectModels(UserModel user, boolean includeUsers) {
      return projectManager.getProjectModels(user, includeUsers);
   public ITicketService getTicketService() {
      return ticketService;
   }
   @Override
   public ProjectModel getProjectModel(String name, UserModel user) {
      return projectManager.getProjectModel(name, user);
   protected void configureTicketService() {
      String clazz = settings.getString(Keys.tickets.service, NullTicketService.class.getName());
      if (StringUtils.isEmpty(clazz)) {
         clazz = NullTicketService.class.getName();
      }
      try {
         Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz);
         ticketService = injector.get(serviceClass).start();
         if (ticketService instanceof NullTicketService) {
            logger.warn("No ticket service configured.");
         } else if (ticketService.isReady()) {
            logger.info("{} is ready.", ticketService);
         } else {
            logger.warn("{} is disabled.", ticketService);
         }
      } catch (Exception e) {
         logger.error("failed to create ticket service " + clazz, e);
         ticketService = injector.get(NullTicketService.class).start();
      }
   }
   @Override
   public ProjectModel getProjectModel(String name) {
      return projectManager.getProjectModel(name);
   }
   @Override
   public List<ProjectModel> getProjectModels(List<RepositoryModel> repositoryModels, boolean includeUsers) {
      return projectManager.getProjectModels(repositoryModels, includeUsers);
   }
   /*
    * FEDERATION MANAGER
   /**
    * A nested Dagger graph is used for constructor dependency injection of
    * complex classes.
    *
    * @author James Moger
    *
    */
   @Module(
         library = true,
         injects = {
               IStoredSettings.class,
   @Override
   public File getProposalsFolder() {
      return federationManager.getProposalsFolder();
   }
               // core managers
               IRuntimeManager.class,
               INotificationManager.class,
               IUserManager.class,
               IAuthenticationManager.class,
               IRepositoryManager.class,
               IProjectManager.class,
               IFederationManager.class,
   @Override
   public UserModel getFederationUser() {
      return federationManager.getFederationUser();
   }
               // the monolithic manager
               IGitblit.class,
   @Override
   public boolean canFederate() {
      return federationManager.canFederate();
   }
               // ticket services
               NullTicketService.class,
               FileTicketService.class,
               BranchTicketService.class,
               RedisTicketService.class
            }
         )
   class GitBlitModule {
   @Override
   public List<FederationModel> getFederationRegistrations() {
      return federationManager.getFederationRegistrations();
   }
      @Provides @Singleton IStoredSettings provideSettings() {
         return settings;
      }
   @Override
   public FederationModel getFederationRegistration(String url, String name) {
      return federationManager.getFederationRegistration(url, name);
   }
      @Provides @Singleton IRuntimeManager provideRuntimeManager() {
         return runtimeManager;
      }
   @Override
   public List<FederationSet> getFederationSets(String gitblitUrl) {
      return federationManager.getFederationSets(gitblitUrl);
   }
      @Provides @Singleton INotificationManager provideNotificationManager() {
         return notificationManager;
      }
   @Override
   public List<String> getFederationTokens() {
      return federationManager.getFederationTokens();
   }
      @Provides @Singleton IUserManager provideUserManager() {
         return userManager;
      }
   @Override
   public String getFederationToken(FederationToken type) {
      return federationManager.getFederationToken(type);
   }
      @Provides @Singleton IAuthenticationManager provideAuthenticationManager() {
         return authenticationManager;
      }
   @Override
   public String getFederationToken(String value) {
      return federationManager.getFederationToken(value);
   }
      @Provides @Singleton IRepositoryManager provideRepositoryManager() {
         return repositoryManager;
      }
   @Override
   public boolean validateFederationRequest(FederationRequest req, String token) {
      return federationManager.validateFederationRequest(req, token);
   }
      @Provides @Singleton IProjectManager provideProjectManager() {
         return projectManager;
      }
   @Override
   public boolean acknowledgeFederationStatus(String identification, FederationModel registration) {
      return federationManager.acknowledgeFederationStatus(identification, registration);
   }
      @Provides @Singleton IFederationManager provideFederationManager() {
         return federationManager;
      }
   @Override
   public List<FederationModel> getFederationResultRegistrations() {
      return federationManager.getFederationResultRegistrations();
   }
      @Provides @Singleton IGitblit provideGitblit() {
         return GitBlit.this;
      }
   @Override
   public boolean submitFederationProposal(FederationProposal proposal, String gitblitUrl) {
      return federationManager.submitFederationProposal(proposal, gitblitUrl);
   }
      @Provides @Singleton NullTicketService provideNullTicketService() {
         return new NullTicketService(
               runtimeManager,
               notificationManager,
               userManager,
               repositoryManager);
      }
   @Override
   public List<FederationProposal> getPendingFederationProposals() {
      return federationManager.getPendingFederationProposals();
   }
      @Provides @Singleton FileTicketService provideFileTicketService() {
         return new FileTicketService(
               runtimeManager,
               notificationManager,
               userManager,
               repositoryManager);
      }
   @Override
   public Map<String, RepositoryModel> getRepositories(String gitblitUrl, String token) {
      return federationManager.getRepositories(gitblitUrl, token);
   }
      @Provides @Singleton BranchTicketService provideBranchTicketService() {
         return new BranchTicketService(
               runtimeManager,
               notificationManager,
               userManager,
               repositoryManager);
      }
   @Override
   public FederationProposal createFederationProposal(String gitblitUrl, String token) {
      return federationManager.createFederationProposal(gitblitUrl, token);
   }
   @Override
   public FederationProposal getPendingFederationProposal(String token) {
      return federationManager.getPendingFederationProposal(token);
   }
   @Override
   public boolean deletePendingFederationProposal(FederationProposal proposal) {
      return federationManager.deletePendingFederationProposal(proposal);
   }
   /*
    * GITBLIT MANAGER
    */
   @Override
   public RepositoryModel fork(RepositoryModel repository, UserModel user) throws GitBlitException {
      return gitblitManager.fork(repository, user);
   }
   @Override
   public void updateTeamModel(String teamname, TeamModel team, boolean isCreate)
         throws GitBlitException {
      gitblitManager.updateTeamModel(teamname, team, isCreate);
   }
   @Override
   public void updateUserModel(String username, UserModel user, boolean isCreate)
         throws GitBlitException {
      gitblitManager.updateUserModel(username, user, isCreate);
   }
   @Override
   public List<RepositoryUrl> getRepositoryUrls(HttpServletRequest request, UserModel user, RepositoryModel repository) {
      return gitblitManager.getRepositoryUrls(request, user, repository);
   }
   @Override
   public Collection<GitClientApplication> getClientApplications() {
      return gitblitManager.getClientApplications();
      @Provides @Singleton RedisTicketService provideRedisTicketService() {
         return new RedisTicketService(
               runtimeManager,
               notificationManager,
               userManager,
               repositoryManager);
      }
   }
}