package com.newsrob.util;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import android.content.Context;
import com.newsrob.PL;
public class SingleValueStore {
private Context ctx;
private Map<String, File> files = new HashMap<String, File>();
private ExecutorService executorService = Executors.newCachedThreadPool();
private Map<String, String> data = new HashMap<String, String>();
public SingleValueStore(Context context) {
this.ctx = context.getApplicationContext() != null ? context.getApplicationContext() : context;
}
public String getString(final String key) {
String result = data.get(key);
if (result != null)
return result;
File f = getFile(key);
if (!f.exists())
return null;
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(f, "r");
result = raf.readLine();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (raf != null)
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public void putString(final String key, final String value) {
data.put(key, value);
Runnable saveRunnable = new Runnable() {
@Override
public void run() {
File f = getFile(key);
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(f, "rw");
raf.writeBytes(value + "\n");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf != null)
try {
raf.close();
data.remove(key);
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
try {
executorService.execute(saveRunnable);
} catch (RejectedExecutionException e) {
PL
.log(
"SingleValueStore: Oops cannot execute because of a RejectedExecutionException. Running it on the sending thread instead.",
ctx);
saveRunnable.run();
}
}
public void putLong(final String key, final Long value) {
putString(key, String.valueOf(value));
}
public Long getLong(final String key) {
return getLong(key, null);
}
public Long getLong(final String key, final Long def) {
String s = getString(key);
if (s == null)
return def;
try {
return Long.parseLong(s);
} catch (NumberFormatException nfe) {
return def;
}
}
private File getFile(String key) {
if (!files.containsKey(key))
files.put(key, new File(ctx.getFilesDir(), "svs_" + key));
return files.get(key);
}
}