Stored Properties file gets emptied
It seems there is a bug with our XMPP client (Java 1.6, smack) - I store
the users settings in a Properties file. My boss tells me on some
customers PCs the settings file sometimes ends up losing the contents.
The application is used by two people in our company in production, I
debug before release. None of us is able to reproduce the effect.
I'll not post a SCCE yet, maybe something will jump out at someone more
experienced. My hunch is that it sometimes gets replaced with the
default properties, which according to the Javadocs does not get written
out (empty file, I assume rather then no file at all).
The application is a JWS app and uses the SingleInstanceService
<http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/examples.html#SingleInstanceService>>.
(it only pops up a dialog then exits the second instance).
I encapsulate the settings thusly:
public class Settings {
public final static int DEF_SEC_PORT = 5223;
public final static int DEF_PORT = 5222;
// etc
private boolean saveToFile = false;
private Properties defaultProperties;
private Properties userSettings;
private String settingsDirName;
private File settingsFile;
/**
* Creates a new instance of Settings.
* @param settingsDir directory where to find/keep the
* settings file.
* when null, does not write a file
*/
public Settings(String settingsDir) {
if (settingsDir != null && !settingsDir.isEmpty()) {
settingsDirName = settingsDir + "/" ;
settingsFile = new File(settingsDirName +
SETTINGS_FILE_NAME);
saveToFile = true;
} else saveToFile = false;
// initialize default values
defaultProperties = new Properties();
defaultProperties.setProperty("autoAway", String.valueOf(true));
defaultProperties.setProperty("autoAwayAfter",
String.valueOf(5));
defaultProperties.setProperty("identifyAsResource",
DEFAULT_RESOURCE);
//etc
returnToDefaults();
if (saveToFile) {
if (!readSettingsFile()) {
writeSettingsFile();
}
}
}
public final void returnToDefaults() {
userSettings = new Properties(defaultProperties);
}
public boolean writeSettingsFile() {
if (!saveToFile) return false;
FileOutputStream out = null;
try {
// save settings
out = new FileOutputStream(settingsFile);
userSettings.store(out, "---Auto generated---");
out.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
return false;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
finally{
if (out != null)
try {
out.close();
} catch (IOException ex) {
//ex.printStackTrace();
}
}
return true;
}
public boolean readSettingsFile() {
FileInputStream in = null;
try {
// read settings
in = new FileInputStream(settingsFile);
userSettings.load(in);
in.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
return false;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
finally {
if (in != null)
try {
in.close();
} catch (IOException ex) {
//ex.printStackTrace();
}
}
return true;
}
// main window position
/** Returns last main window position */
public final Point windowPosXY() {
//snip
}
/** Sets last main window position.
* @param pos position */
public final void windowPosXY(Point pos) {
//snip
}
// General settings
/** Returns auto away on or off */
public final boolean autoAway() {
return Boolean.valueOf(userSettings.getProperty("autoAway",
defaultProperties.getProperty("autoAway")));
}
/** Sets auto away setting.
* @param autoAway turn on or off */
public final void autoAway(boolean autoAway) {
userSettings.setProperty("autoAway", String.valueOf(autoAway));
}
// etc
The class is instanciated in the application at start up with
private static final String APP_HOME =
System.getProperties().getProperty("appdir");
private static final String USER_HOME =
System.getProperties().getProperty("user.home");
private static final String USER_APP_HOME = USER_HOME + "/op3mi";
if (APP_HOME == null) {
OPTIONS_DIRECTORY = new File(USER_APP_HOME, "/" +
OPTIONS_DIR_NAME).getAbsoluteFile();
} else {
OPTIONS_DIRECTORY = new File(APP_HOME, "/" +
OPTIONS_DIR_NAME).getAbsoluteFile();
}
appSettings = new Settings(OPTIONS_DIRECTORY.getAbsolutePath());
Thanks to any ideas in advance.
--
Op3racional - www.op3racional.eu
---------------------
If you're reading this, you're on Usenet
<http://oakroadsystems.com/genl/unice.htm>