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/19 23:12:53 UTC

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

Author: ngn
Date: Wed Aug 19 21:12:52 2009
New Revision: 805976

URL: http://svn.apache.org/viewvc?rev=805976&view=rev
Log:
Implemented sending private messages (VYSPER-116)

Modified:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
    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/AbstractMUCHandlerTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/MUCIntegrationTestCase.java

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.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/MUCModule.java?rev=805976&r1=805975&r2=805976&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java Wed Aug 19 21:12:52 2009
@@ -152,7 +152,7 @@
         
         SubdomainHandlerDictionary dictionary = new SubdomainHandlerDictionary(domain);
         dictionary.register(new MUCPresenceHandler(conference));
-        dictionary.register(new MUCMessageHandler(conference));
+        dictionary.register(new MUCMessageHandler(conference, domain));
         
         dictionaries.add(dictionary);
     }

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.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/MUCMessageHandler.java?rev=805976&r1=805975&r2=805976&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java Wed Aug 19 21:12:52 2009
@@ -20,7 +20,6 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.vysper.compliance.SpecCompliance;
@@ -33,17 +32,15 @@
 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.Room;
-import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.stanza.MessageStanza;
+import org.apache.vysper.xmpp.stanza.MessageStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
-import org.apache.vysper.xmpp.stanza.MessageStanzaType;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 import org.apache.vysper.xmpp.xmlfragment.Attribute;
-import org.apache.vysper.xmpp.xmlfragment.Renderer;
-import org.apache.vysper.xmpp.xmlfragment.XMLElement;
-import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,9 +58,11 @@
     final Logger logger = LoggerFactory.getLogger(MUCMessageHandler.class);
 
     private Conference conference;
+    private Entity moduleDomain;
 
-    public MUCMessageHandler(Conference conference) {
+    public MUCMessageHandler(Conference conference, Entity moduleDomain) {
         this.conference = conference;
+        this.moduleDomain = moduleDomain;
     }
 
     @Override
@@ -71,8 +70,9 @@
         return MUCHandlerHelper.verifyNamespace(stanza);
     }
     
