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.

ProjectPage.java 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * Copyright 2012 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.pages;
  17. import java.util.ArrayList;
  18. import java.util.Collections;
  19. import java.util.Comparator;
  20. import java.util.List;
  21. import org.apache.wicket.Component;
  22. import org.apache.wicket.PageParameters;
  23. import org.apache.wicket.markup.html.basic.Label;
  24. import org.apache.wicket.markup.html.link.ExternalLink;
  25. import com.gitblit.GitBlit;
  26. import com.gitblit.Keys;
  27. import com.gitblit.SyndicationServlet;
  28. import com.gitblit.models.ProjectModel;
  29. import com.gitblit.models.RepositoryModel;
  30. import com.gitblit.models.UserModel;
  31. import com.gitblit.utils.MarkdownUtils;
  32. import com.gitblit.utils.StringUtils;
  33. import com.gitblit.wicket.CacheControl;
  34. import com.gitblit.wicket.CacheControl.LastModified;
  35. import com.gitblit.wicket.GitBlitWebApp;
  36. import com.gitblit.wicket.GitBlitWebSession;
  37. import com.gitblit.wicket.GitblitRedirectException;
  38. import com.gitblit.wicket.PageRegistration;
  39. import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
  40. import com.gitblit.wicket.PageRegistration.DropDownMenuRegistration;
  41. import com.gitblit.wicket.WicketUtils;
  42. import com.gitblit.wicket.panels.FilterableRepositoryList;
  43. @CacheControl(LastModified.PROJECT)
  44. public class ProjectPage extends DashboardPage {
  45. List<ProjectModel> projectModels = new ArrayList<ProjectModel>();
  46. public ProjectPage() {
  47. super();
  48. throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
  49. }
  50. public ProjectPage(PageParameters params) {
  51. super(params);
  52. setup(params);
  53. }
  54. protected Class<? extends BasePage> getRootNavPageClass() {
  55. return RepositoriesPage.class;
  56. }
  57. @Override
  58. protected void setLastModified() {
  59. if (getClass().isAnnotationPresent(CacheControl.class)) {
  60. CacheControl cacheControl = getClass().getAnnotation(CacheControl.class);
  61. switch (cacheControl.value()) {
  62. case PROJECT:
  63. String projectName = WicketUtils.getProjectName(getPageParameters());
  64. if (!StringUtils.isEmpty(projectName)) {
  65. ProjectModel project = getProjectModel(projectName);
  66. if (project != null) {
  67. setLastModified(project.lastChange);
  68. }
  69. }
  70. break;
  71. default:
  72. super.setLastModified();
  73. }
  74. }
  75. }
  76. private void setup(PageParameters params) {
  77. setupPage("", "");
  78. // check to see if we should display a login message
  79. boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
  80. if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
  81. authenticationError("Please login");
  82. return;
  83. }
  84. String projectName = WicketUtils.getProjectName(params);
  85. if (StringUtils.isEmpty(projectName)) {
  86. throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
  87. }
  88. ProjectModel project = getProjectModel(projectName);
  89. if (project == null) {
  90. throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
  91. }
  92. add(new Label("projectTitle", project.getDisplayName()));
  93. add(new Label("projectDescription", project.description));
  94. String feedLink = SyndicationServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), projectName, null, 0);
  95. add(new ExternalLink("syndication", feedLink));
  96. add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(),
  97. null), feedLink));
  98. // project markdown message
  99. String pmessage = transformMarkdown(project.projectMarkdown);
  100. Component projectMessage = new Label("projectMessage", pmessage)
  101. .setEscapeModelStrings(false).setVisible(pmessage.length() > 0);
  102. add(projectMessage);
  103. // markdown message above repositories list
  104. String rmessage = transformMarkdown(project.repositoriesMarkdown);
  105. Component repositoriesMessage = new Label("repositoriesMessage", rmessage)
  106. .setEscapeModelStrings(false).setVisible(rmessage.length() > 0);
  107. add(repositoriesMessage);
  108. UserModel user = GitBlitWebSession.get().getUser();
  109. if (user == null) {
  110. user = UserModel.ANONYMOUS;
  111. }
  112. int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params);
  113. if (daysBack < 1) {
  114. daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7);
  115. }
  116. // reset the daysback parameter so that we have a complete project
  117. // repository list. the recent activity will be built up by the
  118. // reflog utils.
  119. params.remove("db");
  120. List<RepositoryModel> repositories = getRepositories(params);
  121. Collections.sort(repositories, new Comparator<RepositoryModel>() {
  122. @Override
  123. public int compare(RepositoryModel o1, RepositoryModel o2) {
  124. // reverse-chronological sort
  125. return o2.lastChange.compareTo(o1.lastChange);
  126. }
  127. });
  128. addActivity(user, repositories, getString("gb.recentActivity"), daysBack);
  129. if (repositories.isEmpty()) {
  130. add(new Label("repositoryList").setVisible(false));
  131. } else {
  132. FilterableRepositoryList repoList = new FilterableRepositoryList("repositoryList", repositories);
  133. repoList.setAllowCreate(user.canCreate(project.name + "/"));
  134. add(repoList);
  135. }
  136. }
  137. @Override
  138. protected void addDropDownMenus(List<PageRegistration> pages) {
  139. PageParameters params = getPageParameters();
  140. DropDownMenuRegistration menu = new DropDownMenuRegistration("gb.filters",
  141. ProjectPage.class);
  142. // preserve time filter option on repository choices
  143. menu.menuItems.addAll(getRepositoryFilterItems(params));
  144. // preserve repository filter option on time choices
  145. menu.menuItems.addAll(getTimeFilterItems(params));
  146. if (menu.menuItems.size() > 0) {
  147. // Reset Filter
  148. menu.menuItems.add(new DropDownMenuItem(getString("gb.reset"), "p", WicketUtils.getProjectName(params)));
  149. }
  150. pages.add(menu);
  151. DropDownMenuRegistration projects = new DropDownMenuRegistration("gb.projects",
  152. ProjectPage.class);
  153. projects.menuItems.addAll(getProjectsMenu());
  154. pages.add(projects);
  155. }
  156. @Override
  157. protected List<ProjectModel> getProjectModels() {
  158. if (projectModels.isEmpty()) {
  159. List<RepositoryModel> repositories = getRepositoryModels();
  160. List<ProjectModel> projects = GitBlit.self().getProjectModels(repositories, false);
  161. projectModels.addAll(projects);
  162. }
  163. return projectModels;
  164. }
  165. private ProjectModel getProjectModel(String name) {
  166. for (ProjectModel project : getProjectModels()) {
  167. if (name.equalsIgnoreCase(project.name)) {
  168. return project;
  169. }
  170. }
  171. return null;
  172. }
  173. protected List<DropDownMenuItem> getProjectsMenu() {
  174. List<DropDownMenuItem> menu = new ArrayList<DropDownMenuItem>();
  175. List<ProjectModel> projects = new ArrayList<ProjectModel>();
  176. for (ProjectModel model : getProjectModels()) {
  177. if (!model.isUserProject()) {
  178. projects.add(model);
  179. }
  180. }
  181. int maxProjects = 15;
  182. boolean showAllProjects = projects.size() > maxProjects;
  183. if (showAllProjects) {
  184. // sort by last changed
  185. Collections.sort(projects, new Comparator<ProjectModel>() {
  186. @Override
  187. public int compare(ProjectModel o1, ProjectModel o2) {
  188. return o2.lastChange.compareTo(o1.lastChange);
  189. }
  190. });
  191. // take most recent subset
  192. projects = projects.subList(0, maxProjects);
  193. // sort those by name
  194. Collections.sort(projects);
  195. }
  196. for (ProjectModel project : projects) {
  197. menu.add(new DropDownMenuItem(project.getDisplayName(), "p", project.name));
  198. }
  199. if (showAllProjects) {
  200. menu.add(new DropDownMenuItem());
  201. menu.add(new DropDownMenuItem("all projects", null, null));
  202. }
  203. return menu;
  204. }
  205. private String transformMarkdown(String markdown) {
  206. String message = "";
  207. if (!StringUtils.isEmpty(markdown)) {
  208. // Read user-supplied message
  209. try {
  210. message = MarkdownUtils.transformMarkdown(markdown);
  211. } catch (Throwable t) {
  212. message = getString("gb.failedToRead") + " " + markdown;
  213. warn(message, t);
  214. }
  215. }
  216. return message;
  217. }
  218. }