package cn.alphabets.light.store;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.LruCache;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import cn.alphabets.light.util.AuthUtil;
/**
* Created by 罗浩 on 14/11/19.
*/
public class Storeable {
private static final Logger log = Logger.getLogger(Storeable.class);
private static final String StorePrefix = "cn.alphabets.light.store";
private static LruCache<String, Object> cache = new LruCache<String, Object>(50);
public static void store(Context ctx, String key, Object data) throws IOException, NoSuchAlgorithmException, UnsupportedOperationException {
if (isMetaType(data)) {
storeToSP(ctx, key, data);
} else if (data instanceof Serializable) {
storeToFile(ctx, key, (Serializable) data);
} else {
throw new UnsupportedOperationException("data type is not support");
}
}
public static void delete(Context ctx, String key) {
SharedPreferences sp = ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE);
if (sp.contains(key)) {
sp.edit().remove(key).commit();
return;
}
try {
File path = new File(ctx.getExternalFilesDir(null) + File.separator + "store" + File.separator + AuthUtil.md5(key) + ".dat");
if (path.exists()) {
path.delete();
}
cache.remove(key);
} catch (Exception e) {
log.error(e);
}
}
private static void storeToSP(Context ctx, String key, Object data) {
SharedPreferences sp = ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE);
SharedPreferences.Editor e = sp.edit();
if (data instanceof String) {
e.putString(key, (String) data);
}
if (data instanceof Integer) {
e.putInt(key, (Integer) data);
}
if (data instanceof Long) {
e.putLong(key, (Long) data);
}
if (data instanceof Float) {
e.putFloat(key, (Float) data);
}
if (data instanceof Boolean) {
e.putBoolean(key, (Boolean) data);
}
e.commit();
}
private static void storeToFile(Context ctx, String key, Serializable data) throws IOException, NoSuchAlgorithmException {
File dir = new File(ctx.getExternalFilesDir(null) + File.separator + "store");
if (!dir.exists()) {
dir.mkdirs();
}
File path = new File(dir.toString() + File.separator + AuthUtil.md5(key) + ".dat");
if (path.exists()) {
path.delete();
}
FileOutputStream out = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(data);
oos.close();
out.close();
cache.put(key, data);
}
public static int getInt(Context ctx, String key, int i) {
return ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE).getInt(key, i);
}
public static long getLong(Context ctx, String key, long l) {
return ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE).getLong(key, l);
}
public static float getFloat(Context ctx, String key, float v) {
return ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE).getFloat(key, v);
}
public static boolean getBoolean(Context ctx, String key, boolean b) {
return ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE).getBoolean(key, b);
}
public static String getString(Context ctx, String key, String s) {
return ctx.getApplicationContext().getSharedPreferences(StorePrefix, Context.MODE_PRIVATE).getString(key, s);
}
public static <T> T getData(Context ctx, String key) {
T result = (T) cache.get(key);
if (result != null) {
return result;
}
FileInputStream in = null;
ObjectInputStream ois = null;
try {
File dir = new File(ctx.getExternalFilesDir(null) + File.separator + "store");
File path = new File(dir.toString() + File.separator + AuthUtil.md5(key) + ".dat");
if (!path.exists()) {
return result;
}
in = new FileInputStream(path);
ois = new ObjectInputStream(in);
result = (T) ois.readObject();
ois.close();
in.close();
} catch (Exception e) {
log.error(e);
} finally {
return result;
}
}
private static boolean isMetaType(Object data) {
return data instanceof String
|| data instanceof Integer
|| data instanceof Long
|| data instanceof Float
|| data instanceof Boolean;
}
}