package net.osmand.plus.api;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import net.osmand.plus.OsmandApplication;
public class FileSettingsAPIImpl implements SettingsAPI {
protected OsmandApplication app;
protected ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<String, Object>();
protected File file;
public FileSettingsAPIImpl(OsmandApplication app, File file) throws IOException {
this.file = file;
if (file.exists()) {
Properties props = new Properties();
FileInputStream fis = new FileInputStream(file);
props.load(fis);
for (Object key : props.keySet()) {
String k = key.toString();
map.put(k, props.get(key));
}
}
}
@Override
public Object getPreferenceObject(String key) {
return key;
}
private String wrap(Object pref, String key) {
return pref + "."+key;
}
@Override
public SettingsEditor edit(final Object pref) {
return new SettingsEditor() {
Map<String, Object> modified = new LinkedHashMap<String, Object>();
@Override
public SettingsEditor remove(String key) {
modified.put(wrap(pref,key), null);
return this;
}
@Override
public SettingsEditor putString(String key, String value) {
modified.put(wrap(pref,key), value);
return this;
}
@Override
public SettingsEditor putLong(String key, long value) {
modified.put(key, value+"");
return this;
}
@Override
public SettingsEditor putInt(String key, int value) {
modified.put(wrap(pref,key), value);
return this;
}
@Override
public SettingsEditor putFloat(String key, float value) {
modified.put(wrap(pref,key), value);
return this;
}
@Override
public SettingsEditor putBoolean(String key, boolean value) {
modified.put(wrap(pref,key), value);
return this;
}
@Override
public boolean commit() {
return commitToFile(modified);
}
};
}
private boolean commitToFile(Map<String, Object> modified) {
for(Entry<String, Object> e : modified.entrySet()) {
if (e.getValue() == null) {
map.remove(e.getKey());
} else {
map.put(e.getKey(), e.getValue());
}
}
return saveFile();
}
public boolean saveFile() {
try {
Properties ps = new Properties();
Iterator<Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, Object> e = it.next();
ps.put(e.getKey(), String.valueOf(e.getValue()));
}
final FileOutputStream fout = new FileOutputStream(file);
ps.store(fout, null);
fout.close();
return true;
} catch (IOException e1) {
e1.printStackTrace();
return false;
}
}
@Override
public String getString(Object pref, String key, String defValue) {
Object obj = map.get(wrap(pref,key));
if(obj == null) {
return defValue;
}
return obj.toString();
}
@Override
public float getFloat(Object pref, String key, float defValue) {
Object obj = map.get(wrap(pref,key));
if(obj == null) {
return defValue;
}
if(obj instanceof Number) {
return ((Number)obj).floatValue();
} else {
try {
float flot = Float.parseFloat(obj.toString());
map.put(wrap(pref, key), flot);
return flot;
} catch (NumberFormatException e) {
return defValue;
}
}
}
@Override
public boolean getBoolean(Object pref, String key, boolean defValue) {
Object obj = map.get(wrap(pref,key));
if(obj == null) {
return defValue;
}
return Boolean.parseBoolean(obj.toString());
}
@Override
public int getInt(Object pref, String key, int defValue) {
Object obj = map.get(wrap(pref,key));
if(obj == null) {
return defValue;
}
if(obj instanceof Number) {
return ((Number)obj).intValue();
} else {
try {
int num = Integer.parseInt(obj.toString());
map.put(wrap(pref, key), num);
return num;
} catch (NumberFormatException e) {
return defValue;
}
}
}
@Override
public long getLong(Object pref, String key, long defValue) {
Object obj = map.get(wrap(pref,key));
if(obj == null) {
return defValue;
}
if(obj instanceof Number) {
return ((Number)obj).longValue();
} else {
try {
long num = Long.parseLong(obj.toString());
map.put(wrap(pref, key), num);
return num;
} catch (NumberFormatException e) {
return defValue;
}
}
}
@Override
public boolean contains(Object pref, String key) {
return map.containsKey(wrap(pref,key));
}
}