/**
* Copyright (C) 2009 Future Invent Informationsmanagement GmbH. All rights
* reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option) any
* later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*/
package org.fuin.utils4j;
import java.io.File;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import java.util.prefs.PreferencesFactory;
/**
* A factory for creating root nodes using the
* PropertiesFilePreferences
implementation.
*/
public final class PropertiesFilePreferencesFactory implements PreferencesFactory {
/**
* System property key used containing the path and name of the "system"
* preferences directory.
*/
public static final String SYSTEM_PREF_DIR = "PropertiesFilePreferences.SystemDir";
/**
* System property key used containing the path and name of the "user"
* preferences directory.
*/
public static final String USER_PREF_DIR = "PropertiesFilePreferences.UserDir";
private final String systemPrefDir;
private final String userPrefDir;
private PropertiesFilePreferences systemRoot = null;
private PropertiesFilePreferences userRoot = null;
/**
* Default constructor.
*/
public PropertiesFilePreferencesFactory() {
this(System.getProperty(SYSTEM_PREF_DIR), System.getProperty(USER_PREF_DIR));
}
/**
* Constructor with path and filenames of the system and user root
* directories.
*
* @param systemPrefDir
* Path and name of the "system" preferences directory.
* @param userPrefDir
* Path and name of the "user" preferences directory.
*/
public PropertiesFilePreferencesFactory(final String systemPrefDir, final String userPrefDir) {
super();
this.systemPrefDir = systemPrefDir;
this.userPrefDir = userPrefDir;
}
/**
* {@inheritDoc}
*/
public final synchronized Preferences systemRoot() {
if (systemRoot == null) {
systemRoot = new PropertiesFilePreferences(getValidDir(SYSTEM_PREF_DIR, systemPrefDir));
// Always sync at shutdown
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
systemRoot.flush();
} catch (final BackingStoreException ex) {
System.err.println("Failed to save 'systemRoot' preferences!");
ex.printStackTrace(System.err);
}
}
});
}
return systemRoot;
}
/**
* {@inheritDoc}
*/
public final synchronized Preferences userRoot() {
if (userRoot == null) {
userRoot = new PropertiesFilePreferences(getValidDir(USER_PREF_DIR, userPrefDir));
// Always sync at shutdown
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
userRoot.flush();
} catch (final BackingStoreException ex) {
System.err.println("Failed to save 'userRoot' preferences!");
ex.printStackTrace(System.err);
}
}
});
}
return userRoot;
}
/**
* Checks if the system variable is set and is a valid directory. If this is
* not the case a {@link RuntimeException} will be thrown.
*
* @param varName
* Name of the system variable.
* @param dirName
* Name of the directory (from the system variable).
*
* @return Directory reference.
*/
private File getValidDir(final String varName, final String dirName) {
if (dirName == null) {
throw new RuntimeException("The system variable '" + varName + "' is not set!");
}
final File dir = new File(dirName);
if (!dir.exists()) {
throw new IllegalArgumentException("The directory '" + dir
+ "' does not exist! [system variable '" + varName + "']");
}
if (!dir.isDirectory()) {
throw new IllegalArgumentException("The name '" + dir
+ "' is not a directory! [system variable '" + varName + "']");
}
return dir;
}
}