Author: ankon Date: Mon Feb 24 19:19:52 2014 New Revision: 1571404 URL: http://svn.apache.org/r1571404 Log: SHINDIG-1960: Fix JsonDbOpensocialService#createMessage()
Review: https://reviews.apache.org/r/15960/ Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialServiceTest.java Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java?rev=1571404&r1=1571403&r2=1571404&view=diff ============================================================================== --- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java (original) +++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java Mon Feb 24 19:19:52 2014 @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.Future; import javax.servlet.http.HttpServletResponse; @@ -138,11 +139,16 @@ public class JsonDbOpensocialService imp private static final String FRIEND_LINK_TABLE = "friendLinks"; /** - * db["messages"] -> Map<Person.Id, Array<Message>> + * db["messages"] -> Map<Person.Id, Map<MessageCollection.Id, MessageCollection>> */ private static final String MESSAGE_TABLE = "messages"; /** + * Attribute that contains the messages of a specific MessageCollection. + */ + private static final String MESSAGES_ARRAY = "messages"; + + /** * db["passwords"] -> Map<Person.Id, String> */ private static final String PASSWORDS_TABLE = "passwords"; @@ -616,19 +622,26 @@ public class JsonDbOpensocialService imp */ public Future<Void> createMessage(UserId userId, String appId, String msgCollId, Message message, SecurityToken token) throws ProtocolException { - for (String recipient : message.getRecipients()) { - try { - JSONArray outbox = db.getJSONObject(MESSAGE_TABLE).getJSONArray(recipient); + if (message.getId() == null) { + // Assign a new ID to the message + message.setId(UUID.randomUUID().toString()); + } + try { + JSONObject messagesTable = db.getJSONObject(MESSAGE_TABLE); + JSONObject messageObject = convertToJson(message); + for (String recipient : message.getRecipients()) { + JSONObject collection = messagesTable.getJSONObject(recipient).getJSONObject(msgCollId); + JSONArray outbox = collection.getJSONArray(MESSAGES_ARRAY); if (outbox == null) { outbox = new JSONArray(); - db.getJSONObject(MESSAGE_TABLE).put(recipient, outbox); + collection.put(MESSAGES_ARRAY, outbox); } - outbox.put(message); - } catch (JSONException je) { - throw new ProtocolException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, je.getMessage(), - je); + outbox.put(messageObject); } + } catch (JSONException je) { + throw new ProtocolException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, je.getMessage(), + je); } return Futures.immediateFuture(null); @@ -644,7 +657,7 @@ public class JsonDbOpensocialService imp for (String msgCollId : JSONObject.getNames(messageCollections)) { JSONObject msgColl = messageCollections.getJSONObject(msgCollId); msgColl.put("id", msgCollId); - JSONArray messages = msgColl.getJSONArray("messages"); + JSONArray messages = msgColl.getJSONArray(MESSAGES_ARRAY); int numMessages = (messages == null) ? 0 : messages.length(); msgColl.put("total", String.valueOf(numMessages)); msgColl.put("unread", String.valueOf(numMessages)); @@ -676,7 +689,7 @@ public class JsonDbOpensocialService imp try { List<Message> result = Lists.newArrayList(); JSONArray messages = db.getJSONObject(MESSAGE_TABLE).getJSONObject(userId.getUserId(token)) - .getJSONObject(msgCollId).getJSONArray("messages"); + .getJSONObject(msgCollId).getJSONArray(MESSAGES_ARRAY); // TODO: special case @all Modified: shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialServiceTest.java URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialServiceTest.java?rev=1571404&r1=1571403&r2=1571404&view=diff ============================================================================== --- shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialServiceTest.java (original) +++ shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialServiceTest.java Mon Feb 24 19:19:52 2014 @@ -405,4 +405,20 @@ public class JsonDbOpensocialServiceTest assertEquals(1, messages.getList().size()); assertEquals("1", messages.getList().get(0).getId()); } + + @Test + public void testCreateMessage() throws Exception { + // Create a new private message + Message msg = new MessageImpl(); + msg.setBody("Hello"); + msg.setRecipients(Collections.singletonList(JANE_DOE.getUserId())); + db.createMessage(JOHN_DOE, APP_ID, "privateMessage", msg, token).get(); + + // Check that the message was created + RestfulCollection<Message> messages = db.getMessages( + JANE_DOE, "privateMessage", + Collections.<String>emptySet(), Collections.<String>singletonList(msg.getId()), + new CollectionOptions(), token).get(); + assertEquals(1, messages.getList().size()); + } }
