package com.num.database.datasource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.apache.http.cookie.SetCookie;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.num.database.DatabaseOutput;
import com.num.database.mapping.ApplicationMapping;
import com.num.database.mapping.BaseMapping;
import com.num.database.mapping.LatencyMapping;
import com.num.database.mapping.ThroughputMapping;
import com.num.helpers.GAnalytics;
import com.num.models.GraphData;
import com.num.models.Application;
import com.num.models.GraphPoint;
import com.num.models.LastMile;
import com.num.models.Link;
import com.num.models.MainModel;
import com.num.models.Measure;
import com.num.models.Model;
import com.num.models.Ping;
import com.num.models.Throughput;
import com.num.models.Usage;
import com.num.utils.DeviceUtil;
public class ApplicationDataSource extends DataSource {
private final String GRAPH_TYPE = "bar";
private final String Y_AXIS_UNITS = "KB";
private final String[] MODES = {"aggregate"};
public ApplicationDataSource(Context context) {
super(context);
setDBHelper(new ApplicationMapping(context));
}
private void addRow(Application app) {
ContentValues value = new ContentValues();
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, app.getName());
value.put(ApplicationMapping.COLUMN_DATA, app.getTotal_sent());
value.put(ApplicationMapping.COLUMN_DIRECTION, "sent");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, app.getName());
value.put(ApplicationMapping.COLUMN_DATA, app.getTotal_recv());
value.put(ApplicationMapping.COLUMN_DIRECTION, "received");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, app.getName());
value.put(ApplicationMapping.COLUMN_DATA, app.getTotal());
value.put(ApplicationMapping.COLUMN_DIRECTION, "total");
database.insert(dbHelper.getTableName(), null, value);
}
private void addRow(Usage usage) {
ContentValues value = new ContentValues();
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All");
value.put(ApplicationMapping.COLUMN_DATA, usage.getTotal_sent());
value.put(ApplicationMapping.COLUMN_DIRECTION, "sent");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All");
value.put(ApplicationMapping.COLUMN_DATA, usage.getTotal_recv());
value.put(ApplicationMapping.COLUMN_DIRECTION, "received");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All");
value.put(ApplicationMapping.COLUMN_DATA, usage.getTotal());
value.put(ApplicationMapping.COLUMN_DIRECTION, "total");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Mobile");
value.put(ApplicationMapping.COLUMN_DATA, usage.getMobile_sent());
value.put(ApplicationMapping.COLUMN_DIRECTION, "sent");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Mobile");
value.put(ApplicationMapping.COLUMN_DATA, usage.getMobile_recv());
value.put(ApplicationMapping.COLUMN_DIRECTION, "received");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Mobile");
value.put(ApplicationMapping.COLUMN_DATA, usage.getMobile());
value.put(ApplicationMapping.COLUMN_DIRECTION, "total");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Wifi");
value.put(ApplicationMapping.COLUMN_DATA, usage.getWifi_sent());
value.put(ApplicationMapping.COLUMN_DIRECTION, "sent");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Wifi");
value.put(ApplicationMapping.COLUMN_DATA, usage.getWifi_recv());
value.put(ApplicationMapping.COLUMN_DIRECTION, "received");
database.insert(dbHelper.getTableName(), null, value);
value.put(ApplicationMapping.COLUMN_TIME, getTime());
value.put(ApplicationMapping.COLUMN_NAME, "All Wifi");
value.put(ApplicationMapping.COLUMN_DATA, usage.getWifi());
value.put(ApplicationMapping.COLUMN_DIRECTION, "total");
database.insert(dbHelper.getTableName(), null, value);
}
protected void insertModel(Model model) {
Usage usage = (Usage) model;
for (Application app : usage.getApplications()) {
try {
addRow(app);
} catch (Exception e) {
GAnalytics.log(GAnalytics.DATABASE, "Insert Fail " + dbHelper.getDBName(),e.getMessage());
e.printStackTrace();
}
}
addRow(usage);
}
public DatabaseOutput getOutput() {
open();
close();
return null;
}
public HashMap<String, ArrayList<GraphPoint>> getGraphData() {
// return getGraphData(DeviceUtil.getNetworkInfo(context),
// "Atlanta, GA");
return null;
}
public ArrayList<GraphPoint> getAggregateGraphData(HashMap<String, String> filter) {
List<Map<String, String>> allData = getDataStores(filter);
ArrayList<GraphPoint> points = new ArrayList<GraphPoint>();
int oldValue = 0;
boolean isFirst = true;
Map<String, GraphPoint> pointmap = new HashMap<String, GraphPoint>();
for (Map<String, String> data : allData) {
int newValue = extractValue(data);
int difference = 0;
if (newValue < oldValue)
difference = newValue;
else
difference = newValue - oldValue;
if (isFirst) {
isFirst = false;
} else {
GraphPoint newPoint = new GraphPoint(0, difference,
extractTime(data));
newPoint.setString(extractDate(data));
newPoint.sortByDate(true);
String date = extractDate(data);
if (pointmap.containsKey(date)) {
GraphPoint oldPoint = pointmap.get(date);
aggregatePoints(oldPoint, newPoint);
} else {
pointmap.put(date, newPoint);
}
}
oldValue = newValue;
}
Iterator<String> iter = pointmap.keySet().iterator();
int count = 0;
while (iter.hasNext()) {
String date = iter.next();
points.add(pointmap.get(date));
}
try {
Collections.sort(points);
} catch (Exception e) {
e.printStackTrace();
}
for (GraphPoint point : points) {
point.x = count++;
}
return points;
}
@Override
public int extractValue(Map<String, String> data) {
return (int) Double.parseDouble(data
.get(ApplicationMapping.COLUMN_DATA)) / 1000;
}
@Override
public Date extractTime(Map<String, String> data) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = data.get(LatencyMapping.COLUMN_TIME);
try {
return df.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
return new Date();
}
}
@Override
public String getGraphType() {
return GRAPH_TYPE;
}
@Override
public String getYAxisLabel() {
return Y_AXIS_UNITS;
}
@Override
public void aggregatePoints(GraphPoint oldP, GraphPoint newP) {
oldP.y+=newP.y;
}
@Override
public String[] getModes() {
return MODES;
}
}