Author: ngn
Date: Mon Aug 24 11:25:29 2009
New Revision: 807152

URL: http://svn.apache.org/viewvc?rev=807152&view=rev
Log:
Implement changing show and status presence (VYSPER-112)

Added:
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.java
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/MUCPresenceHandlerEnterRoomTestCase.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=807152&r1=807151&r2=807152&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
 Mon Aug 24 11:25:29 2009
@@ -109,16 +109,25 @@
         
     }
 
+    private String getInnerElementText(XMLElement element, String childName) {
+        try {
+            XMLElement childElm = 
element.getSingleInnerElementsNamed(childName);
+            if(childElm != null && childElm.getInnerText() != null) {
+                return childElm.getInnerText().getText();
+            } else {
+                return null;
+            }
+        } catch (XMLSemanticError e) {
+            return null;
+        }
+    }
+    
     private Stanza available(PresenceStanza stanza, Entity roomJid,
             Entity newOccupantJid, String nick, SessionContext sessionContext) 
{
         
         // TODO what to use for the room name?
         Room room = conference.findOrCreateRoom(roomJid, roomJid.getNode());
         
-        if(room.isInRoom(nick)) {
-            // user with this nick is already in room
-            return createPresenceErrorStanza(roomJid, newOccupantJid, 
stanza.getID(), "cancel", "conflict");
-        }
         
         if(room.isInRoom(newOccupantJid)) {
             // user is already in room, change nick
@@ -127,8 +136,17 @@
             // occupant is already in room
             Occupant occupant = room.findOccupantByJID(newOccupantJid);
             if(nick.equals(occupant.getName())) {
-                // TODO nick unchanged, should we do anything here? 
+                // nick unchanged, change show and status
+                for(Occupant receiver : room.getOccupants()) {
+                    sendChangeShowStatus(occupant, receiver, room, 
getInnerElementText(stanza, "show"), 
+                            getInnerElementText(stanza, "status"), 
sessionContext);
+                }
             } else {
+                if(room.isInRoom(nick)) {
+                    // user with this nick is already in room
+                    return createPresenceErrorStanza(roomJid, newOccupantJid, 
stanza.getID(), "cancel", "conflict");
+                }
+                
                 String oldNick = occupant.getName();
                 // update the nick
                 occupant.setName(nick);
@@ -146,6 +164,12 @@
             }
         } else {
             logger.debug("{} has requested to enter room {}", newOccupantJid, 
roomJid);
+            
+            if(room.isInRoom(nick)) {
+                // user with this nick is already in room
+                return createPresenceErrorStanza(roomJid, newOccupantJid, 
stanza.getID(), "cancel", "conflict");
+            }
+            
             // check password if password protected
             if(room.isRoomType(RoomType.PasswordProtected)) {
                 String password = null;
@@ -297,6 +321,28 @@
         logger.debug("Room presence from {} sent to {}", roomAndOldNick, 
receiver);
         relayStanza(receiver.getJid(), builder.getFinalStanza(), 
sessionContext);
     }
+    
+
+    private void sendChangeShowStatus(Occupant changer, Occupant receiver, 
Room room, String show, String status, SessionContext sessionContext) {
+        Entity roomAndNick = new EntityImpl(room.getJID(), changer.getName());
+        
+        StanzaBuilder builder = 
StanzaBuilder.createPresenceStanza(roomAndNick, receiver.getJid(), null, 
+                null, show, status);
+        builder.startInnerElement("x", NamespaceURIs.XEP0045_MUC_USER);
+        
+        
+        boolean includeJid = includeJidInItem(room, receiver); 
+        new MUCUserItem(changer).insertElement(builder, includeJid, true);
+        
+//        if(receiver.getJid().equals(changer.getJid())) {
+//            // send status to indicate that this is the users own presence
+//            new Status(StatusCode.OWN_PRESENCE).insertElement(builder);
+//        }
+        builder.endInnerElement();
+
+        logger.debug("Room presence from {} sent to {}", roomAndNick, 
receiver);
+        relayStanza(receiver.getJid(), builder.getFinalStanza(), 
sessionContext);
+    }
 
     
     private boolean includeJidInItem(Room room, Occupant receiver) {

Added: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.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/MUCPresenceHandlerChangeStatusTestCase.java?rev=807152&view=auto
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.java
 (added)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.java
 Mon Aug 24 11:25:29 2009
@@ -0,0 +1,111 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+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.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.stanza.PresenceStanza;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+
+/**
+ */
+public class MUCPresenceHandlerChangeStatusTestCase extends 
AbstractMUCHandlerTestCase {
+
+    private Stanza changeStatus(Entity occupantJid, Entity roomWithNickJid, 
String show, String status) throws ProtocolException {
+        StanzaBuilder stanzaBuilder = 
StanzaBuilder.createPresenceStanza(occupantJid, roomWithNickJid, null, null, 
show, status);
+        
+        Stanza presenceStanza = stanzaBuilder.getFinalStanza();
+        ResponseStanzaContainer container = handler.execute(presenceStanza, 
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+        if(container != null) {
+            return container.getResponseStanza();
+        } else {
+            return null;
+        }
+    }
+    
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCPresenceHandler(conference);
+    }
+    
+    public void testChangeShowStatus() throws Exception {
+        Room room = conference.findRoom(ROOM1_JID);
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+        assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa", 
"Gone"));
+        
+        MUCUserItem item = new MUCUserItem(OCCUPANT1_JID, "nick", 
Affiliation.None, Role.Participant);
+        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT1_JID, "xa", "Gone",
+                item);
+        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT2_JID, "xa", "Gone", 
+                item);
+    }
+    
+    
+    public void testChangeShow() throws Exception {
+        Room room = conference.findRoom(ROOM1_JID);
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+        assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa", 
null));
+        
+        MUCUserItem item = new MUCUserItem(OCCUPANT1_JID, "nick", 
Affiliation.None, Role.Participant);
+        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT1_JID, "xa", null,
+                item);
+        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT2_JID, "xa", null, 
+                item);
+    }
+    
+    
+    public void testChangeStatus() throws Exception {
+        Room room = conference.findRoom(ROOM1_JID);
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+        assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, null, 
"Gone"));
+        
+        MUCUserItem item = new MUCUserItem(OCCUPANT1_JID, "nick", 
Affiliation.None, Role.Participant);
+        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT1_JID, null, "Gone",
+                item);
+        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, 
OCCUPANT2_JID, null, "Gone", 
+                item);
+    }
+    
+    private void assertPresenceStanza(Stanza stanza, Entity expectedFrom, 
Entity expectedTo, String expectedShow,
+            String expectedStatus,
+            MUCUserItem expectedItem) throws XMLSemanticError {
+
+        PresenceStanza presenceStanza = (PresenceStanza) 
PresenceStanza.getWrapper(stanza);
+        assertNotNull(stanza);
+        assertEquals(expectedFrom, stanza.getFrom());
+        assertEquals(expectedTo, stanza.getTo());
+        assertEquals(expectedShow, presenceStanza.getShow());
+        assertEquals(expectedStatus, presenceStanza.getStatus(null));
+        
+        XMLElement xElm = stanza.getSingleInnerElementsNamed("x");
+        assertEquals(NamespaceURIs.XEP0045_MUC_USER, xElm.getNamespaceURI());
+        
+        List<XMLElement> innerElements = xElm.getInnerElements();
+            
+        assertEquals(1, innerElements.size());
+        XMLElement itemElm = innerElements.get(0);
+        assertEquals("item", itemElm.getName());
+        assertEquals(expectedItem.getJid().getFullQualifiedName(), 
itemElm.getAttributeValue("jid"));
+        assertEquals(expectedItem.getNick(), 
itemElm.getAttributeValue("nick"));
+        assertEquals(expectedItem.getAffiliation().toString(), 
itemElm.getAttributeValue("affiliation"));
+        assertEquals(expectedItem.getRole().toString(), 
itemElm.getAttributeValue("role"));
+        
+    }
+    
+}

