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/10 16:46:44 UTC

svn commit: r802813 - 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: Mon Aug 10 14:46:44 2009
New Revision: 802813

URL: http://svn.apache.org/viewvc?rev=802813&view=rev
Log:
Support for sending extra information for non-anonymous and semi-anonymous rooms on entering (VYSPER-109)

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

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.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/MUCEnterRoomHandler.java?rev=802813&r1=802812&r2=802813&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java Mon Aug 10 14:46:44 2009
@@ -27,7 +27,9 @@
 import org.apache.vysper.xmpp.modules.core.base.handler.DefaultPresenceHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -112,7 +114,7 @@
         
         // relay presence of the newly added occupant to all existing occupants
         for(Occupant occupant : room.getOccupants()) {
-            sendNewOccupantPresence(newOccupant, occupant, room, sessionContext);
+            sendNewOccupantPresenceToExisting(newOccupant, occupant, room, sessionContext);
         }
         
         return null;
@@ -144,17 +146,32 @@
         relayStanza(newOccupant.getJid(), builder.getFinalStanza(), sessionContext);
     }
     
-    private void sendNewOccupantPresence(Occupant newOccupant, Occupant existingOccupant, Room room, SessionContext sessionContext) {
+    private void sendNewOccupantPresenceToExisting(Occupant newOccupant, Occupant existingOccupant, Room room, SessionContext sessionContext) {
         Entity roomAndNewUserNick = new EntityImpl(room.getJID(), newOccupant.getName());
         
         StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomAndNewUserNick, existingOccupant.getJid(), null, null, null, null);
         builder.startInnerElement("x", NamespaceURIs.XEP0045_MUC_USER);
         builder.startInnerElement("item")
             .addAttribute("affiliation", newOccupant.getAffiliation().toString())
-            .addAttribute("role", newOccupant.getRole().toString())
-            .endInnerElement();
+            .addAttribute("role", newOccupant.getRole().toString());
+        
+        // section 7.1.5
+        if(room.getRoomTypes().contains(RoomType.NonAnonymous) ||
+                (room.getRoomTypes().contains(RoomType.SemiAnonymous) && existingOccupant.getRole() == Role.Moderator)) {
+            // room is non-anonymous or semi-anonmoys and the occupant a moderator, send full user JID
+            builder.addAttribute("jid", newOccupant.getJid().getFullQualifiedName());
+            // TODO unit test for semi + moderator
+        }
+            
+        builder.endInnerElement();
         
         if(existingOccupant.getJid().equals(newOccupant.getJid())) {
+            
+            if(room.getRoomTypes().contains(RoomType.NonAnonymous)) {
+                // notify the user that this is a non-anonymous room
+                builder.startInnerElement("status").addAttribute("code", "100").endInnerElement();
+            }
+            
             // send status to indicate that this is the users own presence
             builder.startInnerElement("status").addAttribute("code", "110").endInnerElement();
         }

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.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/MUCEnterRoomHandlerTestCase.java?rev=802813&r1=802812&r2=802813&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java Mon Aug 10 14:46:44 2009
@@ -153,6 +153,16 @@
         assertEquals(room1Jid.getFullQualifiedName() + "/nick", user2JoinedStanza.getFrom().getFullQualifiedName());
         // should be to the existing user
         assertEquals(occupant1Jid, user2JoinedStanza.getTo());
+        
+        XMLElement xElement = user2JoinedStanza.getSingleInnerElementsNamed("x");
+        assertEquals(NamespaceURIs.XEP0045_MUC_USER, xElement.getNamespaceURI());
+        
+        // since this room is non-anonymous, x must contain an item element with the users full JID
+        XMLElement itemElement = xElement.getSingleInnerElementsNamed("item");
+        assertEquals(occupant2Jid.getFullQualifiedName(), itemElement.getAttributeValue("jid"));
+        assertEquals("none", itemElement.getAttributeValue("affiliation"));
+        assertEquals("participant", itemElement.getAttributeValue("role"));
+
 
         // verify stanzas to the new user on all existing users, including himself with status=110 element
         // own presence must be sent last
@@ -162,14 +172,15 @@
         assertEquals(room1Jid.getFullQualifiedName() + "/Some nick", stanza.getFrom().getFullQualifiedName());
         assertEquals(occupant2Jid, stanza.getTo());
 
-        // assert stanza from the joining user, must have extra status=110 element
+        // assert stanza from the joining user, must have extra status=110 element        
         stanza = occupant2Queue.getNext();
         assertNotNull(stanza);
         assertEquals(room1JidWithNick, stanza.getFrom());
         assertEquals(occupant2Jid, stanza.getTo());
-        XMLElement statusElement = stanza.getFirstInnerElement().getSingleInnerElementsNamed("status");
-        assertNotNull(statusElement);
-        assertEquals("110", statusElement.getAttributeValue("code"));
+        List<XMLElement> statusElements = stanza.getFirstInnerElement().getInnerElementsNamed("status");
+        assertEquals(2, statusElements.size());
+        assertEquals("100", statusElements.get(0).getAttributeValue("code"));
+        assertEquals("110", statusElements.get(1).getAttributeValue("code"));
         
     }
 }