-    private Stanza createMessageErrorStanza(Entity from, Entity to, String id, String type, String errorName, Stanza stanza) {
-        return MUCHandlerHelper.createErrorStanza("message", from, to, id, type, errorName, stanza.getInnerElements());
+    private Stanza createMessageErrorStanza(Entity from, Entity to, String id, StanzaErrorType type, 
+            StanzaErrorCondition errorCondition, Stanza stanza) {
+        return MUCHandlerHelper.createErrorStanza("message", from, to, id, type.value(), errorCondition.value(), stanza.getInnerElements());
     }
     
     @Override
@@ -81,21 +81,25 @@
             SessionContext sessionContext) {
 
         logger.debug("Received message for MUC");
+        Entity from = sessionContext.getInitiatingEntity();
+        Entity roomWithNickJid = stanza.getTo();
+        Entity roomJid = roomWithNickJid.getBareJID();
+
         MessageStanzaType type = stanza.getMessageType();
         if(type != null && type == MessageStanzaType.GROUPCHAT) {
             // groupchat, message to a room
+
+            // must not have a nick
+            if(roomWithNickJid.getResource() != null) {
+                return createMessageErrorStanza(roomJid, from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.BAD_REQUEST, stanza);
+            }
             
-            Entity roomWithNickJid = stanza.getTo();
-            logger.debug("Received groupchat message to {}", roomWithNickJid);
-            Room room = conference.findRoom(roomWithNickJid.getBareJID());
+            logger.debug("Received groupchat message to {}", roomJid);
+            Room room = conference.findRoom(roomJid);
             if(room != null) {
-                // sender must be participant in room
-                Entity from = stanza.getFrom();
-                if(from == null) {
-                    from = sessionContext.getInitiatingEntity();
-                }
                 Occupant sendingOccupant = room.findOccupantByJID(from);
                 
+                // sender must be participant in room
                 if(sendingOccupant != null) {
                     
                     Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getName());
@@ -114,20 +118,50 @@
                                     sessionContext);
                         }
                     } else {
-                        return createMessageErrorStanza(room.getJID(), from, stanza.getID(), "modify", "forbidden", stanza);
+                        return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.FORBIDDEN, stanza);
                     }
                 } else {
-                    return createMessageErrorStanza(room.getJID(), from, stanza.getID(), "modify", "not-acceptable", stanza);
+                    return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
                 }
             } else {
-                // TODO how to handle unknown room?
+                return createMessageErrorStanza(moduleDomain, from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.ITEM_NOT_FOUND, stanza);
+            }
+        } else if(type == null  || type == MessageStanzaType.CHAT) {
+            // private message
+            logger.debug("Received direct message to {}", roomWithNickJid);
+            Room room = conference.findRoom(roomJid);
+            if(room != null) {
+                Occupant sendingOccupant = room.findOccupantByJID(from);
+                
+                // sender must be participant in room
+                if(sendingOccupant != null) {
+                    Occupant receivingOccupant = room.findOccupantByNick(roomWithNickJid.getResource());
+                    
+                    // must be sent to an existing occupant in the room
+                    if(receivingOccupant != null) {
+                    
+                        Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getName());
+                        logger.debug("Relaying message to  {}", receivingOccupant);
+                        List<Attribute> replaceAttributes = new ArrayList<Attribute>();
+                        replaceAttributes.add(new Attribute("from", roomAndSendingNick.getFullQualifiedName()));
+                        replaceAttributes.add(new Attribute("to", receivingOccupant.getJid().getFullQualifiedName()));
+                    
+                        relayStanza(receivingOccupant.getJid(), 
+                            StanzaBuilder.createClone(stanza, true, replaceAttributes).getFinalStanza(),
+                            sessionContext);
+                    } else {
+                        // TODO correct error?
+                        return createMessageErrorStanza(moduleDomain, from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.ITEM_NOT_FOUND, stanza);
+                    }
+                } else {
+                    return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
+                }
+            } else {
+                return createMessageErrorStanza(moduleDomain, from, stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.ITEM_NOT_FOUND, stanza);
             }
-        } else {
-            // TODO handle non-groupchat messages
         }
         
         return null;
