package edu.mit.media.funf.action; import android.content.ContentValues; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.google.gson.JsonElement; import edu.mit.media.funf.config.Configurable; import edu.mit.media.funf.config.RuntimeTypeAdapterFactory; import edu.mit.media.funf.json.IJsonObject; import edu.mit.media.funf.probe.Probe.DataListener; import edu.mit.media.funf.probe.builtin.ProbeKeys; import edu.mit.media.funf.storage.NameValueDatabaseHelper; import edu.mit.media.funf.util.LogUtil; public class WriteDataAction extends Action implements DataListener { @Configurable private SQLiteOpenHelper dbHelper = null; WriteDataAction() { } public WriteDataAction(SQLiteOpenHelper dbHelper) { this.dbHelper = dbHelper; } protected void execute(String key, IJsonObject data) { if (key == null || data == null) return; SQLiteDatabase db = dbHelper.getWritableDatabase(); final double timestamp = data.get(ProbeKeys.BaseProbeKeys.TIMESTAMP).getAsDouble(); final String value = data.toString(); if (timestamp == 0L || key == null || value == null) { Log.e(LogUtil.TAG, "Unable to save data. Not all required values specified. " + timestamp + " " + key + " - " + value); throw new SQLException("Not all required fields specified."); } ContentValues cv = new ContentValues(); cv.put(NameValueDatabaseHelper.COLUMN_NAME, key); cv.put(NameValueDatabaseHelper.COLUMN_VALUE, value); cv.put(NameValueDatabaseHelper.COLUMN_TIMESTAMP, timestamp); db.insertOrThrow(NameValueDatabaseHelper.DATA_TABLE.name, "", cv); } @Override public void onDataReceived(IJsonObject probeConfig, IJsonObject data) { final String key = probeConfig.get(RuntimeTypeAdapterFactory.TYPE).toString(); final IJsonObject finalData = data; ensureHandlerExists(); getHandler().post(new Runnable() { @Override public void run() { execute(key, finalData); } }); } @Override public void onDataCompleted(IJsonObject probeConfig, JsonElement checkpoint) { String key = probeConfig.get(RuntimeTypeAdapterFactory.TYPE).toString(); Log.d(LogUtil.TAG, "finished writing probe data " + key); setHandler(null); // free system resources as data stream has completed. } protected boolean isLongRunningAction() { return true; } }