package com.num.database.datasource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
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.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.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.utils.DeviceUtil;
//import com.sun.org.apache.regexp.internal.recompile;
public class LatencyDataSource extends DataSource {
private final String GRAPH_TYPE = "area";
private final String Y_AXIS_UNITS = "ms";
private final String[] MODES = {"normal","aggregate"};
public LatencyDataSource(Context context) {
super(context);
setDBHelper(new LatencyMapping(context));
}
private void addRow(Ping p, String connectionType) {
ContentValues value = new ContentValues();
Measure m = p.getMeasure();
value.put(LatencyMapping.COLUMN_TIME, getTime());
value.put(LatencyMapping.COLUMN_TYPE, p.getDst().getType());
value.put(LatencyMapping.COLUMN_CONNECTION,connectionType);
value.put(LatencyMapping.COLUMN_VALUE, m.getAverage());
value.put(LatencyMapping.COLUMN_MEASUREMENT, "average");
value.put(LatencyMapping.COLUMN_SRCIP, p.getSrcIp().substring(1));
value.put(LatencyMapping.COLUMN_DSTIP, p.getDst().getTagname());
ContentValues value2 = new ContentValues();
value2.put(LatencyMapping.COLUMN_TIME, getTime());
value2.put(LatencyMapping.COLUMN_TYPE, p.getDst().getType());
value2.put(LatencyMapping.COLUMN_CONNECTION,connectionType);
value2.put(LatencyMapping.COLUMN_VALUE, m.getMin());
value2.put(LatencyMapping.COLUMN_MEASUREMENT, "minimum");
value2.put(LatencyMapping.COLUMN_SRCIP, p.getSrcIp().substring(1));
value2.put(LatencyMapping.COLUMN_DSTIP, p.getDst().getTagname());
ContentValues value3 = new ContentValues();
value3.put(LatencyMapping.COLUMN_TIME, getTime());
value3.put(LatencyMapping.COLUMN_TYPE, p.getDst().getType());
value3.put(LatencyMapping.COLUMN_CONNECTION,connectionType);
value3.put(LatencyMapping.COLUMN_VALUE, m.getMax());
value3.put(LatencyMapping.COLUMN_MEASUREMENT, "maximum");
value3.put(LatencyMapping.COLUMN_SRCIP, p.getSrcIp().substring(1));
value3.put(LatencyMapping.COLUMN_DSTIP, p.getDst().getTagname());
ContentValues value4 = new ContentValues();
value4.put(LatencyMapping.COLUMN_TIME, getTime());
value4.put(LatencyMapping.COLUMN_TYPE, p.getDst().getType());
value4.put(LatencyMapping.COLUMN_CONNECTION,connectionType);
value4.put(LatencyMapping.COLUMN_VALUE, m.getStddev());
value4.put(LatencyMapping.COLUMN_MEASUREMENT, "std deviation");
value4.put(LatencyMapping.COLUMN_SRCIP, p.getSrcIp().substring(1));
value4.put(LatencyMapping.COLUMN_DSTIP, p.getDst().getTagname());
database.insert(dbHelper.getTableName(), null, value);
database.insert(dbHelper.getTableName(), null, value2);
database.insert(dbHelper.getTableName(), null, value3);
database.insert(dbHelper.getTableName(), null, value4);
}
protected void insertModel(Model model) {
String currentConnectionType = DeviceUtil.getNetworkInfo(context);
try{
addRow((Ping) model, currentConnectionType);
} catch (Exception e) {
GAnalytics.log(GAnalytics.DATABASE, "Insert Fail " + dbHelper.getDBName(),e.getMessage());
e.printStackTrace();
}
}
public DatabaseOutput getOutput() {
List<Map<String,String>> allData = getDataStores();
int totalUpload = 0;
int totalDownload = 0;
int countUpload = 0;
int countDownload = 0;
String currentConnectionType = DeviceUtil.getNetworkInfo(context);
for (Map<String,String> data : allData) {
}
if(countDownload==0) countDownload++;
if(countUpload==0) countUpload++;
DatabaseOutput output = new DatabaseOutput();
output.add("avg_upload", ""+totalUpload/countUpload);
output.add("avg_download", ""+totalDownload/countDownload);
return output;
}
public HashMap<String, ArrayList<GraphPoint>> getGraphData() {
return getGraphData(DeviceUtil.getNetworkInfo(context), "Atlanta, GA");
}
public HashMap<String, ArrayList<GraphPoint>> getGraphData(String currentConnectionType, String destination) {
List<Map<String,String>> allData = getDataStores();
ArrayList<GraphPoint> roundtripPoints = new ArrayList<GraphPoint>();
ArrayList<GraphPoint> firsthopPoints = new ArrayList<GraphPoint>();
for (Map<String,String> data : allData) {
if(!data.get(LatencyMapping.COLUMN_CONNECTION).equals(currentConnectionType)) {
continue;
}
if(!data.get(LatencyMapping.COLUMN_DSTIP).equals(destination)) {
continue;
}
if(data.get(ThroughputMapping.COLUMN_TYPE).equals("ping")){
try {
roundtripPoints.add(new GraphPoint(roundtripPoints.size(),extractValue(data),extractTime(data)));
} catch (Exception e) {
continue;
}
} else if(data.get(ThroughputMapping.COLUMN_TYPE).equals("firsthop")){
try {
firsthopPoints.add(new GraphPoint(firsthopPoints.size(),extractValue(data),extractTime(data)));
} catch (Exception e) {
continue;
}
}
}
HashMap collection = new HashMap<String,ArrayList<GraphPoint>>();
collection.put("ping", roundtripPoints);
collection.put("firsthop", firsthopPoints);
return collection;
}
@Override
public int extractValue(Map<String, String> data) {
return (int)Double.parseDouble(data.get(LatencyMapping.COLUMN_VALUE));
}
@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.incrementCount();
oldP.y+=newP.y;
}
@Override
public String[] getModes() {
return MODES;
}
}