-        
     }
 
     protected void relayStanza(Entity receiver, Stanza stanza,

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=805976&r1=805975&r2=805976&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 Wed Aug 19 21:12:52 2009
@@ -86,10 +86,7 @@
         // TODO handle null
         Entity roomAndNick = stanza.getTo();
 
-        Entity occupantJid = stanza.getFrom();
-        if(occupantJid == null) {
-            occupantJid = sessionContext.getInitiatingEntity();
-        }
+        Entity occupantJid = sessionContext.getInitiatingEntity();
         
         Entity roomJid = roomAndNick.getBareJID();
         String nick = roomAndNick.getResource();

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.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/AbstractMUCHandlerTestCase.java?rev=805976&r1=805975&r2=805976&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java Wed Aug 19 21:12:52 2009
@@ -21,14 +21,16 @@
     
     protected TestSessionContext sessionContext;
 
-    protected Entity room1Jid = TestUtil.parseUnchecked("room1@vysper.org");
-    protected Entity room2Jid = TestUtil.parseUnchecked("room2@vysper.org");
+    protected static final Entity MODULE_JID = TestUtil.parseUnchecked("chat.vysper.org");
 
-    protected Entity room1JidWithNick = TestUtil.parseUnchecked("room1@vysper.org/nick");
-    protected Entity room2JidWithNick = TestUtil.parseUnchecked("room2@vysper.org/nick");
+    protected static final Entity ROOM1_JID = TestUtil.parseUnchecked("room1@chat.vysper.org");
+    protected static final Entity ROOM2_JID = TestUtil.parseUnchecked("room2@chat.vysper.org");
+
+    protected static final Entity ROOM1_JID_WITH_NICK = TestUtil.parseUnchecked("room1@chat.vysper.org/nick");
+    protected static final Entity ROOM2_JID_WITH_NICK = TestUtil.parseUnchecked("room2@chat.vysper.org/nick");
     
-    protected Entity occupant1Jid = TestUtil.parseUnchecked("user1@vysper.org");
-    protected Entity occupant2Jid = TestUtil.parseUnchecked("user2@vysper.org");
+    protected static final Entity OCCUPANT1_JID = TestUtil.parseUnchecked("user1@vysper.org");
+    protected static final Entity OCCUPANT2_JID = TestUtil.parseUnchecked("user2@vysper.org");
     protected StanzaHandler handler;
 
     protected Conference conference = new Conference("foo");
@@ -40,13 +42,13 @@
     @Override
     protected void setUp() throws Exception {
         sessionContext = TestSessionContext.createWithStanzaReceiverRelayAuthenticated();
-        sessionContext.setInitiatingEntity(occupant1Jid);
+        sessionContext.setInitiatingEntity(OCCUPANT1_JID);
         
         StanzaReceiverRelay stanzaRelay = (StanzaReceiverRelay) sessionContext.getServerRuntimeContext().getStanzaRelay();
-        stanzaRelay.add(occupant1Jid, occupant1Queue);
-        stanzaRelay.add(occupant2Jid, occupant2Queue);
+        stanzaRelay.add(OCCUPANT1_JID, occupant1Queue);
+        stanzaRelay.add(OCCUPANT2_JID, occupant2Queue);
         
-        conference.createRoom(room1Jid, "Room 1");
+        conference.createRoom(ROOM1_JID, "Room 1");
         
         handler = createHandler();
     }

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.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/MUCMessageHandlerTestCase.java?rev=805976&r1=805975&r2=805976&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java Wed Aug 19 21:12:52 2009
@@ -1,6 +1,12 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import static org.apache.vysper.xmpp.stanza.MessageStanzaType.GROUPCHAT;
+
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
 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;
@@ -8,7 +14,6 @@
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.MessageStanzaType;
-import static org.apache.vysper.xmpp.stanza.MessageStanzaType.GROUPCHAT;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.xmlfragment.Attribute;
@@ -17,92 +22,141 @@
 import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
 import org.apache.vysper.xmpp.xmlfragment.XMLText;
 
-import java.util.Arrays;
-import java.util.List;
-
 /**
  */
 public class MUCMessageHandlerTestCase extends AbstractMUCHandlerTestCase {
-    
-    private Stanza sendMessage(Entity occupantJid, Entity roomJid, MessageStanzaType type, String body) throws ProtocolException {
-        StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(occupantJid, roomJid, type, null, body);
-        
+
+    private static final String BODY = "Body";
+
+    private Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
+            String body) throws ProtocolException {
+        StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(from,
+                to, type, null, body);
+
         Stanza messageStanza = stanzaBuilder.getFinalStanza();
-        ResponseStanzaContainer container = handler.execute(messageStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null);
-        if(container != null) {
+        ResponseStanzaContainer container = handler.execute(messageStanza,
+                sessionContext.getServerRuntimeContext(), true, sessionContext,
+                null);
+        if (container != null) {
             return container.getResponseStanza();
         } else {
             return null;
         }
     }
-    
-    private void assertMessageErrorStanza(Stanza response, Entity from, Entity to,
-            String type, String errorName, List<XMLElement> expectedInnerElements) {
-        assertErrorStanza(response, "message", from, to, type, errorName, expectedInnerElements);
+
+    private void assertMessageErrorStanza(Stanza response, Entity from,
+            Entity to, String type, String errorName,
+            List<XMLElement> expectedInnerElements) {
+        assertErrorStanza(response, "message", from, to, type, errorName,
+                expectedInnerElements);
     }
-    
+
     public void testMessageWithNoVoice() throws Exception {
-        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
-        Occupant occupant = room.addOccupant(occupant1Jid, "nick");
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        Occupant occupant = room.addOccupant(OCCUPANT1_JID, "nick");
         // make sure the occupant has no voice
         occupant.setRole(Role.Visitor);
 
-        
         testNotAllowedMessage(room, "forbidden");
     }
-    
+
     public void testMessageUserNotOccupant() throws Exception {
-        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
         // do not add user to room
-        
+
         testNotAllowedMessage(room, "not-acceptable");
     }
-    
-    private void testNotAllowedMessage(Room room, String expectedErrorName) throws Exception {
+
+    private void testNotAllowedMessage(Room room, String expectedErrorName)
+            throws Exception {
         String body = "Message body";
-        
-        
+
         // now, let user 2 exit room
-        Stanza errorStanza = sendMessage(occupant1Jid, room1JidWithNick, GROUPCHAT, body);
+        Stanza errorStanza = sendMessage(OCCUPANT1_JID, ROOM1_JID,
+                GROUPCHAT, body);
 
         XMLText text = new XMLText(body);
-        XMLElement expectedBody = new XMLElement("body", null, (Attribute[])null, new XMLFragment[]{text});
-        assertMessageErrorStanza(errorStanza, room1Jid, occupant1Jid, "modify", expectedErrorName, Arrays.asList(expectedBody));
-        
+        XMLElement expectedBody = new XMLElement("body", null,
+                (Attribute[]) null, new XMLFragment[] { text });
+        assertMessageErrorStanza(errorStanza, ROOM1_JID, OCCUPANT1_JID, "modify",
+                expectedErrorName, Arrays.asList(expectedBody));
+
         // no message should be relayed
         assertNull(occupant1Queue.getNext());
         assertNull(occupant2Queue.getNext());
     }
-    
+
     public void testMessageToRoomWithRelays() throws Exception {
         String body = "Message body";
-        
+
         // add occupants to the room
-        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
-        room.addOccupant(occupant1Jid, "nick");
-        room.addOccupant(occupant2Jid, "Nick 2");
-        
-        // now, let user 2 exit room
-        sendMessage(occupant1Jid, room1JidWithNick, GROUPCHAT, body);
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to room
+        sendMessage(OCCUPANT1_JID, ROOM1_JID, GROUPCHAT, body);
+
+        // verify stanzas to existing occupants on the exiting user
+        assertMessageStanza(ROOM1_JID_WITH_NICK, OCCUPANT1_JID, "groupchat", body,
+                occupant1Queue.getNext());
+        assertMessageStanza(ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "groupchat", body,
+                occupant2Queue.getNext());
+    }
+
+    public void testMessageToOccupant() throws Exception {
+        String body = "Message body";
+
+        // add occupants to the room
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to occupant 1
+        sendMessage(OCCUPANT1_JID, new EntityImpl(ROOM1_JID, "Nick 2"), MessageStanzaType.CHAT, body);
 
         // verify stanzas to existing occupants on the exiting user
-        assertMessageStanza(room1JidWithNick, occupant1Jid, "groupchat", body, occupant1Queue.getNext());
-        assertMessageStanza(room1JidWithNick, occupant2Jid, "groupchat", body, occupant2Queue.getNext());
+        assertMessageStanza(ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "chat", body,
+                occupant2Queue.getNext());
+        assertNull(occupant1Queue.getNext());
+    }
+
+    public void testGroupChatMessageToOccupant() throws Exception {
+        // add occupants to the room
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to occupant 1 with type groupchat
+        Stanza errorStanza = sendMessage(OCCUPANT1_JID, new EntityImpl(ROOM1_JID, "Nick 2"), MessageStanzaType.GROUPCHAT, BODY);
+
+        XMLText text = new XMLText(BODY);
+        XMLElement expectedBody = new XMLElement("body", null,
+                (Attribute[]) null, new XMLFragment[] { text });
+        assertMessageErrorStanza(errorStanza, ROOM1_JID, OCCUPANT1_JID, "modify",
+                "bad-request", Arrays.asList(expectedBody));
+
+        // no message should be relayed
+        assertNull(occupant1Queue.getNext());
+        assertNull(occupant2Queue.getNext());
+
     }
 
-    private void assertMessageStanza(Entity from, Entity to, String type, String body, Stanza stanza) throws XMLSemanticError {
+    
+    private void assertMessageStanza(Entity from, Entity to, String type,
+            String body, Stanza stanza) throws XMLSemanticError {
         assertEquals(from, stanza.getFrom());
         assertEquals(to, stanza.getTo());
-        if(type != null) {
+        if (type != null) {
             assertEquals(type, stanza.getAttributeValue("type"));
         }
-        
+
         XMLElement bodyElement = stanza.getSingleInnerElementsNamed("body");
         assertEquals(body, bodyElement.getInnerText().getText());
     }
 
     @Override
     protected StanzaHandler createHandler() {
-        return new MUCMessageHandler(conference);
+        return new MUCMessageHandler(conference, MODULE_JID);
     }
 }

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=805976&r1=805975&r2=805976&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 Wed Aug 19 21:12:52 2009
@@ -51,64 +51,64 @@
     }
     
     public void testEnterExistingRoom() throws Exception {
-        Room room = conference.findRoom(room1Jid);
+        Room room = conference.findRoom(ROOM1_JID);
         assertEquals(0, room.getOccupants().size());
 
-        enterRoom(occupant1Jid, room1JidWithNick);
+        enterRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK);
 
         assertEquals(1, room.getOccupants().size());
         Occupant occupant = room.getOccupants().iterator().next();
         
-        assertEquals(occupant1Jid, occupant.getJid());
+        assertEquals(OCCUPANT1_JID, occupant.getJid());
         assertEquals("nick", occupant.getName());
     }
     
     public void testEnterRoomWithDuplicateNick() throws Exception {
-        assertNull(enterRoom(occupant1Jid, room1JidWithNick));
-        Stanza error = enterRoom(occupant2Jid, room1JidWithNick);
+        assertNull(enterRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK));
+        Stanza error = enterRoom(OCCUPANT2_JID, ROOM1_JID_WITH_NICK);
         
         assertNotNull(error);
     }
 
     public void testEnterNonExistingRoom() throws Exception {
-        Room room = conference.findRoom(room2Jid);
+        Room room = conference.findRoom(ROOM2_JID);
         assertNull(room);
 
-        enterRoom(occupant1Jid, room2JidWithNick);
+        enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK);
 
-        room = conference.findRoom(room2Jid);
+        room = conference.findRoom(ROOM2_JID);
         assertNotNull(room);
         assertEquals(1, room.getOccupants().size());
         Occupant occupant = room.getOccupants().iterator().next();
         
-        assertEquals(occupant1Jid, occupant.getJid());
+        assertEquals(OCCUPANT1_JID, occupant.getJid());
         assertEquals("nick", occupant.getName());
     }
     
     public void testEnterWithoutNick() throws Exception {
         // try entering without a nick
-        PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, room1Jid);
+        PresenceStanza response = (PresenceStanza) enterRoom(OCCUPANT1_JID, ROOM1_JID);
 
-        assertPresenceErrorStanza(response, room1Jid, occupant1Jid, "modify", "jid-malformed");
+        assertPresenceErrorStanza(response, ROOM1_JID, OCCUPANT1_JID, "modify", "jid-malformed");
     }
     
     public void testEnterWithPassword() throws Exception {
-        Room room = conference.createRoom(room2Jid, "Room 1", RoomType.PasswordProtected);
+        Room room = conference.createRoom(ROOM2_JID, "Room 1", RoomType.PasswordProtected);
         room.setPassword("secret");
 
         // no error should be returned
-        assertNull(enterRoom(occupant1Jid, room2JidWithNick, "secret"));
+        assertNull(enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK, "secret"));
         assertEquals(1, room.getOccupants().size());
     }
     
     public void testEnterWithoutPassword() throws Exception {
-        Room room = conference.createRoom(room2Jid, "Room 1", RoomType.PasswordProtected);
+        Room room = conference.createRoom(ROOM2_JID, "Room 1", RoomType.PasswordProtected);
         room.setPassword("secret");
 
         // try entering without a password
-        PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, room2JidWithNick);
+        PresenceStanza response = (PresenceStanza) enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK);
         
