From a1f27e2fac7b38b87645bd53b7e023484c796f1c 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] Extract ProjectManager from the GitBlit singleton
---
src/main/java/com/gitblit/GitBlit.java | 256 --------------------------------------------------
1 files changed, 3 insertions(+), 253 deletions(-)
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 4e8822b..493f8fc 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -32,10 +32,8 @@
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -50,8 +48,6 @@
import org.apache.wicket.resource.ContextRelativeResource;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
import org.slf4j.Logger;
import com.gitblit.Constants.AccessPermission;
@@ -77,7 +73,6 @@
import com.gitblit.models.FederationProposal;
import com.gitblit.models.FederationSet;
import com.gitblit.models.GitClientApplication;
-import com.gitblit.models.ProjectModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.ServerSettings;
@@ -86,12 +81,10 @@
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.ContainerUtils;
-import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.FederationUtils;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.JsonUtils;
-import com.gitblit.utils.ModelUtils;
import com.gitblit.utils.ObjectCache;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitblitWicketFilter;
@@ -117,8 +110,7 @@
*/
@WebListener
public class GitBlit extends DaggerContextListener
- implements IProjectManager,
- IFederationManager,
+ implements IFederationManager,
IGitblitManager {
private static GitBlit gitblit;
@@ -138,15 +130,7 @@
private final Map<String, FederationModel> federationPullResults = new ConcurrentHashMap<String, FederationModel>();
- private final Map<String, ProjectModel> projectCache = new ConcurrentHashMap<String, ProjectModel>();
-
- private final ObjectCache<String> projectMarkdownCache = new ObjectCache<String>();
-
- private final ObjectCache<String> projectRepositoriesMarkdownCache = new ObjectCache<String>();
-
private IStoredSettings settings;
-
- private FileBasedConfig projectConfigs;
private FanoutService fanoutService;
@@ -442,237 +426,6 @@
}
}
- private void reloadProjectMarkdown(ProjectModel project) {
- // project markdown
- File pmkd = new File(getManager(IRepositoryManager.class).getRepositoriesFolder(), (project.isRoot ? "" : project.name) + "/project.mkd");
- if (pmkd.exists()) {
- Date lm = new Date(pmkd.lastModified());
- if (!projectMarkdownCache.hasCurrent(project.name, lm)) {
- String mkd = com.gitblit.utils.FileUtils.readContent(pmkd, "\n");
- projectMarkdownCache.updateObject(project.name, lm, mkd);
- }
- project.projectMarkdown = projectMarkdownCache.getObject(project.name);
- }
-
- // project repositories markdown
- File rmkd = new File(getManager(IRepositoryManager.class).getRepositoriesFolder(), (project.isRoot ? "" : project.name) + "/repositories.mkd");
- if (rmkd.exists()) {
- Date lm = new Date(rmkd.lastModified());
- if (!projectRepositoriesMarkdownCache.hasCurrent(project.name, lm)) {
- String mkd = com.gitblit.utils.FileUtils.readContent(rmkd, "\n");
- projectRepositoriesMarkdownCache.updateObject(project.name, lm, mkd);
- }
- project.repositoriesMarkdown = projectRepositoriesMarkdownCache.getObject(project.name);
- }
- }
-
-
- /**
- * Returns the map of project config. This map is cached and reloaded if
- * the underlying projects.conf file changes.
- *
- * @return project config map
- */
- private Map<String, ProjectModel> getProjectConfigs() {
- if (projectCache.isEmpty() || projectConfigs.isOutdated()) {
-
- try {
- projectConfigs.load();
- } catch (Exception e) {
- }
-
- // project configs
- String rootName = settings.getString(Keys.web.repositoryRootGroupName, "main");
- ProjectModel rootProject = new ProjectModel(rootName, true);
-
- Map<String, ProjectModel> configs = new HashMap<String, ProjectModel>();
- // cache the root project under its alias and an empty path
- configs.put("", rootProject);
- configs.put(rootProject.name.toLowerCase(), rootProject);
-
- for (String name : projectConfigs.getSubsections("project")) {
- ProjectModel project;
- if (name.equalsIgnoreCase(rootName)) {
- project = rootProject;
- } else {
- project = new ProjectModel(name);
- }
- project.title = projectConfigs.getString("project", name, "title");
- project.description = projectConfigs.getString("project", name, "description");
-
- reloadProjectMarkdown(project);
-
- configs.put(name.toLowerCase(), project);
- }
- projectCache.clear();
- projectCache.putAll(configs);
- }
- return projectCache;
- }
-
- /**
- * Returns a list of project models for the user.
- *
- * @param user
- * @param includeUsers
- * @return list of projects that are accessible to the user
- */
- @Override
- public List<ProjectModel> getProjectModels(UserModel user, boolean includeUsers) {
- Map<String, ProjectModel> configs = getProjectConfigs();
-
- // per-user project lists, this accounts for security and visibility
- Map<String, ProjectModel> map = new TreeMap<String, ProjectModel>();
- // root project
- map.put("", configs.get(""));
-
- for (RepositoryModel model : getManager(IRepositoryManager.class).getRepositoryModels(user)) {
- String rootPath = StringUtils.getRootPath(model.name).toLowerCase();
- if (!map.containsKey(rootPath)) {
- ProjectModel project;
- if (configs.containsKey(rootPath)) {
- // clone the project model because it's repository list will
- // be tailored for the requesting user
- project = DeepCopier.copy(configs.get(rootPath));
- } else {
- project = new ProjectModel(rootPath);
- }
- map.put(rootPath, project);
- }
- map.get(rootPath).addRepository(model);
- }
-
- // sort projects, root project first
- List<ProjectModel> projects;
- if (includeUsers) {
- // all projects
- projects = new ArrayList<ProjectModel>(map.values());
- Collections.sort(projects);
- projects.remove(map.get(""));
- projects.add(0, map.get(""));
- } else {
- // all non-user projects
- projects = new ArrayList<ProjectModel>();
- ProjectModel root = map.remove("");
- for (ProjectModel model : map.values()) {
- if (!model.isUserProject()) {
- projects.add(model);
- }
- }
- Collections.sort(projects);
- projects.add(0, root);
- }
- return projects;
- }
-
- /**
- * Returns the project model for the specified user.
- *
- * @param name
- * @param user
- * @return a project model, or null if it does not exist
- */
- @Override
- public ProjectModel getProjectModel(String name, UserModel user) {
- for (ProjectModel project : getProjectModels(user, true)) {
- if (project.name.equalsIgnoreCase(name)) {
- return project;
- }
- }
- return null;
- }
-
- /**
- * Returns a project model for the Gitblit/system user.
- *
- * @param name a project name
- * @return a project model or null if the project does not exist
- */
- @Override
- public ProjectModel getProjectModel(String name) {
- Map<String, ProjectModel> configs = getProjectConfigs();
- ProjectModel project = configs.get(name.toLowerCase());
- if (project == null) {
- project = new ProjectModel(name);
- if (ModelUtils.isPersonalRepository(name)) {
- UserModel user = getManager(IUserManager.class).getUserModel(ModelUtils.getUserNameFromRepoPath(name));
- if (user != null) {
- project.title = user.getDisplayName();
- project.description = "personal repositories";
- }
- }
- } else {
- // clone the object
- project = DeepCopier.copy(project);
- }
- if (StringUtils.isEmpty(name)) {
- // get root repositories
- for (String repository : getManager(IRepositoryManager.class).getRepositoryList()) {
- if (repository.indexOf('/') == -1) {
- project.addRepository(repository);
- }
- }
- } else {
- // get repositories in subfolder
- String folder = name.toLowerCase() + "/";
- for (String repository : getManager(IRepositoryManager.class).getRepositoryList()) {
- if (repository.toLowerCase().startsWith(folder)) {
- project.addRepository(repository);
- }
- }
- }
- if (project.repositories.size() == 0) {
- // no repositories == no project
- return null;
- }
-
- reloadProjectMarkdown(project);
- return project;
- }
-
- /**
- * Returns the list of project models that are referenced by the supplied
- * repository model list. This is an alternative method exists to ensure
- * Gitblit does not call getRepositoryModels(UserModel) twice in a request.
- *
- * @param repositoryModels
- * @param includeUsers
- * @return a list of project models
- */
- @Override
- public List<ProjectModel> getProjectModels(List<RepositoryModel> repositoryModels, boolean includeUsers) {
- Map<String, ProjectModel> projects = new LinkedHashMap<String, ProjectModel>();
- for (RepositoryModel repository : repositoryModels) {
- if (!includeUsers && repository.isPersonalRepository()) {
- // exclude personal repositories
- continue;
- }
- if (!projects.containsKey(repository.projectPath)) {
- ProjectModel project = getProjectModel(repository.projectPath);
- if (project == null) {
- logger.warn(MessageFormat.format("excluding project \"{0}\" from project list because it is empty!",
- repository.projectPath));
- continue;
- }
- projects.put(repository.projectPath, project);
- // clear the repo list in the project because that is the system
- // list, not the user-accessible list and start building the
- // user-accessible list
- project.repositories.clear();
- project.repositories.add(repository.name);
- project.lastChange = repository.lastChange;
- } else {
- // update the user-accessible list
- // this is used for repository count
- ProjectModel project = projects.get(repository.projectPath);
- project.repositories.add(repository.name);
- if (project.lastChange.before(repository.lastChange)) {
- project.lastChange = repository.lastChange;
- }
- }
- }
- return new ArrayList<ProjectModel>(projects.values());
- }
/**
* Returns Gitblit's scheduled executor service for scheduling tasks.
@@ -1173,7 +926,7 @@
getManager(IUserManager.class),
getManager(ISessionManager.class),
getManager(IRepositoryManager.class),
- this,
+ getManager(IProjectManager.class),
this,
this);
gitDaemon = new GitDaemon(gitblit);
@@ -1242,14 +995,11 @@
startManager(injector, IUserManager.class);
startManager(injector, ISessionManager.class);
startManager(injector, IRepositoryManager.class);
+ startManager(injector, IProjectManager.class);
logger.info("Gitblit base folder = " + baseFolder.getAbsolutePath());
loadSettingModels(runtime.getSettingsModel());
-
- // load and cache the project metadata
- projectConfigs = new FileBasedConfig(runtime.getFileOrFolder(Keys.web.projectsFile, "${baseFolder}/projects.conf"), FS.detect());
- getProjectConfigs();
if (true/*startFederation*/) {
configureFederation();
--
Gitblit v1.9.1