From f8f6aa4d07cdfaaf23e24bf9eaf0a5fb9b437dda Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Nov 2013 11:05:51 -0500
Subject: [PATCH] Update unit tests for refactored architecture

---
 src/main/java/com/gitblit/GitBlit.java | 1041 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 685 insertions(+), 356 deletions(-)

diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index ca676ff..0dcc765 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 gitblit.com.
+ * Copyright 2013 gitblit.com.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,411 +16,740 @@
 package com.gitblit;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.TimeZone;
 
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.servlet.ServletContext;
-import javax.servlet.annotation.WebListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
-import com.gitblit.dagger.DaggerContextListener;
-import com.gitblit.git.GitServlet;
+import org.eclipse.jgit.lib.Repository;
+
+import com.gitblit.Constants.FederationRequest;
+import com.gitblit.Constants.FederationToken;
 import com.gitblit.manager.IFederationManager;
 import com.gitblit.manager.IGitblitManager;
-import com.gitblit.manager.IManager;
 import com.gitblit.manager.INotificationManager;
 import com.gitblit.manager.IProjectManager;
 import com.gitblit.manager.IRepositoryManager;
 import com.gitblit.manager.IRuntimeManager;
-import com.gitblit.manager.IServicesManager;
 import com.gitblit.manager.ISessionManager;
 import com.gitblit.manager.IUserManager;
-import com.gitblit.utils.ContainerUtils;
-import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.GitblitWicketFilter;
-
-import dagger.ObjectGraph;
+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.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;
 
 /**
- * This class is the main entry point for the entire webapp.  It is a singleton
- * created manually by Gitblit GO or dynamically by the WAR/Express servlet
- * container.  This class instantiates and starts all managers followed by
- * instantiating and registering all servlets and filters.
- *
- * Leveraging Servlet 3 and Dagger static dependency injection allows Gitblit to
- * be modular and completely code-driven rather then relying on the fragility of
- * a web.xml descriptor and the static & monolithic design previously used.
+ * 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.
  *
  * @author James Moger
  *
  */