-        assertPresenceErrorStanza(response, room2Jid, occupant1Jid, "auth", "not-authorized");
+        assertPresenceErrorStanza(response, ROOM2_JID, OCCUPANT1_JID, "auth", "not-authorized");
     }
 
     private void assertPresenceErrorStanza(PresenceStanza response, Entity from, Entity to,
@@ -123,25 +123,25 @@
 
 
         // add one occupant to the room
-        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
-        room.addOccupant(occupant1Jid, "Some nick");
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT2_JID, "Some nick");
         
-        // now, let user 2 enter room
-        enterRoom(occupant2Jid, room1JidWithNick);
+        // now, let user 1 enter room
+        enterRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK);
 
         // verify stanzas to existing occupants on the new user
-        Stanza user2JoinedStanza = occupant1Queue.getNext();
+        Stanza user1JoinedStanza = occupant2Queue.getNext();
         // should be from room + nick name
-        assertEquals(room1Jid.getFullQualifiedName() + "/nick", user2JoinedStanza.getFrom().getFullQualifiedName());
+        assertEquals(ROOM1_JID.getFullQualifiedName() + "/nick", user1JoinedStanza.getFrom().getFullQualifiedName());
         // should be to the existing user
-        assertEquals(occupant1Jid, user2JoinedStanza.getTo());
+        assertEquals(OCCUPANT2_JID, user1JoinedStanza.getTo());
         
