From c5dfd60d174a9841e64e4097cecab5aea5c422d0 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sat, 12 Apr 2014 12:26:17 -0400
Subject: [PATCH] Documentation
---
src/main/java/com/gitblit/FileSettings.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 49 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/gitblit/FileSettings.java b/src/main/java/com/gitblit/FileSettings.java
index 3a42cad..21a2043 100644
--- a/src/main/java/com/gitblit/FileSettings.java
+++ b/src/main/java/com/gitblit/FileSettings.java
@@ -26,23 +26,46 @@
/**
* Dynamically loads and reloads a properties file by keeping track of the last
* modification date.
- *
+ *
* @author James Moger
- *
+ *
*/
public class FileSettings extends IStoredSettings {
- protected final File propertiesFile;
+ protected File propertiesFile;
private final Properties properties = new Properties();
private volatile long lastModified;
-
+
private volatile boolean forceReload;
- public FileSettings(String file) {
+ public FileSettings() {
super(FileSettings.class);
+ }
+
+ public FileSettings(String file) {
+ this();
+ load(file);
+ }
+
+ public void load(String file) {
this.propertiesFile = new File(file);
+ }
+
+ /**
+ * Merges the provided settings into this instance. This will also
+ * set the target file for this instance IFF it is unset AND the merge
+ * source is also a FileSettings. This is a little sneaky.
+ */
+ @Override
+ public void merge(IStoredSettings settings) {
+ super.merge(settings);
+
+ // sneaky: set the target file from the merge source
+ if (propertiesFile == null && settings instanceof FileSettings) {
+ this.propertiesFile = ((FileSettings) settings).propertiesFile;
+ }
}
/**
@@ -51,7 +74,7 @@
*/
@Override
protected synchronized Properties read() {
- if (propertiesFile.exists() && (forceReload || (propertiesFile.lastModified() > lastModified))) {
+ if (propertiesFile != null && propertiesFile.exists() && (forceReload || (propertiesFile.lastModified() > lastModified))) {
FileInputStream is = null;
try {
Properties props = new Properties();
@@ -80,9 +103,27 @@
return properties;
}
+ @Override
+ public boolean saveSettings() {
+ String content = FileUtils.readContent(propertiesFile, "\n");
+ for (String key : removals) {
+ String regex = "(?m)^(" + regExEscape(key) + "\\s*+=\\s*+)"
+ + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";
+ content = content.replaceAll(regex, "");
+ }
+ removals.clear();
+
+ FileUtils.writeContent(propertiesFile, content);
+ // manually set the forceReload flag because not all JVMs support real
+ // millisecond resolution of lastModified. (issue-55)
+ forceReload = true;
+ return true;
+ }
+
/**
* Updates the specified settings in the settings file.
*/
+ @Override
public synchronized boolean saveSettings(Map<String, String> settings) {
String content = FileUtils.readContent(propertiesFile, "\n");
for (Map.Entry<String, String> setting:settings.entrySet()) {
@@ -98,11 +139,11 @@
}
FileUtils.writeContent(propertiesFile, content);
// manually set the forceReload flag because not all JVMs support real
- // millisecond resolution of lastModified. (issue-55)
+ // millisecond resolution of lastModified. (issue-55)
forceReload = true;
return true;
}
-
+
private String regExEscape(String input) {
return input.replace(".", "\\.").replace("$", "\\$").replace("{", "\\{");
}
--
Gitblit v1.9.1