/* * Copyright 2012 gitblit.com. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.gitblit.wicket.pages; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; import com.gitblit.Keys; import com.gitblit.models.Menu.MenuDivider; import com.gitblit.models.Menu.MenuItem; import com.gitblit.models.Menu.ParameterMenuItem; import com.gitblit.models.NavLink.DropDownPageMenuNavLink; import com.gitblit.models.NavLink; import com.gitblit.models.ProjectModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.servlet.SyndicationServlet; import com.gitblit.utils.MarkdownUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.CacheControl.LastModified; import com.gitblit.wicket.GitBlitWebApp; import com.gitblit.wicket.GitBlitWebSession; import com.gitblit.wicket.GitblitRedirectException; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.panels.FilterableRepositoryList; @CacheControl(LastModified.PROJECT) public class ProjectPage extends DashboardPage { List<ProjectModel> projectModels = new ArrayList<ProjectModel>(); public ProjectPage() { super(); throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage()); } public ProjectPage(PageParameters params) { super(params); setup(params); } @Override protected Class<? extends BasePage> getRootNavPageClass() { return RepositoriesPage.class; } @Override protected void setLastModified() { if (getClass().isAnnotationPresent(CacheControl.class)) { CacheControl cacheControl = getClass().getAnnotation(CacheControl.class); switch (cacheControl.value()) { case PROJECT: String projectName = WicketUtils.getProjectName(getPageParameters()); if (!StringUtils.isEmpty(projectName)) { ProjectModel project = getProjectModel(projectName); if (project != null) { setLastModified(project.lastChange); } } break; default: super.setLastModified(); } } } private void setup(PageParameters params) { setupPage("", ""); // check to see if we should display a login message boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, true); if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) { authenticationError("Please login"); return; } String projectName = params == null ? null : WicketUtils.getProjectName(params); if (StringUtils.isEmpty(projectName)) { throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage()); } ProjectModel project = getProjectModel(projectName); if (project == null) { throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage()); } add(new Label("projectTitle", project.getDisplayName())); add(new Label("projectDescription", project.description)); String feedLink = SyndicationServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), projectName, null, 0); add(new ExternalLink("syndication", feedLink)); add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(), null), feedLink)); // project markdown message String pmessage = transformMarkdown(project.projectMarkdown); Component projectMessage = new Label("projectMessage", pmessage) .setEscapeModelStrings(false).setVisible(pmessage.length() > 0); add(projectMessage); // markdown message above repositories list String rmessage = transformMarkdown(project.repositoriesMarkdown); Component repositoriesMessage = new Label("repositoriesMessage", rmessage) .setEscapeModelStrings(false).setVisible(rmessage.length() > 0); add(repositoriesMessage); UserModel user = GitBlitWebSession.get().getUser(); if (user == null) { user = UserModel.ANONYMOUS; } int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params); if (daysBack < 1) { daysBack = app().settings().getInteger(Keys.web.activityDuration, 7); } // reset the daysback parameter so that we have a complete project // repository list. the recent activity will be built up by the // reflog utils. if (params != null) { params.remove("db"); } List<RepositoryModel> repositories = getRepositories(params); Collections.sort(repositories, new Comparator<RepositoryModel>() { @Override public int compare(RepositoryModel o1, RepositoryModel o2) { // reverse-chronological sort return o2.lastChange.compareTo(o1.lastChange); } }); addActivity(user, repositories, getString("gb.recentActivity"), daysBack); if (repositories.isEmpty()) { add(new Label("repositoryList").setVisible(false)); } else { FilterableRepositoryList repoList = new FilterableRepositoryList("repositoryList", repositories); repoList.setAllowCreate(user.canCreate(project.name + "/")); add(repoList); } } @Override protected void addDropDownMenus(List<NavLink> navLinks) { PageParameters params = getPageParameters(); DropDownPageMenuNavLink menu = new DropDownPageMenuNavLink("gb.filters", ProjectPage.class); // preserve time filter option on repository choices menu.menuItems.addAll(getRepositoryFilterItems(params)); // preserve repository filter option on time choices menu.menuItems.addAll(getTimeFilterItems(params)); if (menu.menuItems.size() > 0) { // Reset Filter menu.menuItems.add(new ParameterMenuItem(getString("gb.reset"), "p", WicketUtils.getProjectName(params))); } navLinks.add(menu); DropDownPageMenuNavLink projects = new DropDownPageMenuNavLink("gb.projects", ProjectPage.class); projects.menuItems.addAll(getProjectsMenu()); navLinks.add(projects); } @Override protected List<ProjectModel> getProjectModels() { if (projectModels.isEmpty()) { List<RepositoryModel> repositories = getRepositoryModels(); List<ProjectModel> projects = app().projects().getProjectModels(repositories, false); projectModels.addAll(projects); } return projectModels; } private ProjectModel getProjectModel(String name) { for (ProjectModel project : getProjectModels()) { if (name.equalsIgnoreCase(project.name)) { return project; } } return null; } protected List<MenuItem> getProjectsMenu() { List<MenuItem> menu = new ArrayList<MenuItem>(); List<ProjectModel> projects = new ArrayList<ProjectModel>(); for (ProjectModel model : getProjectModels()) { if (!model.isUserProject()) { projects.add(model); } } int maxProjects = 15; boolean showAllProjects = projects.size() > maxProjects; if (showAllProjects) { // sort by last changed Collections.sort(projects, new Comparator<ProjectModel>() { @Override public int compare(ProjectModel o1, ProjectModel o2) { return o2.lastChange.compareTo(o1.lastChange); } }); // take most recent subset projects = projects.subList(0, maxProjects); // sort those by name Collections.sort(projects); } for (ProjectModel project : projects) { menu.add(new ParameterMenuItem(project.getDisplayName(), "p", project.name)); } if (showAllProjects) { menu.add(new MenuDivider()); menu.add(new ParameterMenuItem("all projects")); } return menu; } private String transformMarkdown(String markdown) { String message = ""; if (!StringUtils.isEmpty(markdown)) { // Read user-supplied message try { message = MarkdownUtils.transformMarkdown(markdown); } catch (Throwable t) { message = getString("gb.failedToRead") + " " + markdown; warn(message, t); } } return message; } }