-        XMLElement xElement = user2JoinedStanza.getSingleInnerElementsNamed("x");
+        XMLElement xElement = user1JoinedStanza.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(OCCUPANT1_JID.getFullQualifiedName(), itemElement.getAttributeValue("jid"));
         assertEquals("none", itemElement.getAttributeValue("affiliation"));
         assertEquals("participant", itemElement.getAttributeValue("role"));
 
@@ -149,16 +149,16 @@
         // verify stanzas to the new user on all existing users, including himself with status=110 element
         // own presence must be sent last
         // assert the stanza from the already existing user
-        Stanza stanza = occupant2Queue.getNext();
+        Stanza stanza = occupant1Queue.getNext();
         assertNotNull(stanza);
-        assertEquals(room1Jid.getFullQualifiedName() + "/Some nick", stanza.getFrom().getFullQualifiedName());
-        assertEquals(occupant2Jid, stanza.getTo());
+        assertEquals(ROOM1_JID.getFullQualifiedName() + "/Some nick", stanza.getFrom().getFullQualifiedName());
+        assertEquals(OCCUPANT1_JID, stanza.getTo());
 
         // assert stanza from the joining user, must have extra status=110 element        
-        stanza = occupant2Queue.getNext();
+        stanza = occupant1Queue.getNext();
         assertNotNull(stanza);
