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

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