/** * Stuurt alle nieuwe polygonen naar de server * * @throws SyncException */ private void putGroups() throws SyncException { Cursor c = db.getNewGroups(); String name = ""; int id = 0; if (!c.moveToFirst()) { return; // Niks te syncen, dus gelijk klaar! } /** * Als er tijdens het syncen een andere groep een ander id krijgt (omdat zijn id nodig was), * klopt onze cursor misschien niet meer dus moeten we opnieuw query'en. */ boolean requery = false; do { HttpPut httpp = new HttpPut(serverUrl + "group"); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(mappUser, mappPass); id = c.getInt(0); name = c.getString(1); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("name", name)); try { httpp.addHeader(new BasicScheme().authenticate(creds, httpp)); httpp.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } catch (AuthenticationException e1) { Log.e(Mapp.TAG, e1.getStackTrace().toString()); throw new SyncException("Authentication failed"); } catch (UnsupportedEncodingException e) { Log.e(Mapp.TAG, e.getStackTrace().toString()); throw new SyncException("Failed to encode data"); } HttpResponse response; try { response = httpclient.execute(httpp); // 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()); 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. Log.e(Mapp.TAG, "Sync error: " + result.getString("message")); throw new SyncException(result.getString("message")); } else { // De polygoon een nieuw id geven en het 'nieuw'-vlaggetje verwijderen db.setGroupIsSynced(id); requery = db.updateGroupId(id, result.getInt("group_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"); } if (requery) { c = db.getNewGroups(); // Opnieuw laden omdat polygoonid's gewijzigd kunnen zijn inmiddels } } while (c.moveToNext()); }