-        assertEquals(room1JidWithNick, stanza.getFrom());
-        assertEquals(occupant2Jid, stanza.getTo());
+        assertEquals(ROOM1_JID_WITH_NICK, stanza.getFrom());
+        assertEquals(OCCUPANT1_JID, stanza.getTo());
         List<XMLElement> statusElements = stanza.getFirstInnerElement().getInnerElementsNamed("status");
         assertEquals(2, statusElements.size());
         assertEquals("100", statusElements.get(0).getAttributeValue("code"));

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=805976&r1=805975&r2=805976&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 Wed Aug 19 21:12:52 2009
@@ -42,78 +42,78 @@
     }
     
     public void testExitRoom() throws Exception {
-        Room room = conference.findRoom(room1Jid);
-        room.addOccupant(occupant1Jid, "Nick1");
-        room.addOccupant(occupant2Jid, "Nick2");
+        Room room = conference.findRoom(ROOM1_JID);
+        room.addOccupant(OCCUPANT1_JID, "Nick1");
+        room.addOccupant(OCCUPANT2_JID, "Nick2");
 
-        assertNull(exitRoom(occupant1Jid, room1JidWithNick));
+        assertNull(exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK));
 
         assertEquals(1, room.getOccupants().size());
         Occupant occupant = room.getOccupants().iterator().next();
         
