diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncThread.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncThread.java index 1ca48bb86..93e7953d7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncThread.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncThread.java @@ -40,6 +40,7 @@ import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.sync.messages.BriefMe; import com.todoroo.astrid.actfm.sync.messages.ChangesHappened; import com.todoroo.astrid.actfm.sync.messages.ClientToServerMessage; +import com.todoroo.astrid.actfm.sync.messages.JSONPayloadArray; import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.actfm.sync.messages.ReplayOutstandingEntries; import com.todoroo.astrid.actfm.sync.messages.ReplayTaskListMetadataOutstanding; @@ -285,17 +286,15 @@ public class ActFmSyncThread { } if (!messageBatch.isEmpty() && checkForToken()) { - JSONArray payload = new JSONArray(); + JSONPayloadArray payload = new JSONPayloadArray(); MultipartEntity entity = new MultipartEntity(); boolean containsChangesHappened = false; for (int i = 0; i < messageBatch.size(); i++) { ClientToServerMessage message = messageBatch.get(i); - JSONObject serialized = message.serializeToJSON(entity); - if (serialized != null) { + boolean success = payload.addMessage(message, entity); + if (success) { if (message instanceof ChangesHappened) containsChangesHappened = true; - payload.put(serialized); - syncLog("Sending: " + serialized); } else { messageBatch.remove(i); i--; @@ -303,10 +302,11 @@ public class ActFmSyncThread { } - if (payload.length() == 0) { + if (payload.getMessageCount() == 0) { messageBatch.clear(); continue; } + System.err.println("PAYLOAD: " + payload.toString()); setupNotification(); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/JSONPayloadArray.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/JSONPayloadArray.java new file mode 100644 index 000000000..9e40a8b1e --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/JSONPayloadArray.java @@ -0,0 +1,41 @@ +package com.todoroo.astrid.actfm.sync.messages; + +import org.apache.http.entity.mime.MultipartEntity; +import org.json.JSONArray; +import org.json.JSONObject; + +public class JSONPayloadArray extends JSONArray { + + private final StringBuilder sb = new StringBuilder("["); //$NON-NLS-1$ + + private int messageCount = 0; + + public boolean addMessage(ClientToServerMessage message, MultipartEntity entity) { + try { + JSONObject serialized = message.serializeToJSON(entity); + if (serialized != null) { + sb.append(serialized.toString()) + .append(","); //$NON-NLS-1$ + + messageCount++; + return true; + } else { + return false; + } + } catch (OutOfMemoryError e) { + return false; + } + } + + public int getMessageCount() { + return messageCount; + } + + public String closeAndReturnString() { + if (messageCount > 0) + sb.deleteCharAt(sb.length() - 1); // Remove final comma + sb.append("]"); //$NON-NLS-1$ + return sb.toString(); + } + +}