/**
   * 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());
  }