From 88598bb2f779b73479512d818c675dea8fa72138 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 22 Jul 2011 09:37:14 -0400
Subject: [PATCH] Documentation. Unit testing. Checkstyle. Findbugs.

---
 tests/com/gitblit/tests/GitBlitTest.java                  |   18 ++
 src/com/gitblit/utils/TimeUtils.java                      |   40 +++---
 src/com/gitblit/wicket/pages/RepositoriesPage.java        |    1 
 tests/com/gitblit/tests/MetricUtilsTest.java              |    6 
 src/com/gitblit/utils/PatchFormatter.java                 |    4 
 src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java |    2 
 tests/com/gitblit/tests/StringUtilsTest.java              |    6 
 src/com/gitblit/IStoredSettings.java                      |    2 
 tests/com/gitblit/tests/GitBlitSuite.java                 |    3 
 src/com/gitblit/utils/FileUtils.java                      |    5 
 src/com/gitblit/wicket/panels/RepositoriesPanel.java      |   12 +
 src/com/gitblit/AccessRestrictionFilter.java              |    3 
 tests/com/gitblit/tests/FileUtilsTest.java                |   45 +++++++
 tests/com/gitblit/tests/SyndicationUtilsTest.java         |    3 
 src/com/gitblit/wicket/panels/TagsPanel.java              |    2 
 src/com/gitblit/GitBlitServer.java                        |    7 
 src/com/gitblit/MakeCertificate.java                      |    8 +
 src/com/gitblit/wicket/pages/ChangePasswordPage.java      |   19 +-
 src/com/gitblit/GitBlitException.java                     |    4 
 src/com/gitblit/build/BuildThumbnails.java                |    9 +
 docs/00_index.mkd                                         |    2 
 src/com/gitblit/Constants.java                            |    3 
 src/com/gitblit/utils/JGitUtils.java                      |    9 +
 src/com/gitblit/wicket/pages/EditRepositoryPage.java      |   14 +-
 src/com/gitblit/DownloadZipServlet.java                   |    2 
 src/com/gitblit/utils/MarkdownUtils.java                  |   10 -
 src/com/gitblit/build/BuildWebXml.java                    |    6 +
 src/com/gitblit/build/BuildSite.java                      |   49 +++++---
 src/com/gitblit/wicket/pages/EditUserPage.java            |   16 +-
 src/com/gitblit/build/Build.java                          |   10 +
 src/com/gitblit/wicket/pages/LogoutPage.java              |    2 
 src/com/gitblit/utils/DiffUtils.java                      |    3 
 src/com/gitblit/wicket/pages/BasePage.java                |    4 
 src/com/gitblit/wicket/panels/BranchesPanel.java          |   14 +-
 src/com/gitblit/wicket/GitBlitWebApp.java                 |    1 
 src/com/gitblit/wicket/pages/SummaryPage.java             |    4 
 36 files changed, 233 insertions(+), 115 deletions(-)

diff --git a/docs/00_index.mkd b/docs/00_index.mkd
index 2be3b06..a6559b2 100644
--- a/docs/00_index.mkd
+++ b/docs/00_index.mkd
@@ -34,7 +34,7 @@
 - updated: MarkdownPapers 1.1.0
 - updated: Jetty 7.4.3
 
-issues & binaries @ [Google Code][googlecode]<br/>
+issues, binaries, and sources @ [Google Code][googlecode]<br/>
 sources @ [Github][gitbltsrc]
 
 ### License
diff --git a/src/com/gitblit/AccessRestrictionFilter.java b/src/com/gitblit/AccessRestrictionFilter.java
index 7457178..6ec70db 100644
--- a/src/com/gitblit/AccessRestrictionFilter.java
+++ b/src/com/gitblit/AccessRestrictionFilter.java
@@ -108,7 +108,8 @@
 	 * doFilter does the actual work of preprocessing the request to ensure that
 	 * the user may proceed.
 	 * 
-	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
+	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
+	 *      javax.servlet.ServletResponse, javax.servlet.FilterChain)
 	 */
 	@Override
 	public void doFilter(final ServletRequest request, final ServletResponse response,
diff --git a/src/com/gitblit/Constants.java b/src/com/gitblit/Constants.java
index 766f7c2..4297dbd 100644
--- a/src/com/gitblit/Constants.java
+++ b/src/com/gitblit/Constants.java
@@ -51,6 +51,9 @@
 
 	public static final String BORDER = "***********************************************************";
 
+	/**
+	 * Enumeration representing the 4 access restriction levels.
+	 */
 	public static enum AccessRestrictionType {
 		NONE, PUSH, CLONE, VIEW;
 
diff --git a/src/com/gitblit/DownloadZipServlet.java b/src/com/gitblit/DownloadZipServlet.java
index 32369ae..5f2a2a4 100644
--- a/src/com/gitblit/DownloadZipServlet.java
+++ b/src/com/gitblit/DownloadZipServlet.java
@@ -38,7 +38,7 @@
  * protected by an AccessRestrictionFilter. It performs its own authorization
  * check, but it does not perform any authentication. The assumption is that
  * requests to this servlet are made via the web ui and not by direct url
- * access.  Unauthorized requests fail with a standard 403 (FORBIDDEN) code.
+ * access. Unauthorized requests fail with a standard 403 (FORBIDDEN) code.
  * 
  * @author James Moger
  * 
diff --git a/src/com/gitblit/GitBlitException.java b/src/com/gitblit/GitBlitException.java
index 0cfc782..032e41f 100644
--- a/src/com/gitblit/GitBlitException.java
+++ b/src/com/gitblit/GitBlitException.java
@@ -16,10 +16,10 @@
 package com.gitblit;
 
 /**
- * GitBlitException is a marginally useful class.  :)
+ * GitBlitException is a marginally useful class. :)
  * 
  * @author James Moger
- *
+ * 
  */
 public class GitBlitException extends Exception {
 
diff --git a/src/com/gitblit/GitBlitServer.java b/src/com/gitblit/GitBlitServer.java
index 92305fc..2caaaf6 100644
--- a/src/com/gitblit/GitBlitServer.java
+++ b/src/com/gitblit/GitBlitServer.java
@@ -176,7 +176,7 @@
 				}
 				if (params.securePort < 1024 && !isWindows()) {
 					logger.warn("Gitblit needs to run with ROOT permissions for ports < 1024!");
-				}				
+				}
 				connectors.add(secureConnector);
 			} else {
 				logger.warn("Failed to find or load Keystore?");
@@ -315,7 +315,7 @@
 		connector.setMaxIdleTime(30000);
 		return connector;
 	}
