package com.swingsane.preferences;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import com.google.common.io.Files;
import com.swingsane.i18n.Localizer;
import com.swingsane.preferences.model.ApplicationPreferences;
import com.swingsane.preferences.model.Scanner;
import com.thoughtworks.xstream.XStream;
public class SwingSanePreferencesImpl implements ISwingSanePreferences {
private XStream xstream;
private ApplicationPreferences applicationPreferences = new ApplicationPreferences();
private static final File tmpDir = Files.createTempDir();
private static final String preferencesPath = System.getProperty("user.home") + File.separator
+ ".swingsane";
private static final String preferencesFileName = "preferences.xml";
@Override
public final void cleanUp() {
tmpDir.delete();
}
@Override
public final ApplicationPreferences getApplicationPreferences() {
return applicationPreferences;
}
private File getPreferencesFile() throws IOException {
File preferencesDir = new File(preferencesPath);
if (!(preferencesDir.exists())) {
if (!(preferencesDir.mkdirs()) || !(preferencesDir.canWrite())) {
throw new IOException(Localizer.localize("CannotOpenPreferencesDirectoryMessage"));
}
}
return new File(preferencesDir.getAbsolutePath() + File.separator + preferencesFileName);
}
@Override
public final File getTempDirectory() {
return tmpDir;
}
@Override
public final synchronized void load() throws IOException, ClassNotFoundException {
tmpDir.deleteOnExit();
xstream = XStreamUtility.getXStream();
File preferencesFile = getPreferencesFile();
if (!(preferencesFile.exists())) {
save();
}
ObjectInputStream s = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(preferencesFile);
s = xstream.createObjectInputStream(new InputStreamReader(fis, "UTF-8"));
applicationPreferences = ((ApplicationPreferences) s.readObject());
for (Scanner scanner : applicationPreferences.getScannerList()) {
PreferencesUtils.restoreCircularReferences(scanner);
}
} catch (IOException ex) {
throw ex;
} finally {
if (s != null) {
s.close();
}
if (fis != null) {
fis.close();
}
}
}
@Override
public final synchronized void save() throws IOException {
synchronized (SwingSanePreferencesImpl.class) {
File preferencesFile = getPreferencesFile();
String rootNodeName = "swingSane";
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
preferencesFile), "UTF-8"));
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
ObjectOutputStream oos;
oos = xstream.createObjectOutputStream(out, rootNodeName);
oos.writeObject(applicationPreferences);
oos.close();
}
}
}