From eee533b4583854b9c875221f1c1f50dfb092868d Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 03 Jan 2013 17:22:21 -0500
Subject: [PATCH] Cache and re-use project markdown content (issue-172)

---
 src/com/gitblit/GitBlit.java                  |   29 ++++++++++++++
 src/com/gitblit/wicket/pages/ProjectPage.java |   33 +++-------------
 src/com/gitblit/models/ProjectModel.java      |    2 +
 3 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index 96333a0..30071bb 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/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);
diff --git a/src/com/gitblit/models/ProjectModel.java b/src/com/gitblit/models/ProjectModel.java
index 189a409..9e5d523 100644
--- a/src/com/gitblit/models/ProjectModel.java
+++ b/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;
 
diff --git a/src/com/gitblit/wicket/pages/ProjectPage.java b/src/com/gitblit/wicket/pages/ProjectPage.java
index e10ca90..7eba033 100644
--- a/src/com/gitblit/wicket/pages/ProjectPage.java
+++ b/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);
 			}
 		}

--
Gitblit v1.9.1