-	
+
 	/**
 	 * Tests to see if the operating system is Windows.
 	 * 
@@ -376,6 +376,9 @@
 		}
 	}
 
+	/**
+	 * JCommander Parameters class for GitBlitServer.
+	 */
 	@Parameters(separators = " ")
 	private static class Params {
 
diff --git a/src/com/gitblit/IStoredSettings.java b/src/com/gitblit/IStoredSettings.java
index 0cc4bb4..be836c9 100644
--- a/src/com/gitblit/IStoredSettings.java
+++ b/src/com/gitblit/IStoredSettings.java
@@ -116,7 +116,7 @@
 		}
 		return defaultValue;
 	}
-	
+
 	/**
 	 * Returns the char value for the specified key. If the key does not exist
 	 * or the value for the key can not be interpreted as a char, the
diff --git a/src/com/gitblit/MakeCertificate.java b/src/com/gitblit/MakeCertificate.java
index 894f7a8..f2fc730 100644
--- a/src/com/gitblit/MakeCertificate.java
+++ b/src/com/gitblit/MakeCertificate.java
@@ -47,7 +47,7 @@
  * Utility class to generate self-signed certificates.
  * 
  * @author James Moger
- *
+ * 
  */
 public class MakeCertificate {
 
@@ -63,7 +63,8 @@
 			jc.usage();
 		}
 		File keystore = new File("keystore");
-		generateSelfSignedCertificate(params.hostname, keystore, params.storePassword, params.subject);
+		generateSelfSignedCertificate(params.hostname, keystore, params.storePassword,
+				params.subject);
 	}
 
 	public static void generateSelfSignedCertificate(String hostname, File keystore,
@@ -159,6 +160,9 @@
 		}
 	}
 