Modified: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.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/MUCPresenceHandlerEnterRoomTestCase.java?rev=807152&r1=807151&r2=807152&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
 Mon Aug 24 11:25:29 2009
@@ -11,6 +11,8 @@
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.PresenceStanza;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -28,6 +30,13 @@
     }
     
     private Stanza enterRoom(Entity occupantJid, Entity roomJid, String 
password) throws ProtocolException {
+        SessionContext userSessionContext;
+        if(occupantJid.equals(OCCUPANT1_JID)) {
+            userSessionContext = sessionContext;
+        } else {
+            userSessionContext = sessionContext2;
+        }
+        
         StanzaBuilder stanzaBuilder = 
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, null, null, 
null);
         
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC);
         if(password != null) {
@@ -36,14 +45,23 @@
         
         stanzaBuilder.endInnerElement();
         Stanza presenceStanza = stanzaBuilder.getFinalStanza();
-        ResponseStanzaContainer container = handler.execute(presenceStanza, 
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+        ResponseStanzaContainer container = handler.execute(presenceStanza, 
userSessionContext.getServerRuntimeContext(), true, userSessionContext, null);
         if(container != null) {
             return container.getResponseStanza();
         } else {
             return null;
         }
     }
-    
+
+    protected TestSessionContext sessionContext2;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        sessionContext2 = 
TestSessionContext.createWithStanzaReceiverRelayAuthenticated();
+        sessionContext2.setInitiatingEntity(OCCUPANT2_JID);
+    }
 
     @Override
     protected StanzaHandler createHandler() {


Reply via email to