-@WebListener
-public class GitBlit extends DaggerContextListener {
+public class GitBlit implements IRuntimeManager,
+								INotificationManager,
+								IUserManager,
+								ISessionManager,
+								IRepositoryManager,
+								IProjectManager,
+								IGitblitManager,
+								IFederationManager {
 
-	private static GitBlit gitblit;
+	private final IRuntimeManager runtimeManager;
 
-	private final List<IManager> managers = new ArrayList<IManager>();
+	private final INotificationManager notificationManager;
 
-	private final IStoredSettings goSettings;
+	private final IUserManager userManager;
 
-	private final File goBaseFolder;
+	private final ISessionManager sessionManager;
 
-	/**
-	 * Construct a Gitblit WAR/Express context.
-	 */
-	public GitBlit() {
-		this.goSettings = null;
-		this.goBaseFolder = null;
-		gitblit = this;
+	private final IRepositoryManager repositoryManager;
+
+	private final IProjectManager projectManager;
+
+	private final IGitblitManager gitblitManager;
+
+	private final IFederationManager federationManager;
+
+	public GitBlit(
+			IRuntimeManager runtimeManager,
+			INotificationManager notificationManager,
+			IUserManager userManager,
+			ISessionManager sessionManager,
+			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;
 	}
 
-	/**
-	 * Construct a Gitblit GO context.
-	 *
-	 * @param settings
-	 * @param baseFolder
-	 */
-	public GitBlit(IStoredSettings settings, File baseFolder) {
-		this.goSettings = settings;
-		this.goBaseFolder = baseFolder;
-		gitblit = this;
-	}
-
-	/**
-	 * This method is only used for unit and integration testing.
-	 *
-	 * @param managerClass
-	 * @return a manager
-	 */
-	@SuppressWarnings("unchecked")
-	public static <X extends IManager> X getManager(Class<X> managerClass) {
-		for (IManager manager : gitblit.managers) {
-			if (managerClass.isAssignableFrom(manager.getClass())) {
-				return (X) manager;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns Gitblit's Dagger injection modules.
-	 */
 	@Override
-	protected Object [] getModules() {
-		return new Object [] { new DaggerModule() };
+	public GitBlit start() {
+		return this;
 	}
 
-	/**
-	 * Prepare runtime settings and start all manager instances.
-	 */
 	@Override
-	protected void beforeServletInjection(ServletContext context) {
-		ObjectGraph injector = getInjector(context);
-
-		// create the runtime settings object
-		IStoredSettings runtimeSettings = injector.get(IStoredSettings.class);
-		final File baseFolder;
-
-		if (goSettings != null) {
-			// Gitblit GO
-			baseFolder = configureGO(context, goSettings, goBaseFolder, runtimeSettings);
-		} else {
-			// servlet container
-			WebXmlSettings webxmlSettings = new WebXmlSettings(context);
-			String contextRealPath = context.getRealPath("/");
-			File contextFolder = (contextRealPath != null) ? new File(contextRealPath) : null;
-
-			if (!StringUtils.isEmpty(System.getenv("OPENSHIFT_DATA_DIR"))) {
-				// RedHat OpenShift
-				baseFolder = configureExpress(context, webxmlSettings, contextFolder, runtimeSettings);
-			} else {
-				// standard WAR
-				baseFolder = configureWAR(context, webxmlSettings, contextFolder, runtimeSettings);
-			}
-
-			// Test for Tomcat forward-slash/%2F issue and auto-adjust settings
-			ContainerUtils.CVE_2007_0450.test(runtimeSettings);
-		}
-
-		// Manually configure IRuntimeManager
-		logManager(IRuntimeManager.class);
-		IRuntimeManager runtime = injector.get(IRuntimeManager.class);
-		runtime.setBaseFolder(baseFolder);
-		runtime.getStatus().isGO = goSettings != null;
-		runtime.getStatus().servletContainer = context.getServerInfo();
-		runtime.start();
-		managers.add(runtime);
-
-		// start all other managers
-		startManager(injector, INotificationManager.class);
-		startManager(injector, IUserManager.class);
-		startManager(injector, ISessionManager.class);
-		startManager(injector, IRepositoryManager.class);
-		startManager(injector, IProjectManager.class);
-		startManager(injector, IGitblitManager.class);
-		startManager(injector, IFederationManager.class);
-		startManager(injector, IServicesManager.class);
-
-		logger.info("");
-		logger.info("All managers started.");
-		logger.info("");
+	public GitBlit stop() {
+		return this;
 	}
 
-	protected <X extends IManager> X startManager(ObjectGraph injector, Class<X> clazz) {
-		logManager(clazz);
-		X x = injector.get(clazz);
-		x.start();
-		managers.add(x);
-		return x;
-	}
-
-	protected void logManager(Class<? extends IManager> clazz) {
-		logger.info("");
-		logger.info("----[{}]----", clazz.getName());
-	}
-
-	/**
-	 * Instantiate and inject all filters and servlets into the container using
-	 * the servlet 3 specification.
+	/*
+	 * 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
-	protected void injectServlets(ServletContext context) {
-		// access restricted servlets
-		serve(context, Constants.GIT_PATH, GitServlet.class, GitFilter.class);
-		serve(context, Constants.PAGES, PagesServlet.class, PagesFilter.class);
-		serve(context, Constants.RPC_PATH, RpcServlet.class, RpcFilter.class);
-		serve(context, Constants.ZIP_PATH, DownloadZipServlet.class, DownloadZipFilter.class);
-		serve(context, Constants.SYNDICATION_PATH, SyndicationServlet.class, SyndicationFilter.class);
-
-		// servlets
-		serve(context, Constants.FEDERATION_PATH, FederationServlet.class);
-		serve(context, Constants.SPARKLESHARE_INVITE_PATH, SparkleShareInviteServlet.class);
-		serve(context, Constants.BRANCH_GRAPH_PATH, BranchGraphServlet.class);
-		file(context, "/robots.txt", RobotsTxtServlet.class);
-		file(context, "/logo.png", LogoServlet.class);
-
-		// optional force basic authentication
-		filter(context, "/*", EnforceAuthenticationFilter.class, null);
-
-		// Wicket
-		String toIgnore = StringUtils.flattenStrings(getRegisteredPaths(), ",");
-		Map<String, String> params = new HashMap<String, String>();
-		params.put(GitblitWicketFilter.FILTER_MAPPING_PARAM, "/*");
-		params.put(GitblitWicketFilter.IGNORE_PATHS_PARAM, toIgnore);
-		filter(context, "/*", GitblitWicketFilter.class, params);
+	public File getBaseFolder() {
+		return runtimeManager.getBaseFolder();
 	}
 
-	/**
-	 * Gitblit is being shutdown either because the servlet container is
-	 * shutting down or because the servlet container is re-deploying Gitblit.
-	 */
 	@Override
-	protected void destroyContext(ServletContext context) {
-		logger.info("Gitblit context destroyed by servlet container.");
-		for (IManager manager : managers) {
-			logger.debug("stopping {}", manager.getClass().getSimpleName());
-			manager.stop();
-		}
+	public void setBaseFolder(File folder) {
+		runtimeManager.setBaseFolder(folder);
 	}
 
-	/**
-	 * Configures Gitblit GO
-	 *
-	 * @param context
-	 * @param settings
-	 * @param baseFolder
-	 * @param runtimeSettings
-	 * @return the base folder
+	@Override
+	public Date getBootDate() {
+		return runtimeManager.getBootDate();
+	}
+
+	@Override
+	public ServerSettings getSettingsModel() {
+		return runtimeManager.getSettingsModel();
+	}
+
+	@Override
+	public boolean isServingRepositories() {
+		return runtimeManager.isServingRepositories();
+	}
+
+	@Override
+	public TimeZone getTimezone() {
+		return runtimeManager.getTimezone();
+	}
+
+	@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
 	 */
-	protected File configureGO(
-			ServletContext context,
-			IStoredSettings goSettings,
-			File goBaseFolder,
-			IStoredSettings runtimeSettings) {
 
-		logger.debug("configuring Gitblit GO");
-
-		// merge the stored settings into the runtime settings
-		//
-		// if runtimeSettings is also a FileSettings w/o a specified target file,
-		// the target file for runtimeSettings is set to "localSettings".
-		runtimeSettings.merge(goSettings);
-		File base = goBaseFolder;
-		return base;
+	@Override
+	public void sendMailToAdministrators(String subject, String message) {
+		notificationManager.sendMailToAdministrators(subject, message);
 	}
 
+	@Override
+	public void sendMail(String subject, String message, Collection<String> toAddresses) {
+		notificationManager.sendMail(subject, message, toAddresses);
+	}
 
-	/**
-	 * Configures a standard WAR instance of Gitblit.
-	 *
-	 * @param context
-	 * @param webxmlSettings
-	 * @param contextFolder
-	 * @param runtimeSettings
-	 * @return the base folder
+	@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
 	 */
-	protected File configureWAR(
-			ServletContext context,
-			WebXmlSettings webxmlSettings,
-			File contextFolder,
-			IStoredSettings runtimeSettings) {
 
-		// Gitblit is running in a standard servlet container
-		logger.debug("configuring Gitblit WAR");
-		logger.info("WAR contextFolder is " + ((contextFolder != null) ? contextFolder.getAbsolutePath() : "<empty>"));
-
-		String path = webxmlSettings.getString(Constants.baseFolder, Constants.contextFolder$ + "/WEB-INF/data");
-
-		if (path.contains(Constants.contextFolder$) && contextFolder == null) {
-			// warn about null contextFolder (issue-199)
-			logger.error("");
-			logger.error(MessageFormat.format("\"{0}\" depends on \"{1}\" but \"{2}\" is returning NULL for \"{1}\"!",
-					Constants.baseFolder, Constants.contextFolder$, context.getServerInfo()));
-			logger.error(MessageFormat.format("Please specify a non-parameterized path for <context-param> {0} in web.xml!!", Constants.baseFolder));
-			logger.error(MessageFormat.format("OR configure your servlet container to specify a \"{0}\" parameter in the context configuration!!", Constants.baseFolder));
-			logger.error("");
-		}
-
-		try {
-			// try to lookup JNDI env-entry for the baseFolder
-			InitialContext ic = new InitialContext();
-			Context env = (Context) ic.lookup("java:comp/env");
-			String val = (String) env.lookup("baseFolder");
-			if (!StringUtils.isEmpty(val)) {
-				path = val;
-			}
-		} catch (NamingException n) {
-			logger.error("Failed to get JNDI env-entry: " + n.getExplanation());
-		}
-
-		File base = com.gitblit.utils.FileUtils.resolveParameter(Constants.contextFolder$, contextFolder, path);
-		base.mkdirs();
-
-		// try to extract the data folder resource to the baseFolder
-		File localSettings = new File(base, "gitblit.properties");
-		if (!localSettings.exists()) {
-			extractResources(context, "/WEB-INF/data/", base);
-		}
-
-		// delegate all config to baseFolder/gitblit.properties file
-		FileSettings fileSettings = new FileSettings(localSettings.getAbsolutePath());
-
-		// merge the stored settings into the runtime settings
-		//
-		// if runtimeSettings is also a FileSettings w/o a specified target file,
-		// the target file for runtimeSettings is set to "localSettings".
-		runtimeSettings.merge(fileSettings);
-
-		return base;
+	@Override
+	public UserModel authenticate(String username, char[] password) {
+		return sessionManager.authenticate(username, password);
 	}
 
-	/**
-	 * Configures an OpenShift instance of Gitblit.
-	 *
-	 * @param context
-	 * @param webxmlSettings
-	 * @param contextFolder
-	 * @param runtimeSettings
-	 * @return the base folder
+	@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
 	 */
-	private File configureExpress(
-			ServletContext context,
-			WebXmlSettings webxmlSettings,
-			File contextFolder,
-			IStoredSettings runtimeSettings) {
 
-		// Gitblit is running in OpenShift/JBoss
-		logger.debug("configuring Gitblit Express");
-		String openShift = System.getenv("OPENSHIFT_DATA_DIR");
-		File base = new File(openShift);
-		logger.info("EXPRESS contextFolder is " + contextFolder.getAbsolutePath());
-
-		// Copy the included scripts to the configured groovy folder
-		String path = webxmlSettings.getString(Keys.groovy.scriptsFolder, "groovy");
-		File localScripts = com.gitblit.utils.FileUtils.resolveParameter(Constants.baseFolder$, base, path);
-		if (!localScripts.exists()) {
-			File warScripts = new File(contextFolder, "/WEB-INF/data/groovy");
-			if (!warScripts.equals(localScripts)) {
-				try {
-					com.gitblit.utils.FileUtils.copy(localScripts, warScripts.listFiles());
-				} catch (IOException e) {
-					logger.error(MessageFormat.format(
-							"Failed to copy included Groovy scripts from {0} to {1}",
-							warScripts, localScripts));
-				}
-			}
-		}
-
-		// merge the WebXmlSettings into the runtime settings (for backwards-compatibilty)
-		runtimeSettings.merge(webxmlSettings);
-
-		// settings are to be stored in openshift/gitblit.properties
-		File localSettings = new File(base, "gitblit.properties");
-		FileSettings fileSettings = new FileSettings(localSettings.getAbsolutePath());
-
-		// merge the stored settings into the runtime settings
-		//
-		// if runtimeSettings is also a FileSettings w/o a specified target file,
-		// the target file for runtimeSettings is set to "localSettings".
-		runtimeSettings.merge(fileSettings);
-
-		return base;
+	@Override
+	public boolean supportsAddUser() {
+		return userManager.supportsAddUser();
 	}
 
-	protected void extractResources(ServletContext context, String path, File toDir) {
-		for (String resource : context.getResourcePaths(path)) {
-			// extract the resource to the directory if it does not exist
-			File f = new File(toDir, resource.substring(path.length()));
-			if (!f.exists()) {
-				InputStream is = null;
-				OutputStream os = null;
-				try {
-					if (resource.charAt(resource.length() - 1) == '/') {
-						// directory
-						f.mkdirs();
-						extractResources(context, resource, f);
-					} else {
-						// file
-						f.getParentFile().mkdirs();
-						is = context.getResourceAsStream(resource);
-						os = new FileOutputStream(f);
-						byte [] buffer = new byte[4096];
-						int len = 0;
-						while ((len = is.read(buffer)) > -1) {
-							os.write(buffer, 0, len);
-						}
-					}
-				} catch (FileNotFoundException e) {
-					logger.error("Failed to find resource \"" + resource + "\"", e);
-				} catch (IOException e) {
-					logger.error("Failed to copy resource \"" + resource + "\" to " + f, e);
-				} finally {
-					if (is != null) {
-						try {
-							is.close();
-						} catch (IOException e) {
-							// ignore
-						}
-					}
-					if (os != null) {
-						try {
-							os.close();
-						} catch (IOException e) {
-							// ignore
-						}
-					}
-				}
-			}
-		}
+	@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);
+	}
+
+	@Override
+	public boolean deleteUserModel(UserModel model) {
+		return userManager.deleteUserModel(model);
+	}
+
+	@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
+	 */
+
+	@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);
+	}
+
+	@Override
+	public boolean deleteRepositoryModel(RepositoryModel model) {
+		return repositoryManager.deleteRepositoryModel(model);
+	}
+
+	@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
+	 */
+
+	@Override
+	public List<ProjectModel> getProjectModels(UserModel user, boolean includeUsers) {
+		return projectManager.getProjectModels(user, includeUsers);
+	}
+
+	@Override
+	public ProjectModel getProjectModel(String name, UserModel user) {
+		return projectManager.getProjectModel(name, user);
+	}
+
+	@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
+	 */
+
+	@Override
+	public File getProposalsFolder() {
+		return federationManager.getProposalsFolder();
+	}
+
+	@Override
+	public UserModel getFederationUser() {
+		return federationManager.getFederationUser();
+	}
+
+	@Override
+	public boolean canFederate() {
+		return federationManager.canFederate();
+	}
+
+	@Override
+	public List<FederationModel> getFederationRegistrations() {
+		return federationManager.getFederationRegistrations();
+	}
+
+	@Override
+	public FederationModel getFederationRegistration(String url, String name) {
+		return federationManager.getFederationRegistration(url, name);
+	}
+
+	@Override
+	public List<FederationSet> getFederationSets(String gitblitUrl) {
+		return federationManager.getFederationSets(gitblitUrl);
+	}
+
+	@Override
+	public List<String> getFederationTokens() {
+		return federationManager.getFederationTokens();
+	}
+
+	@Override
+	public String getFederationToken(FederationToken type) {
+		return federationManager.getFederationToken(type);
+	}
+
+	@Override
+	public String getFederationToken(String value) {
+		return federationManager.getFederationToken(value);
+	}
+
+	@Override
+	public boolean validateFederationRequest(FederationRequest req, String token) {
+		return federationManager.validateFederationRequest(req, token);
+	}
+
+	@Override
+	public boolean acknowledgeFederationStatus(String identification, FederationModel registration) {
+		return federationManager.acknowledgeFederationStatus(identification, registration);
+	}
+
+	@Override
+	public List<FederationModel> getFederationResultRegistrations() {
+		return federationManager.getFederationResultRegistrations();
+	}
+
+	@Override
+	public boolean submitFederationProposal(FederationProposal proposal, String gitblitUrl) {
+		return federationManager.submitFederationProposal(proposal, gitblitUrl);
+	}
+
+	@Override
+	public List<FederationProposal> getPendingFederationProposals() {
+		return federationManager.getPendingFederationProposals();
+	}
+
+	@Override
+	public Map<String, RepositoryModel> getRepositories(String gitblitUrl, String token) {
+		return federationManager.getRepositories(gitblitUrl, token);
+	}
+
+	@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();
 	}
 }

--
Gitblit v1.9.1