+	/**
+	 * JCommander Parameters class for MakeCertificate.
+	 */
 	@Parameters(separators = " ")
 	private static class Params {
 
diff --git a/src/com/gitblit/build/Build.java b/src/com/gitblit/build/Build.java
index 22d61b5..66bf49a 100644
--- a/src/com/gitblit/build/Build.java
+++ b/src/com/gitblit/build/Build.java
@@ -49,6 +49,11 @@
  */
 public class Build {
 
+	/**
+	 * BuildType enumeration representing compile-time or runtime. This is used
+	 * to download dependencies either for Gitblit GO runtime or for setting up
+	 * a development environment.
+	 */
 	public static enum BuildType {
 		RUNTIME, COMPILETIME;
 	}
@@ -320,6 +325,11 @@
 		System.out.print("] " + url);
 	}
 
+	/**
+	 * MavenObject represents a complete maven artifact (binary, sources, and
+	 * javadoc). MavenObjects can be downloaded and checksummed to confirm
+	 * authenticity.
+	 */
 	private static class MavenObject {
 
 		public static final MavenObject JCOMMANDER = new MavenObject("jCommander", "com/beust",
diff --git a/src/com/gitblit/build/BuildSite.java b/src/com/gitblit/build/BuildSite.java
index c3a7f5f..dca5116 100644
--- a/src/com/gitblit/build/BuildSite.java
+++ b/src/com/gitblit/build/BuildSite.java
@@ -55,11 +55,11 @@
  */
 public class BuildSite {
 
-	private final static String CASE_SENSITIVE = "CASE-SENSITIVE";
+	private static final String CASE_SENSITIVE = "CASE-SENSITIVE";
 
-	private final static String RESTART_REQUIRED = "RESTART REQUIRED";
+	private static final String RESTART_REQUIRED = "RESTART REQUIRED";
 
-	private final static String SINCE = "SINCE";
+	private static final String SINCE = "SINCE";
 
 	public static void main(String... args) {
 		Params params = new Params();
@@ -135,10 +135,10 @@
 				if (!params.skips.contains(documentName)) {
 					String fileName = documentName + ".html";
 					System.out.println(MessageFormat.format("  {0} => {1}", file.getName(),
-							fileName));					
+							fileName));
 					String rawContent = FileUtils.readContent(file, "\n");
 					String markdownContent = rawContent;
-					
+
 					Map<String, List<String>> nomarkdownMap = new HashMap<String, List<String>>();
 
 					// extract sections marked as no-markdown
@@ -159,8 +159,9 @@
 							if (endCode == 0) {
 								strippedContent.append(markdownContent.substring(0, beginCode));
 							} else {
-								strippedContent.append(markdownContent.substring(endCode, beginCode));
-							}							
+								strippedContent.append(markdownContent
+										.substring(endCode, beginCode));
+							}
 							strippedContent.append(nomarkdownKey);
 							endCode = markdownContent.indexOf(endToken, beginCode);
 							chunks.add(markdownContent.substring(beginCode, endCode));
@@ -169,27 +170,28 @@
 
 						// get remainder of text
 						if (endCode < markdownContent.length()) {
-							strippedContent.append(markdownContent.substring(endCode, markdownContent.length()));
+							strippedContent.append(markdownContent.substring(endCode,
+									markdownContent.length()));
 						}
 						markdownContent = strippedContent.toString();
-						nmd++;						
+						nmd++;
 					}
 
 					// transform markdown to html
 					String content = transformMarkdown(markdownContent.toString());
 
 					// reinsert nomarkdown chunks
-					for (Map.Entry<String, List<String>> nomarkdown: nomarkdownMap.entrySet()) {
-						for (String chunk:nomarkdown.getValue()) {
+					for (Map.Entry<String, List<String>> nomarkdown : nomarkdownMap.entrySet()) {
+						for (String chunk : nomarkdown.getValue()) {
 							content = content.replaceFirst(nomarkdown.getKey(), chunk);
 						}
 					}
-					
+
 					for (String token : params.substitutions) {
 						String[] kv = token.split("=", 2);
 						content = content.replace(kv[0], kv[1]);
 					}
-					for (String token:params.regex) {
+					for (String token : params.regex) {
 						String[] kv = token.split("!!!", 2);
 						content = content.replaceAll(kv[0], kv[1]);
 					}
@@ -199,7 +201,7 @@
 						content = content.replace(kv[0], loadedContent);
 					}
 					for (String alias : params.loads) {
-						String[] kv = alias.split("=" ,2);
+						String[] kv = alias.split("=", 2);
 						String loadedContent = FileUtils.readContent(new File(kv[1]), "\n");
 						loadedContent = StringUtils.escapeForHtml(loadedContent, false);
 						loadedContent = StringUtils.breakLinesForHtml(loadedContent);
@@ -264,21 +266,26 @@
 			for (String comment : setting.comments) {
 				if (comment.contains(SINCE) || comment.contains(RESTART_REQUIRED)
 						|| comment.contains(CASE_SENSITIVE)) {
-					sb.append(MessageFormat.format("<span style=\"color:#004000;\"># <i>{0}</i></span>", transformMarkdown(comment)));
+					sb.append(MessageFormat.format(
+							"<span style=\"color:#004000;\"># <i>{0}</i></span>",
+							transformMarkdown(comment)));
 				} else {
-					sb.append(MessageFormat.format("<span style=\"color:#004000;\"># {0}</span>", transformMarkdown(comment)));
+					sb.append(MessageFormat.format("<span style=\"color:#004000;\"># {0}</span>",
+							transformMarkdown(comment)));
 				}
 				sb.append("<br/>\n");
 			}
 			if (!StringUtils.isEmpty(setting.name)) {
-				sb.append(MessageFormat.format("<span style=\"color:#000080;\">{0}</span> = <span style=\"color:#800000;\">{1}</span>", setting.name, StringUtils.escapeForHtml(setting.value, false)));
+				sb.append(MessageFormat
+						.format("<span style=\"color:#000080;\">{0}</span> = <span style=\"color:#800000;\">{1}</span>",
+								setting.name, StringUtils.escapeForHtml(setting.value, false)));
 			}
 			sb.append("<br/>\n");
 		}
 
 		return sb.toString();
 	}
-	
+
 	private static String transformMarkdown(String comment) throws ParseException {
 		String md = MarkdownUtils.transformMarkdown(comment);
 		if (md.startsWith("<p>")) {
@@ -303,6 +310,9 @@
 		System.exit(0);
 	}
 
+	/**
+	 * Setting represents a setting with its comments from the properties file.
+	 */
 	private static class Setting {
 		final String name;
 		final String value;
@@ -315,6 +325,9 @@
 		}
 	}
 
+	/**
+	 * JCommander Parameters class for BuildSite.
+	 */
 	@Parameters(separators = " ")
 	private static class Params {
 
diff --git a/src/com/gitblit/build/BuildThumbnails.java b/src/com/gitblit/build/BuildThumbnails.java
index 0676eca..fe06c6c 100644
--- a/src/com/gitblit/build/BuildThumbnails.java
+++ b/src/com/gitblit/build/BuildThumbnails.java
@@ -65,8 +65,9 @@
 	 */
 	public static void createImageThumbnail(String sourceFolder, String destinationFolder,
 			int maxDimension) {
-		if (maxDimension <= 0)
+		if (maxDimension <= 0) {
 			return;
+		}
 		File source = new File(sourceFolder);
 		File destination = new File(destinationFolder);
 		destination.mkdirs();
@@ -135,12 +136,16 @@
 				}
 			}
 		} finally {
-			if (in != null)
+			if (in != null) {
 				in.close();
+			}
 		}
 		return null;
 	}
 
+	/**
+	 * JCommander Parameters class for BuildThumbnails.
+	 */
 	@Parameters(separators = " ")
 	private static class Params {
 
diff --git a/src/com/gitblit/build/BuildWebXml.java b/src/com/gitblit/build/BuildWebXml.java
index e53a4af..4fcc6e9 100644
--- a/src/com/gitblit/build/BuildWebXml.java
+++ b/src/com/gitblit/build/BuildWebXml.java
@@ -126,6 +126,9 @@
 		return key.startsWith(Keys.server._ROOT);
 	}
 
+	/**
+	 * Setting represents a setting and its comments from the properties file.
+	 */
 	private static class Setting {
 		final String name;
 		final String value;
@@ -138,6 +141,9 @@
 		}
 	}
 
