James Moger
2014-04-17 1d78b8b372f15d89f10fd32cb0227a6a7966de3c
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("{", "\\{");
   }