/** * Verwijdert polygonen lokaal als ze niet meer op de server staan. Naam van deze methode (C) * Joost Maar de inhoud van deze methode wel (C) Mathijs * * @param polygonIds een lijstje met polygonid's die op de server voorkomen (in deze groep) * @throws SyncException */ private void removeDeletedPolygons(int group) throws SyncException { Cursor c = db.getAllPolygons(group); if (!c.moveToFirst()) { return; // Lokale db is al leeg } // Lijstje maken met alle id's op de server ArrayList<Integer> polygonIds = new ArrayList<Integer>(); HttpGet httpg = new HttpGet(serverUrl + "polygons/group_id/" + group + "/since/1"); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(mappUser, mappPass); try { httpg.addHeader(new BasicScheme().authenticate(creds, httpg)); } catch (AuthenticationException e1) { Log.e(Mapp.TAG, e1.getMessage()); throw new SyncException("Authentication failed"); } HttpResponse response; try { response = httpclient.execute(httpg); // Lees het resultaat van de actie in InputStream is = response.getEntity().getContent(); BufferedReader r = new BufferedReader(new InputStreamReader(is)); StringBuilder total = new StringBuilder(); String line; while ((line = r.readLine()) != null) { total.append(line); } if (response.getStatusLine().getStatusCode() == 418) { throw new SyncException("Unable to synchronize because the server is a teapot."); } else if (response.getStatusLine().getStatusCode() == 401) { throw new SyncException("Not authorized"); } else if (response.getStatusLine().getStatusCode() == 404) { // Geen polygonen hier do { if (!(c.getInt(3) == 1)) { db.removePolygon(c.getInt(0), false); } } while (c.moveToNext()); return; } else if (response.getStatusLine().getStatusCode() != 200) { // Er is iets mis gegaan. JSONObject result = new JSONObject(total.toString()); Log.e(Mapp.TAG, "Sync error: " + result.getString("message")); throw new SyncException(result.getString("message")); } else { // Alles is blijkbaar goed gegaan JSONArray result = new JSONArray(total.toString()); // Loop over de polygonen heen for (int i = 0; i < result.length(); i++) { JSONObject polygon = result.getJSONObject(i); polygonIds.add(polygon.getInt("id")); } } } catch (ClientProtocolException e) { Log.e(Mapp.TAG, e.getMessage()); throw new SyncException("Epic HTTP failure"); } catch (IOException e) { Log.e(Mapp.TAG, e.getMessage()); throw new SyncException("Exception during server synchronisation"); } catch (JSONException e) { Log.e(Mapp.TAG, "Sync failed. Response is no valid JSON or expected variable not found."); throw new SyncException("Invalid server response"); } // Nu we eindelijk alle id's hebben, kijken of er in de lokale db id's voorkomen die niet in // onze nieuwe lijst zitten do { if (!polygonIds.contains(c.getInt(0)) && c.getInt(3) != 1) { db.removePolygon(c.getInt(0), false); } } while (c.moveToNext()); }
/** * Synchroniseert gewijzigde polygonen met de server * * @param group het id van de groep waaruit polygonen gesynct moeten worden * @throws SyncException */ private void postPolygons(int group) throws SyncException { Cursor c = db.getChangedPolygons(group); int polygonid = 0; String name = ""; String color = ""; String desc = ""; if (!c.moveToFirst()) { return; // Niks te syncen, dus gelijk klaar! } do { HttpPost httpp = new HttpPost(serverUrl + "polygon"); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(mappUser, mappPass); polygonid = c.getInt(0); name = c.getString(2); color = c.getString(1); desc = c.getString(3); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("id", polygonid + "")); nameValuePairs.add(new BasicNameValuePair("name", name)); nameValuePairs.add(new BasicNameValuePair("group_id", group + "")); nameValuePairs.add(new BasicNameValuePair("color", color)); nameValuePairs.add(new BasicNameValuePair("description", desc)); // Nu de punten van de polygoon ophalen en die bijvoegen Cursor points = db.getAllPolygonPoints(polygonid); if (!points.moveToFirst()) { // Hier klopt iets niet, de polygoon heeft geen punten! db.removePolygon(polygonid, true); return; } do { nameValuePairs.add( new BasicNameValuePair( "points[]", points.getString(0) + "," + points.getString(1) + "," + points.getString(2))); } while (points.moveToNext()); try { httpp.addHeader(new BasicScheme().authenticate(creds, httpp)); httpp.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } catch (AuthenticationException e1) { Log.e(Mapp.TAG, e1.getMessage()); throw new SyncException("Authentication failed"); } catch (UnsupportedEncodingException e) { Log.e(Mapp.TAG, e.getMessage()); throw new SyncException("Failed to encode data"); } HttpResponse response; try { response = httpclient.execute(httpp); if (response.getStatusLine().getStatusCode() == 418) { throw new SyncException("Unable to synchronize because the server is a teapot."); } else if (response.getStatusLine().getStatusCode() == 401) { throw new SyncException("Not authorized"); } else if (response.getStatusLine().getStatusCode() != 200) { // Er is iets mis gegaan. // Lees het resultaat van de actie in JSONObject result = null; InputStream is = response.getEntity().getContent(); BufferedReader r = new BufferedReader(new InputStreamReader(is)); StringBuilder total = new StringBuilder(); String line; while ((line = r.readLine()) != null) { total.append(line); } result = new JSONObject(total.toString()); Log.e(Mapp.TAG, "Sync error: " + result.getString("message")); throw new SyncException(result.getString("message")); } else { db.setPolygonIsSynced(polygonid); } } catch (ClientProtocolException e) { Log.e(Mapp.TAG, e.getMessage()); throw new SyncException("Epic HTTP failure"); } catch (IOException e) { Log.e(Mapp.TAG, e.getMessage()); throw new SyncException("Exception during server synchronisation"); } catch (JSONException e) { Log.e(Mapp.TAG, "Sync failed. Response is no valid JSON or expected variable not found."); throw new SyncException("Invalid server response"); } } while (c.moveToNext()); }