+	/**
+	 * JCommander Parameters class for BuildWebXml.
+	 */
 	@Parameters(separators = " ")
 	private static class Params {
 
diff --git a/src/com/gitblit/utils/DiffUtils.java b/src/com/gitblit/utils/DiffUtils.java
index beeb532..9f0d04f 100644
--- a/src/com/gitblit/utils/DiffUtils.java
+++ b/src/com/gitblit/utils/DiffUtils.java
@@ -48,6 +48,9 @@
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class);
 
+	/**
+	 * Enumeration for the diff output types.
+	 */
 	public static enum DiffOutputType {
 		PLAIN, GITWEB, GITBLIT;
 
diff --git a/src/com/gitblit/utils/FileUtils.java b/src/com/gitblit/utils/FileUtils.java
index ce8cdf9..310e35a 100644
--- a/src/com/gitblit/utils/FileUtils.java
+++ b/src/com/gitblit/utils/FileUtils.java
@@ -73,10 +73,11 @@
 		}
 		long length = 0;
 		for (File file : directory.listFiles()) {
-			if (file.isFile())
+			if (file.isFile()) {
 				length += file.length();
-			else
+			} else {
 				length += folderSize(file);
+			}
 		}
 		return length;
 	}
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 2e14b67..a72299d 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -80,6 +80,12 @@
 import com.gitblit.models.PathModel.PathChangeModel;
 import com.gitblit.models.RefModel;
 
+/**
+ * Collection of static methods for retrieving information from a repository.
+ * 
+ * @author James Moger
+ * 
+ */
 public class JGitUtils {
 
 	static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
@@ -795,6 +801,9 @@
 		return list;
 	}
 
