You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitBlit.java 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. * Copyright 2013 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit;
  17. import java.text.MessageFormat;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import javax.inject.Singleton;
  21. import javax.servlet.http.HttpServletRequest;
  22. import com.gitblit.Constants.AccessPermission;
  23. import com.gitblit.manager.GitblitManager;
  24. import com.gitblit.manager.IAuthenticationManager;
  25. import com.gitblit.manager.IFederationManager;
  26. import com.gitblit.manager.IGitblit;
  27. import com.gitblit.manager.INotificationManager;
  28. import com.gitblit.manager.IProjectManager;
  29. import com.gitblit.manager.IRepositoryManager;
  30. import com.gitblit.manager.IRuntimeManager;
  31. import com.gitblit.manager.IUserManager;
  32. import com.gitblit.manager.ServicesManager;
  33. import com.gitblit.models.RepositoryModel;
  34. import com.gitblit.models.RepositoryUrl;
  35. import com.gitblit.models.UserModel;
  36. import com.gitblit.tickets.BranchTicketService;
  37. import com.gitblit.tickets.FileTicketService;
  38. import com.gitblit.tickets.ITicketService;
  39. import com.gitblit.tickets.NullTicketService;
  40. import com.gitblit.tickets.RedisTicketService;
  41. import com.gitblit.utils.StringUtils;
  42. import dagger.Module;
  43. import dagger.ObjectGraph;
  44. import dagger.Provides;
  45. /**
  46. * GitBlit is the aggregate manager for the Gitblit webapp. It provides all
  47. * management functions and also manages some long-running services.
  48. *
  49. * @author James Moger
  50. *
  51. */
  52. public class GitBlit extends GitblitManager {
  53. private final ObjectGraph injector;
  54. private final ServicesManager servicesManager;
  55. private ITicketService ticketService;
  56. public GitBlit(
  57. IRuntimeManager runtimeManager,
  58. INotificationManager notificationManager,
  59. IUserManager userManager,
  60. IAuthenticationManager authenticationManager,
  61. IRepositoryManager repositoryManager,
  62. IProjectManager projectManager,
  63. IFederationManager federationManager) {
  64. super(runtimeManager,
  65. notificationManager,
  66. userManager,
  67. authenticationManager,
  68. repositoryManager,
  69. projectManager,
  70. federationManager);
  71. this.injector = ObjectGraph.create(getModules());
  72. this.servicesManager = new ServicesManager(this);
  73. }
  74. @Override
  75. public GitBlit start() {
  76. super.start();
  77. logger.info("Starting services manager...");
  78. servicesManager.start();
  79. configureTicketService();
  80. return this;
  81. }
  82. @Override
  83. public GitBlit stop() {
  84. super.stop();
  85. servicesManager.stop();
  86. ticketService.stop();
  87. return this;
  88. }
  89. protected Object [] getModules() {
  90. return new Object [] { new GitBlitModule()};
  91. }
  92. /**
  93. * Returns a list of repository URLs and the user access permission.
  94. *
  95. * @param request
  96. * @param user
  97. * @param repository
  98. * @return a list of repository urls
  99. */
  100. @Override
  101. public List<RepositoryUrl> getRepositoryUrls(HttpServletRequest request, UserModel user, RepositoryModel repository) {
  102. if (user == null) {
  103. user = UserModel.ANONYMOUS;
  104. }
  105. String username = StringUtils.encodeUsername(UserModel.ANONYMOUS.equals(user) ? "" : user.username);
  106. List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
  107. // http/https url
  108. if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
  109. AccessPermission permission = user.getRepositoryPermission(repository).permission;
  110. if (permission.exceeds(AccessPermission.NONE)) {
  111. list.add(new RepositoryUrl(getRepositoryUrl(request, username, repository), permission));
  112. }
  113. }
  114. // git daemon url
  115. String gitDaemonUrl = servicesManager.getGitDaemonUrl(request, user, repository);
  116. if (!StringUtils.isEmpty(gitDaemonUrl)) {
  117. AccessPermission permission = servicesManager.getGitDaemonAccessPermission(user, repository);
  118. if (permission.exceeds(AccessPermission.NONE)) {
  119. list.add(new RepositoryUrl(gitDaemonUrl, permission));
  120. }
  121. }
  122. // add all other urls
  123. // {0} = repository
  124. // {1} = username
  125. for (String url : settings.getStrings(Keys.web.otherUrls)) {
  126. if (url.contains("{1}")) {
  127. // external url requires username, only add url IF we have one
  128. if (!StringUtils.isEmpty(username)) {
  129. list.add(new RepositoryUrl(MessageFormat.format(url, repository.name, username), null));
  130. }
  131. } else {
  132. // external url does not require username
  133. list.add(new RepositoryUrl(MessageFormat.format(url, repository.name), null));
  134. }
  135. }
  136. return list;
  137. }
  138. /**
  139. * Detect renames and reindex as appropriate.
  140. */
  141. @Override
  142. public void updateRepositoryModel(String repositoryName, RepositoryModel repository,
  143. boolean isCreate) throws GitBlitException {
  144. RepositoryModel oldModel = null;
  145. boolean isRename = !isCreate && !repositoryName.equalsIgnoreCase(repository.name);
  146. if (isRename) {
  147. oldModel = repositoryManager.getRepositoryModel(repositoryName);
  148. }
  149. super.updateRepositoryModel(repositoryName, repository, isCreate);
  150. if (isRename && ticketService != null) {
  151. ticketService.rename(oldModel, repository);
  152. }
  153. }
  154. /**
  155. * Delete the repository and all associated tickets.
  156. */
  157. @Override
  158. public boolean deleteRepository(String repositoryName) {
  159. RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName);
  160. boolean success = repositoryManager.deleteRepository(repositoryName);
  161. if (success && ticketService != null) {
  162. return ticketService.deleteAll(repository);
  163. }
  164. return success;
  165. }
  166. /**
  167. * Returns the configured ticket service.
  168. *
  169. * @return a ticket service
  170. */
  171. @Override
  172. public ITicketService getTicketService() {
  173. return ticketService;
  174. }
  175. protected void configureTicketService() {
  176. String clazz = settings.getString(Keys.tickets.service, NullTicketService.class.getName());
  177. if (StringUtils.isEmpty(clazz)) {
  178. clazz = NullTicketService.class.getName();
  179. }
  180. try {
  181. Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz);
  182. ticketService = injector.get(serviceClass).start();
  183. if (ticketService.isReady()) {
  184. logger.info("{} is ready.", ticketService);
  185. } else {
  186. logger.warn("{} is disabled.", ticketService);
  187. }
  188. } catch (Exception e) {
  189. logger.error("failed to create ticket service " + clazz, e);
  190. ticketService = injector.get(NullTicketService.class).start();
  191. }
  192. }
  193. /**
  194. * A nested Dagger graph is used for constructor dependency injection of
  195. * complex classes.
  196. *
  197. * @author James Moger
  198. *
  199. */
  200. @Module(
  201. library = true,
  202. injects = {
  203. IStoredSettings.class,
  204. // core managers
  205. IRuntimeManager.class,
  206. INotificationManager.class,
  207. IUserManager.class,
  208. IAuthenticationManager.class,
  209. IRepositoryManager.class,
  210. IProjectManager.class,
  211. IFederationManager.class,
  212. // the monolithic manager
  213. IGitblit.class,
  214. // ticket services
  215. NullTicketService.class,
  216. FileTicketService.class,
  217. BranchTicketService.class,
  218. RedisTicketService.class
  219. }
  220. )
  221. class GitBlitModule {
  222. @Provides @Singleton IStoredSettings provideSettings() {
  223. return settings;
  224. }
  225. @Provides @Singleton IRuntimeManager provideRuntimeManager() {
  226. return runtimeManager;
  227. }
  228. @Provides @Singleton INotificationManager provideNotificationManager() {
  229. return notificationManager;
  230. }
  231. @Provides @Singleton IUserManager provideUserManager() {
  232. return userManager;
  233. }
  234. @Provides @Singleton IAuthenticationManager provideAuthenticationManager() {
  235. return authenticationManager;
  236. }
  237. @Provides @Singleton IRepositoryManager provideRepositoryManager() {
  238. return repositoryManager;
  239. }
  240. @Provides @Singleton IProjectManager provideProjectManager() {
  241. return projectManager;
  242. }
  243. @Provides @Singleton IFederationManager provideFederationManager() {
  244. return federationManager;
  245. }
  246. @Provides @Singleton IGitblit provideGitblit() {
  247. return GitBlit.this;
  248. }
  249. }
  250. }