From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.
---
src/com/gitblit/FileSettings.java | 62 ++++++++++++++++++++++++++++---
1 files changed, 56 insertions(+), 6 deletions(-)
diff --git a/src/com/gitblit/FileSettings.java b/src/com/gitblit/FileSettings.java
index 1e65422..be1f44f 100644
--- a/src/com/gitblit/FileSettings.java
+++ b/src/com/gitblit/FileSettings.java
@@ -18,10 +18,16 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.util.Map;
import java.util.Properties;
+import com.gitblit.utils.FileUtils;
+
/**
- * Reads GitBlit settings file.
+ * Dynamically loads and reloads a properties file by keeping track of the last
+ * modification date.
+ *
+ * @author James Moger
*
*/
public class FileSettings extends IStoredSettings {
@@ -30,16 +36,22 @@
private final Properties properties = new Properties();
- private volatile long lastread;
+ private volatile long lastModified;
+
+ private volatile boolean forceReload;
public FileSettings(String file) {
super(FileSettings.class);
this.propertiesFile = new File(file);
}
+ /**
+ * Returns a properties object which contains the most recent contents of
+ * the properties file.
+ */
@Override
protected synchronized Properties read() {
- if (propertiesFile.exists() && (propertiesFile.lastModified() > lastread)) {
+ if (propertiesFile.exists() && (forceReload || (propertiesFile.lastModified() > lastModified))) {
FileInputStream is = null;
try {
Properties props = new Properties();
@@ -49,7 +61,8 @@
// load properties after we have successfully read file
properties.clear();
properties.putAll(props);
- lastread = propertiesFile.lastModified();
+ lastModified = propertiesFile.lastModified();
+ forceReload = false;
} catch (FileNotFoundException f) {
// IGNORE - won't happen because file.exists() check above
} catch (Throwable t) {
@@ -67,8 +80,45 @@
return properties;
}
- protected long lastRead() {
- return lastread;
+ /**
+ * Updates the specified settings in the settings file.
+ */
+ public synchronized boolean saveSettings(Map<String, String> settings) {
+ String content = FileUtils.readContent(propertiesFile, "\n");
+ for (Map.Entry<String, String> setting:settings.entrySet()) {
+ String regex = "(?m)^(" + regExEscape(setting.getKey()) + "\\s*+=\\s*+)"
+ + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";
+ String oldContent = content;
+ content = content.replaceAll(regex, setting.getKey() + " = " + setting.getValue());
+ if (content.equals(oldContent)) {
+ // did not replace value because it does not exist in the file
+ // append new setting to content (issue-85)
+ content += "\n" + setting.getKey() + " = " + setting.getValue();
+ }
+ }
+ 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;
+ }
+
+ private String regExEscape(String input) {
+ return input.replace(".", "\\.");
+ }
+
+ /**
+ * @return the last modification date of the properties file
+ */
+ protected long lastModified() {
+ return lastModified;
+ }
+
+ /**
+ * @return the state of the force reload flag
+ */
+ protected boolean forceReload() {
+ return forceReload;
}
@Override
--
Gitblit v1.9.1