+	/**
+	 * Enumeration of the search types.
+	 */
 	public static enum SearchType {
 		AUTHOR, COMMITTER, COMMIT;
 
diff --git a/src/com/gitblit/utils/MarkdownUtils.java b/src/com/gitblit/utils/MarkdownUtils.java
index c7c1f9f..a3a1859 100644
--- a/src/com/gitblit/utils/MarkdownUtils.java
+++ b/src/com/gitblit/utils/MarkdownUtils.java
@@ -40,7 +40,10 @@
 	 */
 	public static String transformMarkdown(String markdown) throws java.text.ParseException {
 		try {
-			return transformMarkdown(new StringReader(markdown));
+			StringReader reader = new StringReader(markdown);
+			String html = transformMarkdown(reader);
+			reader.close();
+			return html;
 		} catch (NullPointerException p) {
 			throw new java.text.ParseException("Markdown string is null!", 0);
 		}
@@ -64,11 +67,6 @@
 		} catch (ParseException p) {
 			throw new java.text.ParseException(p.getMessage(), 0);
 		} finally {
-			try {
-				markdownReader.close();
-			} catch (IOException e) {
-				// IGNORE
-			}
 			try {
 				writer.close();
 			} catch (IOException e) {
diff --git a/src/com/gitblit/utils/PatchFormatter.java b/src/com/gitblit/utils/PatchFormatter.java
index 9255956..90b3fb1 100644
--- a/src/com/gitblit/utils/PatchFormatter.java
+++ b/src/com/gitblit/utils/PatchFormatter.java
@@ -115,6 +115,10 @@
 		return patch.toString();
 	}
 
+	/**
+	 * Class that represents the number of insertions and deletions from a
+	 * chunk.
+	 */
 	private static class PatchTouple {
 		int insertions;
 		int deletions;
diff --git a/src/com/gitblit/utils/TimeUtils.java b/src/com/gitblit/utils/TimeUtils.java
index ad81463..dbd2d9a 100644
--- a/src/com/gitblit/utils/TimeUtils.java
+++ b/src/com/gitblit/utils/TimeUtils.java
@@ -185,7 +185,6 @@
 	 * @return the string representation of the duration OR the css class
 	 */
 	private static String timeAgo(Date date, boolean css) {
-		String ago = null;
 		if (isToday(date) || isYesterday(date)) {
 			int mins = minutesAgo(date, true);
 			if (mins >= 120) {
@@ -194,16 +193,15 @@
 				}
 				int hours = hoursAgo(date, true);
 				if (hours > 23) {
-					ago = "yesterday";
+					return "yesterday";
 				} else {
-					ago = hours + " hours ago";
+					return hours + " hours ago";
 				}
-			} else {
-				if (css) {
-					return "age0";
-				}
-				ago = mins + " min" + (mins > 1 ? "s" : "") + " ago";
 			}
+			if (css) {
+				return "age0";
+			}
+			return mins + " min" + (mins > 1 ? "s" : "") + " ago";
 		} else {
 			if (css) {
 				return "age2";
@@ -211,35 +209,33 @@
 			int days = daysAgo(date, true);
 			if (days < 365) {
 				if (days <= 30) {
-					ago = days + " days ago";
+					return days + " days ago";
 				} else if (days <= 90) {
 					int weeks = days / 7;
 					if (weeks == 12) {
-						ago = "3 months ago";
+						return "3 months ago";
 					} else {
-						ago = weeks + " weeks ago";
+						return weeks + " weeks ago";
 					}
-				} else if (days > 90) {
-					int months = days / 30;
-					int weeks = (days % 30) / 7;
-					if (weeks >= 2) {
-						months++;
-					}
-					ago = months + " months ago";
 				}
+				int months = days / 30;
+				int weeks = (days % 30) / 7;
+				if (weeks >= 2) {
+					months++;
+				}
+				return months + " months ago";
 			} else if (days == 365) {
-				ago = "1 year ago";
+				return "1 year ago";
 			} else {
 				int yr = days / 365;
 				days = days % 365;
 				int months = (yr * 12) + (days / 30);
 				if (months > 23) {
-					ago = yr + " years ago";
+					return yr + " years ago";
 				} else {
-					ago = months + " months ago";
+					return months + " months ago";
 				}
 			}
 		}
-		return ago;
 	}
 }
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index 4b5e660..8cbab9c 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -22,7 +22,6 @@
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
diff --git a/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
index c30b9c3..3248a08 100644
--- a/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
+++ b/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
@@ -16,8 +16,6 @@
 package com.gitblit.wicket;
 
 import org.apache.wicket.Page;
-import org.apache.wicket.protocol.http.WicketURLDecoder;
-import org.apache.wicket.protocol.http.WicketURLEncoder;
 import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
 
 import com.gitblit.GitBlit;
diff --git a/src/com/gitblit/wicket/pages/BasePage.java b/src/com/gitblit/wicket/pages/BasePage.java
index e95aee3..acfb323 100644
--- a/src/com/gitblit/wicket/pages/BasePage.java
+++ b/src/com/gitblit/wicket/pages/BasePage.java
@@ -189,7 +189,7 @@
 	 * Panel fragment for displaying login or logout/change_password links.
 	 * 
 	 */
-	class UserFragment extends Fragment {
+	static class UserFragment extends Fragment {
 
 		private static final long serialVersionUID = 1L;
 
@@ -201,7 +201,7 @@
 				add(new Label("username", GitBlitWebSession.get().getUser().toString() + ":"));
 				add(new LinkPanel("loginLink", null, markupProvider.getString("gb.logout"),
 						LogoutPage.class));
-				// quick and dirty hack for showing a separator 
+				// quick and dirty hack for showing a separator
 				add(new Label("separator", "|"));
 				add(new BookmarkablePageLink<Void>("changePasswordLink", ChangePasswordPage.class));
 			} else {
diff --git a/src/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/com/gitblit/wicket/pages/ChangePasswordPage.java
index 42cd2b7..054b343 100644
--- a/src/com/gitblit/wicket/pages/ChangePasswordPage.java
+++ b/src/com/gitblit/wicket/pages/ChangePasswordPage.java
@@ -49,7 +49,8 @@
 			throw new RestartResponseException(getApplication().getHomePage());
 		}
 
-		if (!GitBlit.getBoolean(Keys.web.authenticateAdminPages, true) && !GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
+		if (!GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)
+				&& !GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
 			// no authentication enabled
 			throw new RestartResponseException(getApplication().getHomePage());
 		}
@@ -115,19 +116,19 @@
 		confirmPasswordField.setResetPassword(false);
 		form.add(confirmPasswordField);
 		form.add(new FeedbackPanel("feedback"));
-		
+
 		form.add(new Button("save"));
-		Button cancel = new Button("cancel"){          
+		Button cancel = new Button("cancel") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onSubmit() {
-                setResponsePage(RepositoriesPage.class);
-            }
-        };
-        cancel.setDefaultFormProcessing(false);
-        form.add(cancel);
-        
+				setResponsePage(RepositoriesPage.class);
+			}
+		};
+		cancel.setDefaultFormProcessing(false);
+		form.add(cancel);
+
 		add(form);
 	}
 }
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index 824f13d..eea389e 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -184,17 +184,17 @@
 		form.add(usersPalette);
 
 		form.add(new Button("save"));
-		Button cancel = new Button("cancel"){          
+		Button cancel = new Button("cancel") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onSubmit() {
-                setResponsePage(RepositoriesPage.class);
-            }
-        };
-        cancel.setDefaultFormProcessing(false);
-        form.add(cancel);
-        
+				setResponsePage(RepositoriesPage.class);
+			}
+		};
+		cancel.setDefaultFormProcessing(false);
+		form.add(cancel);
+
 		add(form);
 	}
 
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.java b/src/com/gitblit/wicket/pages/EditUserPage.java
index cb61adb..dd50d56 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/com/gitblit/wicket/pages/EditUserPage.java
@@ -173,19 +173,19 @@
 		form.add(confirmPasswordField);
 		form.add(new CheckBox("canAdmin"));
 		form.add(repositories);
-		
+
 		form.add(new Button("save"));
