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.

GitBlitWebApp.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /*
  2. * Copyright 2011 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.wicket;
  17. import java.util.Date;
  18. import java.util.HashMap;
  19. import java.util.Locale;
  20. import java.util.Map;
  21. import java.util.TimeZone;
  22. import org.apache.wicket.Application;
  23. import org.apache.wicket.Request;
  24. import org.apache.wicket.Response;
  25. import org.apache.wicket.Session;
  26. import org.apache.wicket.application.IClassResolver;
  27. import org.apache.wicket.markup.html.WebPage;
  28. import org.apache.wicket.protocol.http.WebApplication;
  29. import ro.fortsoft.pf4j.PluginState;
  30. import ro.fortsoft.pf4j.PluginWrapper;
  31. import com.gitblit.IStoredSettings;
  32. import com.gitblit.Keys;
  33. import com.gitblit.extensions.GitblitWicketPlugin;
  34. import com.gitblit.manager.IAuthenticationManager;
  35. import com.gitblit.manager.IFederationManager;
  36. import com.gitblit.manager.IGitblit;
  37. import com.gitblit.manager.INotificationManager;
  38. import com.gitblit.manager.IPluginManager;
  39. import com.gitblit.manager.IProjectManager;
  40. import com.gitblit.manager.IRepositoryManager;
  41. import com.gitblit.manager.IRuntimeManager;
  42. import com.gitblit.manager.IUserManager;
  43. import com.gitblit.tickets.ITicketService;
  44. import com.gitblit.transport.ssh.IPublicKeyManager;
  45. import com.gitblit.wicket.pages.ActivityPage;
  46. import com.gitblit.wicket.pages.BlamePage;
  47. import com.gitblit.wicket.pages.BlobDiffPage;
  48. import com.gitblit.wicket.pages.BlobPage;
  49. import com.gitblit.wicket.pages.BranchesPage;
  50. import com.gitblit.wicket.pages.CommitDiffPage;
  51. import com.gitblit.wicket.pages.CommitPage;
  52. import com.gitblit.wicket.pages.ComparePage;
  53. import com.gitblit.wicket.pages.DocPage;
  54. import com.gitblit.wicket.pages.DocsPage;
  55. import com.gitblit.wicket.pages.EditMilestonePage;
  56. import com.gitblit.wicket.pages.EditRepositoryPage;
  57. import com.gitblit.wicket.pages.EditTicketPage;
  58. import com.gitblit.wicket.pages.ExportTicketPage;
  59. import com.gitblit.wicket.pages.FederationRegistrationPage;
  60. import com.gitblit.wicket.pages.ForkPage;
  61. import com.gitblit.wicket.pages.ForksPage;
  62. import com.gitblit.wicket.pages.GitSearchPage;
  63. import com.gitblit.wicket.pages.HistoryPage;
  64. import com.gitblit.wicket.pages.LogPage;
  65. import com.gitblit.wicket.pages.LogoutPage;
  66. import com.gitblit.wicket.pages.LuceneSearchPage;
  67. import com.gitblit.wicket.pages.MetricsPage;
  68. import com.gitblit.wicket.pages.MyDashboardPage;
  69. import com.gitblit.wicket.pages.MyTicketsPage;
  70. import com.gitblit.wicket.pages.NewMilestonePage;
  71. import com.gitblit.wicket.pages.NewRepositoryPage;
  72. import com.gitblit.wicket.pages.NewTicketPage;
  73. import com.gitblit.wicket.pages.OverviewPage;
  74. import com.gitblit.wicket.pages.PatchPage;
  75. import com.gitblit.wicket.pages.ProjectPage;
  76. import com.gitblit.wicket.pages.ProjectsPage;
  77. import com.gitblit.wicket.pages.ReflogPage;
  78. import com.gitblit.wicket.pages.RepositoriesPage;
  79. import com.gitblit.wicket.pages.ReviewProposalPage;
  80. import com.gitblit.wicket.pages.SummaryPage;
  81. import com.gitblit.wicket.pages.TagPage;
  82. import com.gitblit.wicket.pages.TagsPage;
  83. import com.gitblit.wicket.pages.TeamsPage;
  84. import com.gitblit.wicket.pages.TicketsPage;
  85. import com.gitblit.wicket.pages.TreePage;
  86. import com.gitblit.wicket.pages.UserPage;
  87. import com.gitblit.wicket.pages.UsersPage;
  88. public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
  89. private final Class<? extends WebPage> homePageClass = MyDashboardPage.class;
  90. private final Class<? extends WebPage> newRepositoryPageClass = NewRepositoryPage.class;
  91. private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>();
  92. private final IStoredSettings settings;
  93. private final IRuntimeManager runtimeManager;
  94. private final IPluginManager pluginManager;
  95. private final INotificationManager notificationManager;
  96. private final IUserManager userManager;
  97. private final IAuthenticationManager authenticationManager;
  98. private final IPublicKeyManager publicKeyManager;
  99. private final IRepositoryManager repositoryManager;
  100. private final IProjectManager projectManager;
  101. private final IFederationManager federationManager;
  102. private final IGitblit gitblit;
  103. public GitBlitWebApp(
  104. IRuntimeManager runtimeManager,
  105. IPluginManager pluginManager,
  106. INotificationManager notificationManager,
  107. IUserManager userManager,
  108. IAuthenticationManager authenticationManager,
  109. IPublicKeyManager publicKeyManager,
  110. IRepositoryManager repositoryManager,
  111. IProjectManager projectManager,
  112. IFederationManager federationManager,
  113. IGitblit gitblit) {
  114. super();
  115. this.settings = runtimeManager.getSettings();
  116. this.runtimeManager = runtimeManager;
  117. this.pluginManager = pluginManager;
  118. this.notificationManager = notificationManager;
  119. this.userManager = userManager;
  120. this.authenticationManager = authenticationManager;
  121. this.publicKeyManager = publicKeyManager;
  122. this.repositoryManager = repositoryManager;
  123. this.projectManager = projectManager;
  124. this.federationManager = federationManager;
  125. this.gitblit = gitblit;
  126. }
  127. @Override
  128. public void init() {
  129. super.init();
  130. // Setup page authorization mechanism
  131. boolean useAuthentication = settings.getBoolean(Keys.web.authenticateViewPages, false)
  132. || settings.getBoolean(Keys.web.authenticateAdminPages, false);
  133. if (useAuthentication) {
  134. AuthorizationStrategy authStrategy = new AuthorizationStrategy(settings, homePageClass);
  135. getSecuritySettings().setAuthorizationStrategy(authStrategy);
  136. getSecuritySettings().setUnauthorizedComponentInstantiationListener(authStrategy);
  137. }
  138. // Grab Browser info (like timezone, etc)
  139. if (settings.getBoolean(Keys.web.useClientTimezone, false)) {
  140. getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
  141. }
  142. // configure the resource cache duration to 90 days for deployment
  143. if (!isDebugMode()) {
  144. getResourceSettings().setDefaultCacheDuration(90 * 86400);
  145. }
  146. // setup the standard gitweb-ish urls
  147. mount("/repositories", RepositoriesPage.class);
  148. mount("/overview", OverviewPage.class, "r", "h");
  149. mount("/summary", SummaryPage.class, "r");
  150. mount("/reflog", ReflogPage.class, "r", "h");
  151. mount("/commits", LogPage.class, "r", "h");
  152. mount("/log", LogPage.class, "r", "h");
  153. mount("/tags", TagsPage.class, "r");
  154. mount("/branches", BranchesPage.class, "r");
  155. mount("/commit", CommitPage.class, "r", "h");
  156. mount("/tag", TagPage.class, "r", "h");
  157. mount("/tree", TreePage.class, "r", "h", "f");
  158. mount("/blob", BlobPage.class, "r", "h", "f");
  159. mount("/blobdiff", BlobDiffPage.class, "r", "h", "f");
  160. mount("/commitdiff", CommitDiffPage.class, "r", "h");
  161. mount("/compare", ComparePage.class, "r", "h");
  162. mount("/patch", PatchPage.class, "r", "h", "f");
  163. mount("/history", HistoryPage.class, "r", "h", "f");
  164. mount("/search", GitSearchPage.class);
  165. mount("/metrics", MetricsPage.class, "r");
  166. mount("/blame", BlamePage.class, "r", "h", "f");
  167. mount("/users", UsersPage.class);
  168. mount("/teams", TeamsPage.class);
  169. mount("/logout", LogoutPage.class);
  170. // setup ticket urls
  171. mount("/tickets", TicketsPage.class, "r", "h");
  172. mount("/tickets/new", NewTicketPage.class, "r");
  173. mount("/tickets/edit", EditTicketPage.class, "r", "h");
  174. mount("/tickets/export", ExportTicketPage.class, "r", "h");
  175. mount("/milestones/new", NewMilestonePage.class, "r");
  176. mount("/milestones/edit", EditMilestonePage.class, "r", "h");
  177. mount("/mytickets", MyTicketsPage.class, "r", "h");
  178. // setup the markup document urls
  179. mount("/docs", DocsPage.class, "r");
  180. mount("/doc", DocPage.class, "r", "h", "f");
  181. // federation urls
  182. mount("/proposal", ReviewProposalPage.class, "t");
  183. mount("/registration", FederationRegistrationPage.class, "u", "n");
  184. mount("/new", NewRepositoryPage.class);
  185. mount("/edit", EditRepositoryPage.class, "r");
  186. mount("/activity", ActivityPage.class, "r", "h");
  187. mount("/lucene", LuceneSearchPage.class);
  188. mount("/project", ProjectPage.class, "p");
  189. mount("/projects", ProjectsPage.class);
  190. mount("/user", UserPage.class, "user");
  191. mount("/forks", ForksPage.class, "r");
  192. mount("/fork", ForkPage.class, "r");
  193. // allow started Wicket plugins to initialize
  194. for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) {
  195. if (PluginState.STARTED != pluginWrapper.getPluginState()) {
  196. continue;
  197. }
  198. if (pluginWrapper.getPlugin() instanceof GitblitWicketPlugin) {
  199. GitblitWicketPlugin wicketPlugin = (GitblitWicketPlugin) pluginWrapper.getPlugin();
  200. wicketPlugin.init(this);
  201. }
  202. }
  203. // customize the Wicket class resolver to load from plugins
  204. IClassResolver coreResolver = getApplicationSettings().getClassResolver();
  205. PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
  206. getApplicationSettings().setClassResolver(classResolver);
  207. getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
  208. }
  209. /* (non-Javadoc)
  210. * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, java.lang.String)
  211. */
  212. @Override
  213. public void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
  214. if (parameters == null) {
  215. parameters = new String[] {};
  216. }
  217. if (!settings.getBoolean(Keys.web.mountParameters, true)) {
  218. parameters = new String[] {};
  219. }
  220. mount(new GitblitParamUrlCodingStrategy(settings, location, clazz, parameters));
  221. // map the mount point to the cache control definition
  222. if (clazz.isAnnotationPresent(CacheControl.class)) {
  223. CacheControl cacheControl = clazz.getAnnotation(CacheControl.class);
  224. cacheablePages.put(location.substring(1), cacheControl);
  225. }
  226. }
  227. /* (non-Javadoc)
  228. * @see com.gitblit.wicket.Webapp#getHomePage()
  229. */
  230. @Override
  231. public Class<? extends WebPage> getHomePage() {
  232. return homePageClass;
  233. }
  234. public Class<? extends WebPage> getNewRepositoryPage() {
  235. return newRepositoryPageClass;
  236. }
  237. /* (non-Javadoc)
  238. * @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String)
  239. */
  240. @Override
  241. public boolean isCacheablePage(String mountPoint) {
  242. return cacheablePages.containsKey(mountPoint);
  243. }
  244. /* (non-Javadoc)
  245. * @see com.gitblit.wicket.Webapp#getCacheControl(java.lang.String)
  246. */
  247. @Override
  248. public CacheControl getCacheControl(String mountPoint) {
  249. return cacheablePages.get(mountPoint);
  250. }
  251. @Override
  252. public final Session newSession(Request request, Response response) {
  253. GitBlitWebSession gitBlitWebSession = new GitBlitWebSession(request);
  254. Locale forcedLocale = runtime().getLocale();
  255. if (forcedLocale != null) {
  256. gitBlitWebSession.setLocale(forcedLocale);
  257. }
  258. return gitBlitWebSession;
  259. }
  260. /* (non-Javadoc)
  261. * @see com.gitblit.wicket.Webapp#settings()
  262. */
  263. @Override
  264. public IStoredSettings settings() {
  265. return settings;
  266. }
  267. /* (non-Javadoc)
  268. * @see com.gitblit.wicket.Webapp#isDebugMode()
  269. */
  270. @Override
  271. public boolean isDebugMode() {
  272. return runtimeManager.isDebugMode();
  273. }
  274. /*
  275. * These methods look strange... and they are... but they are the first
  276. * step towards modularization across multiple commits.
  277. */
  278. /* (non-Javadoc)
  279. * @see com.gitblit.wicket.Webapp#getBootDate()
  280. */
  281. @Override
  282. public Date getBootDate() {
  283. return runtimeManager.getBootDate();
  284. }
  285. /* (non-Javadoc)
  286. * @see com.gitblit.wicket.Webapp#getLastActivityDate()
  287. */
  288. @Override
  289. public Date getLastActivityDate() {
  290. return repositoryManager.getLastActivityDate();
  291. }
  292. /* (non-Javadoc)
  293. * @see com.gitblit.wicket.Webapp#runtime()
  294. */
  295. @Override
  296. public IRuntimeManager runtime() {
  297. return runtimeManager;
  298. }
  299. /* (non-Javadoc)
  300. * @see com.gitblit.wicket.Webapp#plugins()
  301. */
  302. @Override
  303. public IPluginManager plugins() {
  304. return pluginManager;
  305. }
  306. /* (non-Javadoc)
  307. * @see com.gitblit.wicket.Webapp#notifier()
  308. */
  309. @Override
  310. public INotificationManager notifier() {
  311. return notificationManager;
  312. }
  313. /* (non-Javadoc)
  314. * @see com.gitblit.wicket.Webapp#users()
  315. */
  316. @Override
  317. public IUserManager users() {
  318. return userManager;
  319. }
  320. /* (non-Javadoc)
  321. * @see com.gitblit.wicket.Webapp#authentication()
  322. */
  323. @Override
  324. public IAuthenticationManager authentication() {
  325. return authenticationManager;
  326. }
  327. /* (non-Javadoc)
  328. * @see com.gitblit.wicket.Webapp#keys()
  329. */
  330. @Override
  331. public IPublicKeyManager keys() {
  332. return publicKeyManager;
  333. }
  334. /* (non-Javadoc)
  335. * @see com.gitblit.wicket.Webapp#repositories()
  336. */
  337. @Override
  338. public IRepositoryManager repositories() {
  339. return repositoryManager;
  340. }
  341. /* (non-Javadoc)
  342. * @see com.gitblit.wicket.Webapp#projects()
  343. */
  344. @Override
  345. public IProjectManager projects() {
  346. return projectManager;
  347. }
  348. /* (non-Javadoc)
  349. * @see com.gitblit.wicket.Webapp#federation()
  350. */
  351. @Override
  352. public IFederationManager federation() {
  353. return federationManager;
  354. }
  355. /* (non-Javadoc)
  356. * @see com.gitblit.wicket.Webapp#gitblit()
  357. */
  358. @Override
  359. public IGitblit gitblit() {
  360. return gitblit;
  361. }
  362. /* (non-Javadoc)
  363. * @see com.gitblit.wicket.Webapp#tickets()
  364. */
  365. @Override
  366. public ITicketService tickets() {
  367. return gitblit.getTicketService();
  368. }
  369. /* (non-Javadoc)
  370. * @see com.gitblit.wicket.Webapp#getTimezone()
  371. */
  372. @Override
  373. public TimeZone getTimezone() {
  374. return runtimeManager.getTimezone();
  375. }
  376. @Override
  377. public final String getConfigurationType() {
  378. if (runtimeManager.isDebugMode()) {
  379. return Application.DEVELOPMENT;
  380. }
  381. return Application.DEPLOYMENT;
  382. }
  383. public static GitBlitWebApp get() {
  384. return (GitBlitWebApp) WebApplication.get();
  385. }
  386. }