You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2009/08/14 11:34:44 UTC

svn commit: r804139 - in /mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src: main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/

Author: ngn
Date: Fri Aug 14 09:34:43 2009
New Revision: 804139

URL: http://svn.apache.org/viewvc?rev=804139&view=rev
Log:
Implement status messages when exiting room (VYSPER-110)

Modified:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java?rev=804139&r1=804138&r2=804139&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java Fri Aug 14 09:34:43 2009
@@ -188,10 +188,20 @@
                 Set<Occupant> allOccupants = room.getOccupants(); 
                 
                 room.removeOccupant(occupantJid);
+
+                String statusMessage = null;
+                try {
+                    XMLElement statusElement = stanza.getSingleInnerElementsNamed("status");
+                    if(statusElement != null && statusElement.getInnerText() != null) {
+                        statusMessage = statusElement.getInnerText().getText();
+                    }
+                } catch (XMLSemanticError e) {
+                    // ignore, status element did not exist
+                }
                 
                 // relay presence of the newly added occupant to all existing occupants
                 for(Occupant occupant : allOccupants) {
-                    sendExitRoomPresenceToExisting(exitingOccupant, occupant, room, sessionContext);
+                    sendExitRoomPresenceToExisting(exitingOccupant, occupant, room, statusMessage, sessionContext);
                 }
                 
                 if(room.isRoomType(RoomType.Temporary) && room.isEmpty()) {
@@ -263,7 +273,8 @@
         relayStanza(existingOccupant.getJid(), builder.getFinalStanza(), sessionContext);
     }
     
-    private void sendExitRoomPresenceToExisting(Occupant exitingOccupant, Occupant existingOccupant, Room room, SessionContext sessionContext) {
+    private void sendExitRoomPresenceToExisting(Occupant exitingOccupant, Occupant existingOccupant, Room room, 
+            String statusMessage, SessionContext sessionContext) {
         Entity roomAndNewUserNick = new EntityImpl(room.getJID(), exitingOccupant.getName());
         
         StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomAndNewUserNick, existingOccupant.getJid(), null, 
@@ -276,9 +287,21 @@
             
         builder.endInnerElement();
         
-        if(existingOccupant.getJid().equals(exitingOccupant.getJid())) {
-            // send status to indicate that this is the users own presence
-            builder.startInnerElement("status").addAttribute("code", "110").endInnerElement();
+        // is this stanza to be sent to the exiting user himself?
+        boolean ownStanza = existingOccupant.getJid().equals(exitingOccupant.getJid()); 
+        
+        if(ownStanza || statusMessage != null) {
+            builder.startInnerElement("status");
+            
+            if(ownStanza) {
+                // send status to indicate that this is the users own presence
+                builder.addAttribute("code", "110");
+            }
+            if(statusMessage != null) {
+                builder.addText(statusMessage);
+            }
+            
+            builder.endInnerElement();
         }
         builder.endInnerElement();
 

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java?rev=804139&r1=804138&r2=804139&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java Fri Aug 14 09:34:43 2009
@@ -19,8 +19,16 @@
 public class MUCPresenceHandlerExitRoomTestCase extends AbstractMUCPresenceHandlerTestCase {
     
     private Stanza exitRoom(Entity occupantJid, Entity roomJid) {
+        return exitRoom(occupantJid, roomJid, null);
+    }
+    
+    private Stanza exitRoom(Entity occupantJid, Entity roomJid, String status) {
         StanzaBuilder stanzaBuilder = StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, PresenceStanzaType.UNAVAILABLE, null, null);
 
+        if(status != null) {
+            stanzaBuilder.startInnerElement("status").addText(status).endInnerElement();
+        }
+        
         Stanza presenceStanza = stanzaBuilder.getFinalStanza();
         ResponseStanzaContainer container = handler.execute(presenceStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null);
         if(container != null) {
@@ -85,12 +93,27 @@
         exitRoom(occupant2Jid, room1JidWithNick);
 
         // verify stanzas to existing occupants on the exiting user
-        assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), false);
-        assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), true);
+        assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), null, false);
+        assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), null, true);
+    }
+    
+    public void testExitRoomWithRelaysWithStatus() throws Exception {
+        String statusMessage = "Custom status";
+        
+        // add occupants to the room
+        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+        room.addOccupant(occupant1Jid, "Nick 1");
+        room.addOccupant(occupant2Jid, "Nick 2");
+        
+        // now, let user 2 exit room
+        exitRoom(occupant2Jid, room1JidWithNick, statusMessage);
 
+        // verify stanzas to existing occupants on the exiting user
+        assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), statusMessage, false);
+        assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), statusMessage, true);
     }
 
-    private void assertExitPresenceStanza(Entity roomJid, String nick, Entity to, Stanza stanza, boolean own) throws XMLSemanticError {
+    private void assertExitPresenceStanza(Entity roomJid, String nick, Entity to, Stanza stanza, String expectedStatus, boolean own) throws XMLSemanticError {
         // should be from room + nick name
         assertEquals(roomJid.getFullQualifiedName() + "/" + nick, stanza.getFrom().getFullQualifiedName());
         // should be to the existing user
@@ -111,5 +134,12 @@
             assertEquals(1, statuses.size());
             assertEquals("110", statuses.get(0).getAttributeValue("code"));
         }
+        
+        if(expectedStatus != null) {
+            List<XMLElement> statuses = xElement.getInnerElementsNamed("status");
+            assertEquals(1, statuses.size());
+            assertEquals(expectedStatus, statuses.get(0).getInnerText().getText());
+            
+        }
     }
 }