-		Button cancel = new Button("cancel"){          
+		Button cancel = new Button("cancel") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onSubmit() {
-                setResponsePage(RepositoriesPage.class);
-            }
-        };
-        cancel.setDefaultFormProcessing(false);
-        form.add(cancel);
-        
+				setResponsePage(RepositoriesPage.class);
+			}
+		};
+		cancel.setDefaultFormProcessing(false);
+		form.add(cancel);
+
 		add(form);
 	}
 }
diff --git a/src/com/gitblit/wicket/pages/LogoutPage.java b/src/com/gitblit/wicket/pages/LogoutPage.java
index b049e8e..15ef0e6 100644
--- a/src/com/gitblit/wicket/pages/LogoutPage.java
+++ b/src/com/gitblit/wicket/pages/LogoutPage.java
@@ -25,7 +25,7 @@
 
 	public LogoutPage() {
 		GitBlitWebSession.get().invalidate();
-		GitBlit.self().setCookie(((WebResponse) getResponse()), null);
+		GitBlit.self().setCookie((WebResponse) getResponse(), null);
 		setRedirect(true);
 		setResponsePage(getApplication().getHomePage());
 	}
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index f97adff..053bee0 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -72,6 +72,7 @@
 				InputStream is = res.getResourceStream().getInputStream();
 				InputStreamReader reader = new InputStreamReader(is);
 				message = MarkdownUtils.transformMarkdown(reader);
+				reader.close();
 			} catch (Throwable t) {
 				message = "Failed to read default welcome message!";
 				error(message, t, false);
diff --git a/src/com/gitblit/wicket/pages/SummaryPage.java b/src/com/gitblit/wicket/pages/SummaryPage.java
index e753e5d..07d5714 100644
--- a/src/com/gitblit/wicket/pages/SummaryPage.java
+++ b/src/com/gitblit/wicket/pages/SummaryPage.java
@@ -78,8 +78,8 @@
 		add(new Label("repositoryDescription", getRepositoryModel().description));
 		add(new Label("repositoryOwner", getRepositoryModel().owner));
 
-		add(WicketUtils.createTimestampLabel("repositoryLastChange", JGitUtils.getLastChange(r, null),
-				getTimeZone()));
+		add(WicketUtils.createTimestampLabel("repositoryLastChange",
+				JGitUtils.getLastChange(r, null), getTimeZone()));
 		if (metricsTotal == null) {
 			add(new Label("branchStats", ""));
 		} else {
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.java b/src/com/gitblit/wicket/panels/BranchesPanel.java
index 8e58d67..24e0e98 100644
--- a/src/com/gitblit/wicket/panels/BranchesPanel.java
+++ b/src/com/gitblit/wicket/panels/BranchesPanel.java
@@ -94,22 +94,22 @@
 
 				String author = entry.getAuthorIdent().getName();
 				LinkPanel authorLink = new LinkPanel("branchAuthor", "list", author,
-						SearchPage.class, WicketUtils.newSearchParameter(model.name, entry.getName(),
-								author, SearchType.AUTHOR));
+						SearchPage.class, WicketUtils.newSearchParameter(model.name,
+								entry.getName(), author, SearchType.AUTHOR));
 				setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR);
 				item.add(authorLink);
-				
+
 				// short message
 				String shortMessage = entry.getShortMessage();
 				String trimmedMessage = StringUtils.trimShortLog(shortMessage);
-				LinkPanel shortlog = new LinkPanel("branchLog", "list subject",
-						trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(
-								model.name, entry.getName()));
+				LinkPanel shortlog = new LinkPanel("branchLog", "list subject", trimmedMessage,
+						CommitPage.class, WicketUtils.newObjectParameter(model.name,
+								entry.getName()));
 				if (!shortMessage.equals(trimmedMessage)) {
 					WicketUtils.setHtmlTooltip(shortlog, shortMessage);
 				}
 				item.add(shortlog);
