James Moger
2013-01-03 eee533b4583854b9c875221f1c1f50dfb092868d
Cache and re-use project markdown content (issue-172)
3 files modified
64 ■■■■■ changed files
src/com/gitblit/GitBlit.java 29 ●●●●● patch | view | raw | blame | history
src/com/gitblit/models/ProjectModel.java 2 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ProjectPage.java 33 ●●●● patch | view | raw | blame | history
src/com/gitblit/GitBlit.java
@@ -154,6 +154,10 @@
    private final Map<String, ProjectModel> projectCache = new ConcurrentHashMap<String, ProjectModel>();
    
    private final AtomicReference<String> repositoryListSettingsChecksum = new AtomicReference<String>("");
    private final ObjectCache<String> projectMarkdownCache = new ObjectCache<String>();
    private final ObjectCache<String> projectRepositoriesMarkdownCache = new ObjectCache<String>();
    private ServletContext servletContext;
@@ -1402,7 +1406,30 @@
                }
                project.title = projectConfigs.getString("project", name, "title");
                project.description = projectConfigs.getString("project", name, "description");
                configs.put(name.toLowerCase(), project);
                // project markdown
                File pmkd = new File(getRepositoriesFolder(), (project.isRoot ? "" : name) + "/project.mkd");
                if (pmkd.exists()) {
                    Date lm = new Date(pmkd.lastModified());
                    if (!projectMarkdownCache.hasCurrent(name, lm)) {
                        String mkd = com.gitblit.utils.FileUtils.readContent(pmkd,  "\n");
                        projectMarkdownCache.updateObject(name, lm, mkd);
                    }
                    project.projectMarkdown = projectMarkdownCache.getObject(name);
                }
                // project repositories markdown
                File rmkd = new File(getRepositoriesFolder(), (project.isRoot ? "" : name) + "/repositories.mkd");
                if (rmkd.exists()) {
                    Date lm = new Date(rmkd.lastModified());
                    if (!projectRepositoriesMarkdownCache.hasCurrent(name, lm)) {
                        String mkd = com.gitblit.utils.FileUtils.readContent(rmkd,  "\n");
                        projectRepositoriesMarkdownCache.updateObject(name, lm, mkd);
                    }
                    project.repositoriesMarkdown = projectRepositoriesMarkdownCache.getObject(name);
                }
                configs.put(name.toLowerCase(), project);
            }
            projectCache.clear();
            projectCache.putAll(configs);
src/com/gitblit/models/ProjectModel.java
@@ -39,6 +39,8 @@
    public String description;
    public final Set<String> repositories = new HashSet<String>();
    
    public String projectMarkdown;
    public String repositoriesMarkdown;
    public Date lastChange;
    public final boolean isRoot;
src/com/gitblit/wicket/pages/ProjectPage.java
@@ -15,9 +15,6 @@
 */
package com.gitblit.wicket.pages;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -37,7 +34,6 @@
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.eclipse.jgit.lib.Constants;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
@@ -46,7 +42,6 @@
import com.gitblit.models.Metric;
import com.gitblit.models.ProjectModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
@@ -111,23 +106,14 @@
        add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(),
                null), feedLink));
        
        final String projectPath;
        if (project.isRoot) {
            projectPath = "";
        } else {
            projectPath = projectName + "/";
        }
        // project markdown message
        File pmkd = new File(GitBlit.getRepositoriesFolder(),  projectPath + "project.mkd");
        String pmessage = readMarkdown(projectName, pmkd);
        String pmessage = transformMarkdown(project.projectMarkdown);
        Component projectMessage = new Label("projectMessage", pmessage)
                .setEscapeModelStrings(false).setVisible(pmessage.length() > 0);
        add(projectMessage);
        // markdown message above repositories list
        File rmkd = new File(GitBlit.getRepositoriesFolder(),  projectPath + "repositories.mkd");
        String rmessage = readMarkdown(projectName, rmkd);
        String rmessage = transformMarkdown(project.repositoriesMarkdown);
        Component repositoriesMessage = new Label("repositoriesMessage", rmessage)
                .setEscapeModelStrings(false).setVisible(rmessage.length() > 0);
        add(repositoriesMessage);
@@ -352,20 +338,15 @@
        }
        return menu;
    }
    private String readMarkdown(String projectName, File projectMessage) {
    private String transformMarkdown(String markdown) {
        String message = "";
        if (projectMessage.exists()) {
        if (!StringUtils.isEmpty(markdown)) {
            // Read user-supplied message
            try {
                FileInputStream fis = new FileInputStream(projectMessage);
                InputStreamReader reader = new InputStreamReader(fis,
                        Constants.CHARACTER_ENCODING);
                message = MarkdownUtils.transformMarkdown(reader);
                reader.close();
                message = MarkdownUtils.transformMarkdown(markdown);
            } catch (Throwable t) {
                message = getString("gb.failedToRead") + " " + projectMessage;
                message = getString("gb.failedToRead") + " " + markdown;
                warn(message, t);
            }
        }