-        assertEquals(occupant2Jid, occupant.getJid());
+        assertEquals(OCCUPANT2_JID, occupant.getJid());
     }
 
     public void testExitNonexistingRoom() throws Exception {
         // Quietly ignore
-        assertNull(exitRoom(occupant1Jid, room2JidWithNick));
+        assertNull(exitRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK));
     }
 
     public void testExitRoomWithoutEntering() throws Exception {
         // Exit a room where the user is not a participant, quietly ignore
-        assertNull(exitRoom(occupant1Jid, room1JidWithNick));
+        assertNull(exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK));
     }
 
     public void testTemporaryRoomDeleted() throws Exception {
         // Room1 is temporary
-        Room room = conference.findRoom(room1Jid);
+        Room room = conference.findRoom(ROOM1_JID);
         assertTrue(room.isRoomType(RoomType.Temporary));
-        room.addOccupant(occupant1Jid, "Nick1");
+        room.addOccupant(OCCUPANT1_JID, "Nick1");
 
         // exit room, room should be deleted
-        assertNull(exitRoom(occupant1Jid, room1JidWithNick));
-        assertNull(conference.findRoom(room1Jid));
+        assertNull(exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK));
+        assertNull(conference.findRoom(ROOM1_JID));
     }
     
 
     public void testPersistentRoomNotDeleted() throws Exception {
         // Room2 is persistent
-        Room room = conference.createRoom(room2Jid, "Room 2", RoomType.Persistent);
-        room.addOccupant(occupant1Jid, "Nick1");
+        Room room = conference.createRoom(ROOM2_JID, "Room 2", RoomType.Persistent);
+        room.addOccupant(OCCUPANT1_JID, "Nick1");
 
         // exit room, room should be deleted
-        assertNull(exitRoom(occupant1Jid, room1JidWithNick));
-        assertNotNull(conference.findRoom(room1Jid));
+        assertNull(exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK));
+        assertNotNull(conference.findRoom(ROOM1_JID));
     }
     
     public void testExitRoomWithRelays() throws Exception {
         // add occupants to the room
-        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
-        room.addOccupant(occupant1Jid, "Nick 1");
-        room.addOccupant(occupant2Jid, "Nick 2");
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "Nick 1");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
         
-        // now, let user 2 exit room
-        exitRoom(occupant2Jid, room1JidWithNick);
+        // now, let user 1 exit room
+        exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK);
 
         // verify stanzas to existing occupants on the exiting user
-        assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), null, false);
-        assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), null, true);
+        assertExitPresenceStanza(ROOM1_JID, "Nick 1", OCCUPANT1_JID, occupant1Queue.getNext(), null, true);
+        assertExitPresenceStanza(ROOM1_JID, "Nick 1", OCCUPANT2_JID, occupant2Queue.getNext(), null, false);
     }
     
     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");
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "Nick 1");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
         
-        // now, let user 2 exit room
-        exitRoom(occupant2Jid, room1JidWithNick, statusMessage);
+        // now, let user 1 exit room
+        exitRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, 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);
+        assertExitPresenceStanza(ROOM1_JID, "Nick 1", OCCUPANT1_JID, occupant1Queue.getNext(), statusMessage, true);
+        assertExitPresenceStanza(ROOM1_JID, "Nick 1", OCCUPANT2_JID, occupant2Queue.getNext(), statusMessage, false);
     }
 
     private void assertExitPresenceStanza(Entity roomJid, String nick, Entity to, Stanza stanza, String expectedStatus, boolean own) throws XMLSemanticError {

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/MUCIntegrationTestCase.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/inttest/MUCIntegrationTestCase.java?rev=805976&r1=805975&r2=805976&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/MUCIntegrationTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/inttest/MUCIntegrationTestCase.java Wed Aug 19 21:12:52 2009
@@ -112,7 +112,7 @@
 
     }
 
-    public void testSendMessage() throws Exception {
+    public void testSendMessageToRoom() throws Exception {
         chat.join("Nick");
         chat2.join("Nick2");
 
@@ -129,5 +129,4 @@
         assertEquals(ROOM_JID + "/Nick", message.getFrom());
         assertEquals(TEST_USERNAME2, message.getTo());
     }
-    
 }