-				
+
 				if (maxCount <= 0) {
 					Fragment fragment = new Fragment("branchLinks", "branchPageLinks", this);
 					fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index fa6c661..416a8c1 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -76,9 +76,9 @@
 			Map<String, List<RepositoryModel>> groups = new HashMap<String, List<RepositoryModel>>();
 			for (RepositoryModel model : models) {
 				String rootPath = StringUtils.getRootPath(model.name);
-				if (StringUtils.isEmpty(rootPath)) { 
+				if (StringUtils.isEmpty(rootPath)) {
 					// root repository
-					rootRepositories.add(model);					
+					rootRepositories.add(model);
 				} else {
 					// non-root, grouped repository
 					if (!groups.containsKey(rootPath)) {
@@ -89,7 +89,7 @@
 			}
 			List<String> roots = new ArrayList<String>(groups.keySet());
 			Collections.sort(roots);
-			
+
 			if (rootRepositories.size() > 0) {
 				// inject the root repositories at the top of the page
 				String rootPath = GitBlit.getString(Keys.web.repositoryRootGroupName, " ");
@@ -138,7 +138,8 @@
 					row.add(new LinkPanel("repositoryDescription", "list", entry.description,
 							SummaryPage.class, pp));
 					if (showSize) {
-						row.add(new Label("repositorySize", byteFormat.format(GitBlit.self().calculateSize(entry))));
+						row.add(new Label("repositorySize", byteFormat.format(GitBlit.self()
+								.calculateSize(entry))));
 					} else {
 						row.add(new Label("repositorySize").setVisible(false));
 					}
@@ -146,7 +147,8 @@
 					// New repository
 					row.add(new Label("repositoryName", entry.name));
 					row.add(new Label("repositoryDescription", entry.description));
-					row.add(new Label("repositorySize", "<span class='empty'>(empty)</span>").setEscapeModelStrings(false));
+					row.add(new Label("repositorySize", "<span class='empty'>(empty)</span>")
+							.setEscapeModelStrings(false));
 				}
 
 				if (entry.useTickets) {
diff --git a/src/com/gitblit/wicket/panels/TagsPanel.java b/src/com/gitblit/wicket/panels/TagsPanel.java
index 58cb458..39d4092 100644
--- a/src/com/gitblit/wicket/panels/TagsPanel.java
+++ b/src/com/gitblit/wicket/panels/TagsPanel.java
@@ -90,7 +90,7 @@
 				item.add(new LinkPanel("tagName", "list name", entry.displayName, linkClass,
 						WicketUtils.newObjectParameter(repositoryName, entry
 								.getReferencedObjectId().getName())));
-				
+
 				// workaround for RevTag returning a lengthy shortlog. :(
 				String message = StringUtils.trimShortLog(entry.getShortMessage());
 
diff --git a/tests/com/gitblit/tests/FileUtilsTest.java b/tests/com/gitblit/tests/FileUtilsTest.java
new file mode 100644
index 0000000..4e416cb
--- /dev/null
+++ b/tests/com/gitblit/tests/FileUtilsTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2011 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.tests;
+
+import java.io.File;
+
+import com.gitblit.utils.FileUtils;
+
+import junit.framework.TestCase;
+
+public class FileUtilsTest extends TestCase {
+
+	public void testReadContent() throws Exception {
+		File dir = new File(System.getProperty("user.dir"));
+		String rawContent = FileUtils.readContent(new File(dir, "LICENSE"), "\n");
+		assertTrue(rawContent.trim().startsWith("Apache License"));
+	}
+
+	public void testFolderSize() throws Exception {
+		assertEquals(-1, FileUtils.folderSize(null));
+		assertEquals(-1, FileUtils.folderSize(new File(System.getProperty("user.dir"), "pretend")));
+
+		File dir = new File(System.getProperty("user.dir"), "distrib");
+		long size = FileUtils.folderSize(dir);
+		assertTrue("size is actually " + size, size >= 470000L);
+
+		File file = new File(System.getProperty("user.dir"), "LICENSE");
+		size = FileUtils.folderSize(file);
+		assertTrue("size is actually " + size, size == 11556L);
+
+	}
+}
\ No newline at end of file
diff --git a/tests/com/gitblit/tests/GitBlitSuite.java b/tests/com/gitblit/tests/GitBlitSuite.java
index bbf7c4b..2908383 100644
--- a/tests/com/gitblit/tests/GitBlitSuite.java
+++ b/tests/com/gitblit/tests/GitBlitSuite.java
@@ -24,8 +24,8 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.storage.file.FileRepository;
 
-import com.gitblit.FileUserService;
 import com.gitblit.FileSettings;
+import com.gitblit.FileUserService;
 import com.gitblit.GitBlit;
 import com.gitblit.GitBlitException;
 import com.gitblit.models.RepositoryModel;
@@ -40,6 +40,7 @@
 
 	public static Test suite() {
 		TestSuite suite = new TestSuite();
+		suite.addTestSuite(FileUtilsTest.class);
 		suite.addTestSuite(TimeUtilsTest.class);
 		suite.addTestSuite(StringUtilsTest.class);
 		suite.addTestSuite(ByteFormatTest.class);
diff --git a/tests/com/gitblit/tests/GitBlitTest.java b/tests/com/gitblit/tests/GitBlitTest.java
index 2229768..e278e5a 100644
--- a/tests/com/gitblit/tests/GitBlitTest.java
+++ b/tests/com/gitblit/tests/GitBlitTest.java
@@ -39,6 +39,8 @@
 		assertTrue("Helloworld model is null!", model != null);
 		assertTrue(model.toString().equals(
 				GitBlitSuite.getHelloworldRepository().getDirectory().getName()));
+		assertEquals("" + GitBlit.self().calculateSize(model), GitBlit.self().calculateSize(model),
+				22004L);
 	}
 
 	public void testUserModel() throws Exception {
@@ -54,6 +56,9 @@
 		assertFalse("Admin can still access repository!", model.canAccessRepository(repository));
 		model.addRepository(repository);
 		assertTrue("Admin can't access repository!", model.canAccessRepository(repository));
+		assertEquals(GitBlit.self().getRepositoryModel(model, "pretend"), null);
+		assertNotNull(GitBlit.self().getRepositoryModel(model, repository));
+		assertTrue(GitBlit.self().getRepositoryModels(model).size() > 0);
 	}
 
 	public void testAccessRestrictionTypes() throws Exception {
@@ -85,12 +90,12 @@
 
 	public void testFileSettings() throws Exception {
 		FileSettings settings = new FileSettings("distrib/gitblit.properties");
-		assertTrue(settings.getBoolean("missing", true) == true);
+		assertTrue(settings.getBoolean("missing", true));
 		assertTrue(settings.getString("missing", "default").equals("default"));
 		assertTrue(settings.getInteger("missing", 10) == 10);
 		assertTrue(settings.getInteger("realm.realmFile", 5) == 5);
 
-		assertTrue(settings.getBoolean("git.enableGitServlet", false) == true);
+		assertTrue(settings.getBoolean("git.enableGitServlet", false));
 		assertTrue(settings.getString("realm.userService", null).equals("users.properties"));
 		assertTrue(settings.getInteger("realm.minPasswordLength", 0) == 5);
 		List<String> mdExtensions = settings.getStrings("web.markdownExtensions");
@@ -100,16 +105,18 @@
 		List<String> keys = settings.getAllKeys("server");
 		assertTrue(keys.size() > 0);
 		assertTrue(keys.contains("server.httpsPort"));
+
+		assertTrue(settings.getChar("web.forwardSlashCharacter", ' ') == '/');
 	}
 
 	public void testGitblitSettings() throws Exception {
 		// These are already tested by above test method.
-		assertTrue(GitBlit.getBoolean("missing", true) == true);
+		assertTrue(GitBlit.getBoolean("missing", true));
 		assertTrue(GitBlit.getString("missing", "default").equals("default"));
 		assertTrue(GitBlit.getInteger("missing", 10) == 10);
 		assertTrue(GitBlit.getInteger("realm.userService", 5) == 5);
 
-		assertTrue(GitBlit.getBoolean("git.enableGitServlet", false) == true);
+		assertTrue(GitBlit.getBoolean("git.enableGitServlet", false));
 		assertTrue(GitBlit.getString("realm.userService", null).equals("users.properties"));
 		assertTrue(GitBlit.getInteger("realm.minPasswordLength", 0) == 5);
 		List<String> mdExtensions = GitBlit.getStrings("web.markdownExtensions");
@@ -119,6 +126,9 @@
 		List<String> keys = GitBlit.getAllKeys("server");
 		assertTrue(keys.size() > 0);
 		assertTrue(keys.contains("server.httpsPort"));
+
+		assertTrue(GitBlit.getChar("web.forwardSlashCharacter", ' ') == '/');
+		assertFalse(GitBlit.isDebugMode());
 	}
 
 	public void testAuthentication() throws Exception {
diff --git a/tests/com/gitblit/tests/MetricUtilsTest.java b/tests/com/gitblit/tests/MetricUtilsTest.java
index c9d007d..bfa34b4 100644
--- a/tests/com/gitblit/tests/MetricUtilsTest.java
+++ b/tests/com/gitblit/tests/MetricUtilsTest.java
@@ -27,7 +27,11 @@
 public class MetricUtilsTest extends TestCase {
 
 	public void testMetrics() throws Exception {
-		Repository repository = GitBlitSuite.getHelloworldRepository();
+		testMetrics(GitBlitSuite.getHelloworldRepository());
+		testMetrics(GitBlitSuite.getBluezGnomeRepository());
+	}
+
+	private void testMetrics(Repository repository) throws Exception {
 		List<Metric> metrics = MetricUtils.getDateMetrics(repository, null, true, null);
 		repository.close();
 		assertTrue("No date metrics found!", metrics.size() > 0);
diff --git a/tests/com/gitblit/tests/StringUtilsTest.java b/tests/com/gitblit/tests/StringUtilsTest.java
index 1bf0de4..665b914 100644
--- a/tests/com/gitblit/tests/StringUtilsTest.java
+++ b/tests/com/gitblit/tests/StringUtilsTest.java
@@ -36,7 +36,7 @@
 		String output = "this<br/>is<br/>a<br/>test<br/><br/>of<br/><br/>line<br/><br/>breaking";
 		assertTrue(StringUtils.breakLinesForHtml(input).equals(output));
 	}
-	
+
 	public void testEncodeUrl() throws Exception {
 		String input = "test /";
 		String output = "test%20%2F";
@@ -50,7 +50,7 @@
 		assertTrue(StringUtils.escapeForHtml(input, false).equals(outputNoChange));
 		assertTrue(StringUtils.escapeForHtml(input, true).equals(outputChange));
 	}
-	
+
 	public void testDecodeForHtml() throws Exception {
 		String input = "&amp; &lt; &gt; &quot;";
 		String output = "& < > \"";
@@ -82,7 +82,7 @@
 		assertTrue(StringUtils.getSHA1("blob 16\000what is up, doc?").equals(
 				"bd9dbf5aae1a3862dd1526723246b20206e5fc37"));
 	}
-	
+
 	public void testMD5() throws Exception {
 		assertTrue(StringUtils.getMD5("blob 16\000what is up, doc?").equals(
 				"77fb8d95331f0d557472f6776d3aedf6"));
diff --git a/tests/com/gitblit/tests/SyndicationUtilsTest.java b/tests/com/gitblit/tests/SyndicationUtilsTest.java
index ab51804..1fa21fc 100644
--- a/tests/com/gitblit/tests/SyndicationUtilsTest.java
+++ b/tests/com/gitblit/tests/SyndicationUtilsTest.java
@@ -32,7 +32,8 @@
 		Repository repository = GitBlitSuite.getHelloworldRepository();
 		List<RevCommit> commits = JGitUtils.getRevLog(repository, 1);
 		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		SyndicationUtils.toRSS("http://localhost", "Title", "Description", "Repository", commits, os);
+		SyndicationUtils.toRSS("http://localhost", "Title", "Description", "Repository", commits,
+				os);
 		String feed = os.toString();
 		os.close();
 		assertTrue(feed.length() > 100);

--
Gitblit v1.9.1