aboutsummaryrefslogtreecommitdiff
path: root/src/net/cbaines/suma/DataManager.java
diff options
context:
space:
mode:
authorChristopher Baines <cbaines8@gmail.com>2012-01-04 21:15:15 +0000
committerChristopher Baines <cbaines8@gmail.com>2012-01-04 21:15:15 +0000
commit9f0e1e1520070a2d73137f799538c44c42c47c0c (patch)
tree0be4f0a3484ac1cec6078b3c997d3db79820b6af /src/net/cbaines/suma/DataManager.java
downloadsouthamptonuniversitymap-9f0e1e1520070a2d73137f799538c44c42c47c0c.tar
southamptonuniversitymap-9f0e1e1520070a2d73137f799538c44c42c47c0c.tar.gz
Initial commit.
Diffstat (limited to 'src/net/cbaines/suma/DataManager.java')
-rw-r--r--src/net/cbaines/suma/DataManager.java726
1 files changed, 726 insertions, 0 deletions
diff --git a/src/net/cbaines/suma/DataManager.java b/src/net/cbaines/suma/DataManager.java
new file mode 100644
index 0000000..e910c8e
--- /dev/null
+++ b/src/net/cbaines/suma/DataManager.java
@@ -0,0 +1,726 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.sql.SQLException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.osmdroid.ResourceProxy;
+import org.osmdroid.util.GeoPoint;
+import org.osmdroid.views.overlay.PathOverlay;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.j256.ormlite.android.apptools.OpenHelperManager;
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.stmt.PreparedQuery;
+import com.j256.ormlite.stmt.QueryBuilder;
+import com.j256.ormlite.table.TableUtils;
+
+public class DataManager {
+
+ final static String TAG = "DataManager";
+
+ final static String busStopUrl = "http://data.southampton.ac.uk/bus-stop/";
+
+ private static Context context;
+
+ private static DatabaseHelper helper;
+ private static Dao<BusRoute, Integer> busRoutes;
+ private static Dao<Bus, Integer> busDao;
+ private static Dao<BusStop, String> busStopDao;
+ private static Dao<Stop, Integer> stopDao;
+
+ public static void loadBuildings(Context context) throws SQLException, IOException {
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ Dao<Building, String> buildingDao = helper.getBuildingDao();
+
+ TableUtils.clearTable(helper.getConnectionSource(), Building.class);
+
+ Log.i(TAG, "Loading buildings from csv");
+
+ HashMap<String, GeoPoint> buildingPoints = new HashMap<String, GeoPoint>();
+ HashMap<String, Polygon> buildingPolys = new HashMap<String, Polygon>();
+
+ InputStream inputStream = context.getAssets().open("buildings_points.csv");
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ String strLine;
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the definition " + def);
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Data: " + strLine);
+ String[] dataBits = strLine.split(",");
+ GeoPoint point = Util.csLatLongToGeoPoint(dataBits[2], dataBits[1]);
+ // Log.i(TAG, "Creating building with id " + dataBits[0] + " and " + point.getLatitudeE6() + " " + point.getLongitudeE6());
+ buildingPoints.put(dataBits[0], point);
+ }
+
+ bufferedReader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ Log.i(TAG, "Number of building points " + buildingPoints.size());
+
+ /*
+ * inputStream = context.getResources().openRawResource(R.raw.buildings_shapes); bufferedReader = new BufferedReader(new
+ * InputStreamReader(inputStream));
+ *
+ * try { String def = bufferedReader.readLine(); // Log.i(TAG, "Reading the definition " + def);
+ *
+ * while ((strLine = bufferedReader.readLine()) != null) { // Log.i(TAG, "Data: " + strLine); String[] dataBits = strLine.split(","); Polygon poly =
+ * Util.csPolygonToPolygon(strLine.split("\"")[1]); // Log.i(TAG, "Creating building with id " + dataBits[0] + " and " + poly);
+ * buildingPolys.put(dataBits[0], poly); }
+ *
+ * bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
+ *
+ * Log.i(TAG, "Number of polys points " + buildingPolys.size());
+ */
+
+ inputStream = context.getAssets().open("building_estates.csv");
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the definition " + def);
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Data: " + strLine);
+ if (strLine.startsWith("\"")) {
+ String[] quoteBits = strLine.split("\"");
+ // Log.i(TAG, "QuoteBits " + quoteBits[0] + " | " + quoteBits[1]);
+ String[] dataBits = quoteBits[2].split(",");
+ // Log.i(TAG, "dataBits " + dataBits[0] + " | " + dataBits[1]);
+
+ if (buildingPoints.get(dataBits[1]) == null) {
+ // Log.w(TAG, "Building " + dataBits[1] + " has a null point");
+ continue;
+ }
+
+ Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"), quoteBits[0]);
+ /*
+ * Polygon poly = buildingPolys.get(dataBits[1]);
+ *
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * bdg.point.getLongitudeE6() + " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * bdg.point.getLongitudeE6()); }
+ */
+
+ // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " + bdg.residential + " " + bdg.outline);
+
+ buildingDao.create(bdg);
+
+ } else {
+
+ String[] dataBits = strLine.split(",");
+
+ if (buildingPoints.get(dataBits[1]) == null) {
+ // Log.w(TAG, "Building " + dataBits[1] + " has a null point");
+ continue;
+ }
+
+ Building bdg = new Building(dataBits[1], buildingPoints.get(dataBits[1]), dataBits[3].equals("R"), dataBits[0]);
+ /*
+ * Polygon poly = buildingPolys.get(dataBits[1]);
+ *
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * bdg.point.getLongitudeE6() + " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " +
+ * bdg.point.getLongitudeE6()); }
+ */
+
+ // Log.i(TAG, "Creating building " + bdg.id + " " + bdg.name + " " + bdg.point + " " + bdg.residential + " " + bdg.outline);
+
+ buildingDao.create(bdg);
+
+ }
+ }
+
+ bufferedReader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ /*
+ * for (Iterator<String> iter = buildingPoints.keySet().iterator(); iter.hasNext();) { String key = iter.next();
+ *
+ * Building bdg = new Building(key, buildingPoints.get(key), false); Polygon poly = buildingPolys.get(key);
+ *
+ * if (poly != null) { bdg.outline = poly; // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6() +
+ * " " + poly); } else { // Log.i(TAG, "Adding building " + key + " " + bdg.point.getLatitudeE6() + " " + bdg.point.getLongitudeE6()); }
+ *
+ * buildingDao.create(bdg); }
+ */
+
+ }
+
+ public static void loadBusData(Context context, boolean onlyUniLink) throws SQLException, IOException {
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ Dao<BusStop, String> busStopDao = helper.getBusStopDao();
+ Dao<BusRoute, Integer> busRouteDao = helper.getBusRouteDao();
+ Dao<RouteStops, Integer> routeStopsDao = helper.getRouteStopsDao();
+
+ TableUtils.clearTable(helper.getConnectionSource(), BusStop.class);
+ TableUtils.clearTable(helper.getConnectionSource(), BusRoute.class);
+ TableUtils.clearTable(helper.getConnectionSource(), RouteStops.class);
+
+ Log.i(TAG, "Loading busstops from csv");
+
+ InputStream inputStream = context.getAssets().open("bus_stops.csv");
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ String strLine = "";
+
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the definition " +def );
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Data: " + strLine);
+ String[] dataBits = strLine.split(",");
+
+ String[] quBitsLat = dataBits[3].substring(1, dataBits[3].length() - 1).split(" ");
+ String[] quBitsLng = dataBits[4].substring(1, dataBits[4].length() - 1).split(" ");
+
+ // Log.i(TAG, "Whole " + dataBits[3] + " First bit " + quBitsLat[0] + " last bit " + quBitsLat[1]);
+ double lat = Double.valueOf(quBitsLat[0]) + Double.valueOf(quBitsLat[1].substring(0, quBitsLat[1].length() - 1)) / 60d; // TODO Much hackage
+ // Log.i(TAG, "Whole " + dataBits[4] + " First bit " + quBitsLng[0] + " last bit " + quBitsLng[1]);
+ double lng = Double.valueOf(quBitsLng[0]) + Double.valueOf(quBitsLng[1].substring(0, quBitsLng[1].length() - 1)) / 60d; // TODO Much hackage
+ GeoPoint point = new GeoPoint((int) (lat * 1e6), (int) (lng * -1e6));
+ // Log.i(TAG, "Lat " + point.getLatitudeE6() + " lng " + point.getLongitudeE6());
+
+ busStopDao.create(new BusStop(dataBits[0].replace("\"", ""), dataBits[1].replace("\"", ""), dataBits[2].replace("\"", ""), point));
+
+ }
+
+ bufferedReader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(TAG, "Line: " + strLine);
+ e.printStackTrace();
+ }
+
+ Log.i(TAG, "Finished loading busstops, now loading routes");
+
+ inputStream = context.getAssets().open("routes.csv");
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the definition " + def);
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Data: " + strLine);
+ String[] dataBits = strLine.split(",");
+
+ BusRoute route = new BusRoute(Integer.parseInt(dataBits[0]), dataBits[1], dataBits[2].replace("\"", ""));
+ // Log.i(TAG, "Loaded route " + route.id + " " + route.code + " " + route.label);
+ busRouteDao.create(route);
+
+ }
+
+ bufferedReader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(TAG, "Line: " + strLine);
+ e.printStackTrace();
+ }
+
+ Log.i(TAG, "Finished loading routes, now loading routestops");
+
+ inputStream = context.getAssets().open("routestops.csv");
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the definition " + def);
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Data: " + strLine);
+ String[] dataBits = strLine.split(",");
+
+ BusStop stop = busStopDao.queryForId(dataBits[2]);
+ if (stop != null) {
+ // Log.i(TAG, "Found stop " + stop.id);
+ } else {
+ Log.w(TAG, "No stop found for " + dataBits[2]);
+ continue;
+ }
+
+ BusRoute route = busRouteDao.queryForId(Integer.parseInt(dataBits[0]));
+ if (route != null) {
+ // Log.i(TAG, "Found route " + route.id);
+ } else {
+ Log.w(TAG, "No route found for " + dataBits[0]);
+ continue;
+ }
+
+ int sequence = Integer.parseInt(dataBits[1]);
+ Log.i(TAG, "Creating RouteStop " + stop.id + " " + route.code + " " + sequence);
+
+ routeStopsDao.create(new RouteStops(stop, route, sequence));
+
+ if (route.id == 326) { // U1
+ stop.routes = (byte) (stop.routes | 1);
+ } else if (route.id == 468) { // U1N
+ stop.routes = (byte) (stop.routes | (1 << 1));
+ } else if (route.id == 329) { // U2
+ stop.routes = (byte) (stop.routes | (1 << 2));
+ } else if (route.id == 327) { // U6
+ stop.routes = (byte) (stop.routes | (1 << 3));
+ } else if (route.id == 354) { // U9
+ stop.routes = (byte) (stop.routes | (1 << 4));
+ }
+ Log.v(TAG, "Stop routes " + stop.routes);
+ busStopDao.update(stop);
+
+ }
+
+ bufferedReader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(TAG, "Line: " + strLine);
+ e.printStackTrace();
+ }
+
+ // TODO: Seperate non unilink stuff in to a different table
+ if (onlyUniLink) {
+
+ long sizeBeforeRemoval = busStopDao.countOf();
+
+ // Removing busstops not used by unilink busses
+ for (Iterator<BusStop> busStopIter = busStopDao.iterator(); busStopIter.hasNext();) {
+ BusStop stop = busStopIter.next();
+ // Log.i(TAG, "Looking at stop " + stop.id);
+
+ /*
+ * QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder(); routeStopsQueryBuilder.where().eq(columnName, value)
+ *
+ * DeleteBuilder<BusStop, String> deleteBuilder = busStopDao.deleteBuilder(); // only delete the rows where password is null
+ * deleteBuilder.where().in(RouteStops.STOP_ID_FIELD_NAME, objects) accountDao.delete(deleteBuilder.prepare());
+ */
+
+ QueryBuilder<RouteStops, Integer> routeStopsQueryBuilder = routeStopsDao.queryBuilder();
+ routeStopsQueryBuilder.setCountOf(true);
+ routeStopsQueryBuilder.where().eq(RouteStops.STOP_ID_FIELD_NAME, stop);
+
+ PreparedQuery<RouteStops> routeStopsPreparedQuery = routeStopsQueryBuilder.prepare();
+ long num = routeStopsDao.countOf(routeStopsPreparedQuery);
+ // long num = routeStopsDao.query(routeStopsPreparedQuery).size();
+ // Log.i(TAG, "Number is " + num);
+ if (num == 0) {
+ // Log.i(TAG, "Removing " + stop.id);
+ busStopIter.remove();
+ }
+ }
+
+ long sizeAfterRemoval = busStopDao.countOf();
+
+ Log.i(TAG, "Removed " + (sizeBeforeRemoval - sizeAfterRemoval) + " stops (from " + sizeBeforeRemoval + ") now have " + sizeAfterRemoval);
+
+ }
+
+ Log.i(TAG, "Finished loading bus data");
+ }
+
+ public static void loadSiteData(Context context) throws SQLException, IOException {
+ Log.i(TAG, "Begining loading site data");
+
+ DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+
+ TableUtils.clearTable(helper.getConnectionSource(), Site.class);
+
+ Dao<Site, String> siteDao = helper.getSiteDao();
+
+ InputStream inputStream = context.getAssets().open("sites.csv");
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ String strLine = null;
+
+ try {
+ String def = bufferedReader.readLine();
+ // Log.i(TAG, "Reading the site definition " + def);
+
+ while ((strLine = bufferedReader.readLine()) != null) {
+ // Log.i(TAG, "Site Data: " + strLine);
+ String[] dataBits = strLine.split(",");
+
+ GeoPoint point = null;
+ if (dataBits[2].length() > 1 && dataBits[3].length() > 1) {
+ point = Util.csLatLongToGeoPoint(dataBits[2], dataBits[3]);
+ } else {
+ point = new GeoPoint(0, 0);
+ }
+
+ Polygon poly = Util.csPolygonToPolygon(strLine.split("\"")[1]);
+ // Log.i(TAG, "Polygon: " + poly);
+
+ siteDao.create(new Site(dataBits[0], dataBits[1], point, poly));
+ }
+
+ bufferedReader.close();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ Log.e(TAG, "Site Line: " + strLine);
+ e.printStackTrace();
+ }
+
+ Log.i(TAG, "Loaded sites from csv");
+ }
+
+ private static Stop getStop(Context context, JSONObject stopObj, BusStop busStop) throws SQLException {
+
+ if (helper == null)
+ helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ if (busRoutes == null)
+ busRoutes = helper.getBusRouteDao();
+ if (busDao == null)
+ busDao = helper.getBusDao();
+ if (busStopDao == null)
+ busStopDao = helper.getBusStopDao();
+ if (stopDao == null)
+ stopDao = helper.getStopDao();
+
+ // Log.i(TAG, "Stop " + stopObj);
+
+ try {
+ String time = stopObj.getString("time");
+
+ GregorianCalendar calender = new GregorianCalendar();
+
+ if (!time.equals("Due")) {
+
+ Log.i(TAG, "Time: " + time + " current time " + calender.getTime());
+
+ if (time.contains(":")) {
+ String[] minAndHour = time.split(":");
+ calender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(minAndHour[0]));
+ calender.set(Calendar.MINUTE, Integer.parseInt(minAndHour[1]));
+ } else {
+ // Log.i(TAG, "Parsing " + time.substring(0, time.length() - 1) + " for min");
+ calender.add(Calendar.MINUTE, Integer.parseInt(time.substring(0, time.length() - 1)));
+ }
+
+ Log.i(TAG, "Date: " + calender.getTime());
+
+ }
+
+ Stop stop;
+
+ String name = stopObj.getString("name");
+
+ BusRoute route;
+
+ if (name.equals("U1N")) {
+ route = busRoutes.queryForId(468);
+ } else if (name.startsWith("U1")) {
+ route = busRoutes.queryForId(326);
+ } else if (name.startsWith("U2")) {
+ route = busRoutes.queryForId(329);
+ } else if (name.startsWith("U6")) {
+ route = busRoutes.queryForId(327);
+ } else if (name.startsWith("U9")) {
+ route = busRoutes.queryForId(354);
+ } else {
+ Log.e(TAG, "Error selecting route for " + name);
+ return null;
+ }
+
+ String destString = stopObj.getString("dest");
+ BusStop destStop;
+
+ if (destString.equals("Central Station")) {
+ destStop = busStopDao.queryForId("SNA19709");
+ } else if (destString.equals("Civic Centre")) {
+ destStop = busStopDao.queryForId("SN120527");
+ } else if (destString.equals("City DG4")) {
+ destStop = busStopDao.queryForId("HAA13579");
+ } else if (destString.equals("Central Station")) {
+ destStop = busStopDao.queryForId("SN120520");
+ } else if (destString.equals("Airport")) {
+ destStop = busStopDao.queryForId("HA030184");
+ } else if (destString.equals("City, Town Quay")) {
+ destStop = busStopDao.queryForId("SNA13766");
+ } else if (destString.equals("Dock Gate 4")) {
+ destStop = busStopDao.queryForId("MG1031");
+ } else if (destString.equals("Eastleigh")) {
+ destStop = busStopDao.queryForId("HA030212");
+ } else if (destString.equals("Crematorium")) {
+ destStop = busStopDao.queryForId("SN121009");
+ } else if (destString.equals("General Hosp")) {
+ destStop = busStopDao.queryForId("SNA19482");
+ } else {
+ Log.e(TAG, "Unknown end dest " + destString + " for route " + route.code);
+ return null;
+ }
+
+ if (stopObj.has("vehicle")) {
+
+ int vehicle = Integer.parseInt(stopObj.getString("vehicle"));
+ // Log.i(TAG, "Looking at vehicle " + vehicle + " (" + stopObj.getString("vehicle") + ")");
+ Bus bus = busDao.queryForId(vehicle);
+ if (bus == null) {
+ // Log.i(TAG, "Cant find vehicle, creating");
+
+ // for (Bus gotBus : busDao) {
+ // Log.i(TAG, "Currently have bus " + gotBus.id);
+ // }
+
+ bus = new Bus(vehicle, route);
+ busDao.create(bus);
+ }
+
+ Date now = new Date(System.currentTimeMillis());
+
+ stop = new Stop(stopObj.getString("name"), busStop, destStop, bus, calender.getTime(), now);
+
+ /*
+ * if (bus.lastKnownStop != null) { stopDao.delete(bus.lastKnownStop); // TODO Crude, might delete useful data
+ *
+ * if (bus.lastKnownStop.arivalTime == null) { Log.e(TAG, " bus.lastKnownStop.arivalTime is null"); } else if (stop.arivalTime == null) {
+ * Log.e(TAG, " stop.arivalTime is null"); }
+ *
+ * if (bus.lastKnownStop.arivalTime.before(stop.arivalTime) && bus.lastKnownStop.arivalTime.after(now)) { bus.lastKnownStop = stop;
+ *
+ * if (bus.firstKnownStop == null) { bus.firstKnownStop = stop;
+ *
+ * } else if (!bus.firstKnownStop.busStop.equals(stop.busStop)) { stopDao.delete(bus.firstKnownStop); // TODO Crude, might delete useful data
+ *
+ * bus.firstKnownStop = stop; }
+ *
+ * } }
+ */
+
+ // busDao.update(bus);
+
+ } else {
+
+ stop = new Stop(stopObj.getString("name"), busStop, destStop, calender.getTime(), new Date(System.currentTimeMillis()));
+
+ }
+
+ return stop;
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ Log.e(TAG, "Error parsing stop " + stopObj, e);
+ return null;
+ }
+
+ }
+
+ public static boolean updateStop(BusStop busStop, boolean onlyUniLink) {
+ String file = getFileFromServer(busStopUrl + busStop.id + ".json");
+
+ try {
+ JSONObject data = new JSONObject(file);
+
+ JSONArray stopsArray = data.getJSONArray("stops");
+
+ // Log.i(TAG, "Number of entries " + data.length());
+
+ // Log.i(TAG, "Stops: " + data.getJSONArray("stops"));
+
+ for (int stopNum = 0; stopNum < stopsArray.length(); stopNum++) {
+ JSONObject stopObj = stopsArray.getJSONObject(stopNum);
+
+ if (onlyUniLink && !stopObj.getString("name").startsWith("U")) {
+ continue;
+ }
+
+ Stop stop = getStop(context, stopObj, busStop);
+
+ if (stop == null) {
+ Log.w(TAG, "Null stop, skiping");
+ continue;
+ }
+
+ if (stop.bus != null) {
+ Log.i(TAG, "Found stop for " + stop.bus.id + " at " + stop.busStop.id + " at " + stop.arivalTime);
+ } else {
+ if (stop.name == null) {
+ Log.e(TAG, "Null name");
+ } else if (stop.busStop == null) {
+ Log.e(TAG, "Null busStop");
+ } else if (stop.arivalTime == null) {
+ Log.e(TAG, "Null arivalTime");
+ }
+ Log.i(TAG, "Found stop for a unidentified " + stop.name + " at " + stop.busStop.id + " at " + stop.arivalTime);
+ }
+
+ // stopDao.create(stop);
+ }
+ } catch (JSONException ex) {
+ Log.e(TAG, "", ex);
+
+ return false;
+ } catch (SQLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ return false;
+ }
+
+ return false;
+
+ }
+
+ public static Timetable getTimetable(Context context, String busStop, boolean onlyUniLink) throws SQLException {
+
+ if (helper == null)
+ helper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
+ if (busRoutes == null)
+ busRoutes = helper.getBusRouteDao();
+ if (stopDao == null)
+ stopDao = helper.getStopDao();
+ if (busStopDao == null)
+ busStopDao = helper.getBusStopDao();
+
+ Timetable timetable = new Timetable();
+
+ String file = getFileFromServer(busStopUrl + busStop + ".json");
+
+ try {
+ JSONObject data = new JSONObject(file);
+
+ JSONArray stopsArray = data.getJSONArray("stops");
+
+ Log.i(TAG, "Number of entries " + data.length());
+
+ Log.i(TAG, "Stops: " + data.getJSONArray("stops"));
+
+ for (int stopNum = 0; stopNum < stopsArray.length(); stopNum++) {
+ JSONObject stopObj = stopsArray.getJSONObject(stopNum);
+
+ if (onlyUniLink && !stopObj.getString("name").startsWith("U")) {
+ continue;
+ }
+
+ BusStop busStopObj = busStopDao.queryForId(busStop);
+ if (busStopObj == null) {
+ Log.e(TAG, "BusStopObj == null");
+ }
+
+ Stop stop = getStop(context, stopObj, busStopObj);
+
+ if (stop == null) {
+ Log.w(TAG, "Null stop, skiping");
+ continue;
+ }
+
+ if (stop.bus != null) {
+ Log.i(TAG, "Found stop for " + stop.bus.id + " at " + stop.busStop.id + " at " + stop.arivalTime);
+ } else {
+ Log.i(TAG, "Found stop for a unidentified " + stop.name + " at " + stop.busStop.id + " at " + stop.arivalTime);
+ }
+
+ timetable.add(stop);
+ }
+ } catch (JSONException ex) {
+ Log.e(TAG, "", ex);
+ Log.e(TAG, "File: " + file);
+ return null;
+ }
+
+ return timetable;
+ }
+
+ static PathOverlay getRoutePath(InputStream routeResource, int colour, ResourceProxy resProxy) {
+ PathOverlay data = null;
+
+ // sax stuff
+ try {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ SAXParser sp = spf.newSAXParser();
+
+ XMLReader xr = sp.getXMLReader();
+
+ DataHandler dataHandler = new DataHandler(colour, resProxy);
+ xr.setContentHandler(dataHandler);
+
+ xr.parse(new InputSource(routeResource));
+
+ data = dataHandler.getData();
+
+ } catch (ParserConfigurationException pce) {
+ Log.e("SAX XML", "sax parse error", pce);
+ } catch (SAXException se) {
+ Log.e("SAX XML", "sax error", se);
+ } catch (IOException ioe) {
+ Log.e("SAX XML", "sax parse io error", ioe);
+ }
+
+ return data;
+ }
+
+ public static String getFileFromServer(String request) {
+ StringBuilder builder = new StringBuilder();
+ HttpClient client = new DefaultHttpClient();
+ HttpGet httpGet = new HttpGet(request);
+ Log.i("Util.getFileFromServer", "Request used: " + request);
+ try {
+ HttpResponse response = client.execute(httpGet);
+ StatusLine statusLine = response.getStatusLine();
+ int statusCode = statusLine.getStatusCode();
+ if (statusCode == 200) {
+ HttpEntity entity = response.getEntity();
+ InputStream content = entity.getContent();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(content));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+ } else {
+ Log.e("", "Failed to download file");
+ }
+ } catch (Exception ex) {
+ Log.e("Util.getFileFromServer", ex.getClass().toString() + " " + ex.getMessage());
+ }
+
+ return builder.toString();
+ }
+}