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 9.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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. return deleteRepositoryModel(repository);
  161. }
  162. @Override
  163. public boolean deleteRepositoryModel(RepositoryModel model) {
  164. boolean success = repositoryManager.deleteRepositoryModel(model);
  165. if (success && ticketService != null) {
  166. return ticketService.deleteAll(model);
  167. }
  168. return success;
  169. }
  170. /**
  171. * Returns the configured ticket service.
  172. *
  173. * @return a ticket service
  174. */
  175. @Override
  176. public ITicketService getTicketService() {
  177. return ticketService;
  178. }
  179. protected void configureTicketService() {
  180. String clazz = settings.getString(Keys.tickets.service, NullTicketService.class.getName());
  181. if (StringUtils.isEmpty(clazz)) {
  182. clazz = NullTicketService.class.getName();
  183. }
  184. try {
  185. Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz);
  186. ticketService = injector.get(serviceClass).start();
  187. if (ticketService instanceof NullTicketService) {
  188. logger.warn("No ticket service configured.");
  189. } else if (ticketService.isReady()) {
  190. logger.info("{} is ready.", ticketService);
  191. } else {
  192. logger.warn("{} is disabled.", ticketService);
  193. }
  194. } catch (Exception e) {
  195. logger.error("failed to create ticket service " + clazz, e);
  196. ticketService = injector.get(NullTicketService.class).start();
  197. }
  198. }
  199. /**
  200. * A nested Dagger graph is used for constructor dependency injection of
  201. * complex classes.
  202. *
  203. * @author James Moger
  204. *
  205. */
  206. @Module(
  207. library = true,
  208. injects = {
  209. IStoredSettings.class,
  210. // core managers
  211. IRuntimeManager.class,
  212. INotificationManager.class,
  213. IUserManager.class,
  214. IAuthenticationManager.class,
  215. IRepositoryManager.class,
  216. IProjectManager.class,
  217. IFederationManager.class,
  218. // the monolithic manager
  219. IGitblit.class,
  220. // ticket services
  221. NullTicketService.class,
  222. FileTicketService.class,
  223. BranchTicketService.class,
  224. RedisTicketService.class
  225. }
  226. )
  227. class GitBlitModule {
  228. @Provides @Singleton IStoredSettings provideSettings() {
  229. return settings;
  230. }
  231. @Provides @Singleton IRuntimeManager provideRuntimeManager() {
  232. return runtimeManager;
  233. }
  234. @Provides @Singleton INotificationManager provideNotificationManager() {
  235. return notificationManager;
  236. }
  237. @Provides @Singleton IUserManager provideUserManager() {
  238. return userManager;
  239. }
  240. @Provides @Singleton IAuthenticationManager provideAuthenticationManager() {
  241. return authenticationManager;
  242. }
  243. @Provides @Singleton IRepositoryManager provideRepositoryManager() {
  244. return repositoryManager;
  245. }
  246. @Provides @Singleton IProjectManager provideProjectManager() {
  247. return projectManager;
  248. }
  249. @Provides @Singleton IFederationManager provideFederationManager() {
  250. return federationManager;
  251. }
  252. @Provides @Singleton IGitblit provideGitblit() {
  253. return GitBlit.this;
  254. }
  255. @Provides @Singleton NullTicketService provideNullTicketService() {
  256. return new NullTicketService(
  257. runtimeManager,
  258. notificationManager,
  259. userManager,
  260. repositoryManager);
  261. }
  262. @Provides @Singleton FileTicketService provideFileTicketService() {
  263. return new FileTicketService(
  264. runtimeManager,
  265. notificationManager,
  266. userManager,
  267. repositoryManager);
  268. }
  269. @Provides @Singleton BranchTicketService provideBranchTicketService() {
  270. return new BranchTicketService(
  271. runtimeManager,
  272. notificationManager,
  273. userManager,
  274. repositoryManager);
  275. }
  276. @Provides @Singleton RedisTicketService provideRedisTicketService() {
  277. return new RedisTicketService(
  278. runtimeManager,
  279. notificationManager,
  280. userManager,
  281. repositoryManager);
  282. }
  283. }
  284. }