Author: ngn
Date: Fri Aug 14 11:41:32 2009
New Revision: 804170

URL: http://svn.apache.org/viewvc?rev=804170&view=rev
Log:
Implement sending message stanzas to room (VYSPER-117)

Added:
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.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/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
      - copied, changed from r804134, 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
Removed:
    
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.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/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.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

Added: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.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/MUCHandlerHelper.java?rev=804170&view=auto
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
 (added)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
 Fri Aug 14 11:41:32 2009
@@ -0,0 +1,84 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+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.protocol.NamespaceURIs;
+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;
+
+/**
+ * 
+ *  
+ * @author The Apache MINA Project ([email protected])
+ */
+public class MUCHandlerHelper {
+
+    public static boolean verifyNamespace(Stanza stanza) {
+        // either, the stanza should have a x element with the MUC namespace. 
Or, no extension 
+        // element at all. Else, return false
+        
+        XMLElement xElement = stanza.getFirstInnerElement();
+        if(xElement != null && xElement.getName().equals("x") 
+                && 
xElement.getNamespaceURI().equals(NamespaceURIs.XEP0045_MUC)) {
+            // got x element and in the correct namespace
+            return true;
+        } else if(xElement != null && xElement.getNamespaceURI() == null) {
+            // no extension namespace, ok
+            return true;
+        } else if(xElement == null) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+    public static Stanza createErrorStanza(String stanzaName, Entity from, 
Entity to, String type, String errorName, List<XMLElement> innerElements) {
+        //        <presence
+        //        from='[email protected]'
+        //        to='[email protected]/pda'
+        //        type='error'>
+        //      <error type='modify'>
+        //        <jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+        //      </error>
+        //    </presence>
+
+        StanzaBuilder builder = new StanzaBuilder(stanzaName);
+        builder.addAttribute("from", from.getFullQualifiedName());
+        builder.addAttribute("to", to.getFullQualifiedName());
+        builder.addAttribute("type", "error");
+        
+        if(innerElements != null) {
+            for(XMLElement innerElement : innerElements) {
+                   builder.addPreparedElement(innerElement);
+            }
+        }
+        
+        builder.startInnerElement("error").addAttribute("type", type);
+        builder.startInnerElement(errorName, 
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
+        builder.endInnerElement();
+        
+        return PresenceStanza.getWrapper(builder.getFinalStanza());
+    }
+}

Added: 
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=804170&view=auto
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
 (added)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
 Fri Aug 14 11:41:32 2009
@@ -0,0 +1,137 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.vysper.compliance.SpecCompliance;
+import org.apache.vysper.compliance.SpecCompliant;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.delivery.DeliveryException;
+import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
+import org.apache.vysper.xmpp.modules.core.base.handler.DefaultMessageHandler;
+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.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of <a 
href="http://xmpp.org/extensions/xep-0045.html";>XEP-0045 Multi-user chat</a>.
+ * 
+ *  
+ * @author The Apache MINA Project ([email protected])
+ */
+...@speccompliance(compliant = {
+        @SpecCompliant(spec = "xep-0045", section = "7.9", status = 
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = 
SpecCompliant.ComplianceCoverage.PARTIAL),
+        @SpecCompliant(spec = "xep-0045", section = "7.9", status = 
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = 
SpecCompliant.ComplianceCoverage.PARTIAL) })
+public class MUCMessageHandler extends DefaultMessageHandler {
+
+    final Logger logger = LoggerFactory.getLogger(MUCMessageHandler.class);
+
+    private Conference conference;
+
+    public MUCMessageHandler(Conference conference) {
+        this.conference = conference;
+    }
+
+    @Override
+    protected boolean verifyNamespace(Stanza stanza) {
+        return MUCHandlerHelper.verifyNamespace(stanza);
+    }
+    
+    private Stanza copyMessageStanza(Entity from, Entity to, Stanza original) {
+        StanzaBuilder builder = new StanzaBuilder("message");
+        builder.addAttribute("from", from.getFullQualifiedName());
+        builder.addAttribute("to", to.getFullQualifiedName());
+        
+        for(XMLElement innerElement : original.getInnerElements()) {
+            builder.addPreparedElement(innerElement);
+        }
+        
+        return builder.getFinalStanza();
+    }
+    
+    private Stanza createMessageErrorStanza(Entity from, Entity to, String 
type, String errorName, Stanza stanza) {
+        return MUCHandlerHelper.createErrorStanza("message", from, to, type, 
errorName, stanza.getInnerElements());
+    }
+    
+    @Override
+    protected Stanza executeMessageLogic(MessageStanza stanza,
+            ServerRuntimeContext serverRuntimeContext,
+            SessionContext sessionContext) {
+
+        String type = stanza.getType();
+        if(type != null && type.equals("groupchat")) {
+            // groupchat, message to a room
+            Entity roomWithNickJid = stanza.getTo();
+            Room room = conference.findRoom(roomWithNickJid.getBareJID());
+            if(room != null) {
+                // sender must be participant in room
+                Entity from = stanza.getFrom();
+                Occupant sendingOccupant = room.findOccupant(from);
+                
+                if(sendingOccupant != null) {
+                    
+                    Entity roomAndSendingNick = new EntityImpl(room.getJID(), 
sendingOccupant.getName());
+                    if(sendingOccupant.hasVoice()) {
+                        // relay message to all occupants in room
+                        
+                        for(Occupant occupent : room.getOccupants()) {
+                            relayStanza(occupent.getJid(), 
+                                    copyMessageStanza(roomAndSendingNick, 
occupent.getJid(), stanza), 
+                                    sessionContext);
+                        }
+                    } else {
+                        return createMessageErrorStanza(room.getJID(), from, 
"modify", "forbidden", stanza);
+                    }
+                } else {
+                    return createMessageErrorStanza(room.getJID(), from, 
"modify", "not-acceptable", stanza);
+                }
+            } else {
+                // TODO how to handle unknown room?
+            }
+        }
+        
+        return null;
+        
+    }
+
+    protected void relayStanza(Entity receiver, Stanza stanza,
+            SessionContext sessionContext) {
+        try {
+            sessionContext.getServerRuntimeContext().getStanzaRelay().relay(
+                    receiver, stanza, new IgnoreFailureStrategy());
+        } catch (DeliveryException e) {
+            logger.warn("presence relaying failed ", e);
+        }
+    }
+}

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=804170&r1=804169&r2=804170&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 11:41:32 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 
 import org.apache.vysper.compliance.SpecCompliant;
@@ -39,7 +41,9 @@
 import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
 import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
 import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,46 +67,16 @@
 
     @Override
     protected boolean verifyNamespace(Stanza stanza) {
-        // either, the stanza should have a x element with the MUC namespace. 
Or, no extension 
-        // element at all. Else, return false
-        
-        XMLElement xElement = stanza.getFirstInnerElement();
-        if(xElement != null && xElement.getName().equals("x") 
-                && 
xElement.getNamespaceURI().equals(NamespaceURIs.XEP0045_MUC)) {
-            // got x element and in the correct namespace
-            return true;
-        } else if(xElement != null && xElement.getNamespaceURI() == null) {
-            // no extension namespace, ok
-            return true;
-        } else if(xElement == null) {
-            return true;
-        } else {
-            return false;
-        }
+        return MUCHandlerHelper.verifyNamespace(stanza);
     }
 
-    private Stanza sendError(Entity roomJid, Entity occupantJid, String type, 
String error) {
-        //        <presence
-        //        from='[email protected]'
-        //        to='[email protected]/pda'
-        //        type='error'>
-        //      <error type='modify'>
-        //        <jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
-        //      </error>
-        //    </presence>
-
-        StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomJid, 
occupantJid, null, 
-                PresenceStanzaType.ERROR, null, null);
-        
+    private Stanza createPresenceErrorStanza(Entity from, Entity to, String 
type, String errorName) {
         // "Note: If an error occurs in relation to joining a room, the 
service SHOULD include 
         // the MUC child element (i.e., <x 
xmlns='http://jabber.org/protocol/muc'/>) in the 
         // <presence/> stanza of type "error"."
-        builder.startInnerElement("x", 
NamespaceURIs.XEP0045_MUC).endInnerElement();
-        builder.startInnerElement("error").addAttribute("type", type);
-        builder.startInnerElement(error, 
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
-        builder.endInnerElement();
-        
-        return PresenceStanza.getWrapper(builder.getFinalStanza());
+
+        XMLElement xElement = new XMLElement("x", NamespaceURIs.XEP0045_MUC, 
(List<Attribute>)null, (List<XMLFragment>)null);
+        return MUCHandlerHelper.createErrorStanza("presence", from, to, type, 
errorName, Arrays.asList(xElement));
     }
     
     @Override
@@ -117,7 +91,7 @@
         
         // user did not send nick name
         if(nick == null) {
-            return sendError(roomJid, occupantJid, "modify", "jid-malformed");
+            return createPresenceErrorStanza(roomJid, occupantJid, "modify", 
"jid-malformed");
         }
 
         String type = stanza.getType();
@@ -156,7 +130,7 @@
             
             if(password == null || !password.equals(room.getPassword())) {
                 // password missing or not matching
-                return sendError(roomJid, newOccupantJid, "auth", 
"not-authorized");
+                return createPresenceErrorStanza(roomJid, newOccupantJid, 
"auth", "not-authorized");
             }
         }
         

Modified: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.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/model/Occupant.java?rev=804170&r1=804169&r2=804170&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
 Fri Aug 14 11:41:32 2009
@@ -69,5 +69,9 @@
         return jid;
     }
     
+    public boolean hasVoice() {
+        return role == Role.Moderator || role == Role.Participant;
+    }
+    
     
 }

Copied: 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
 (from r804134, 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.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?p2=mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java&p1=mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java&r1=804134&r2=804170&rev=804170&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java
 (original)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
 Fri Aug 14 11:41:32 2009
@@ -1,5 +1,7 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import java.util.List;
+
 import junit.framework.TestCase;
 
 import org.apache.vysper.TestUtil;
@@ -7,11 +9,15 @@
 import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
 
 /**
  */
-public abstract class AbstractMUCPresenceHandlerTestCase extends TestCase {
+public abstract class AbstractMUCHandlerTestCase extends TestCase {
     
     protected TestSessionContext sessionContext;
 
@@ -23,7 +29,7 @@
     
     protected Entity occupant1Jid = 
TestUtil.parseUnchecked("[email protected]");
     protected Entity occupant2Jid = 
TestUtil.parseUnchecked("[email protected]");
-    protected MUCPresenceHandler handler;
+    protected StanzaHandler handler;
 
     protected Conference conference = new Conference("foo");
 
@@ -42,6 +48,37 @@
         
         conference.createRoom(room1Jid, "Room 1");
         
-        handler = new MUCPresenceHandler(conference);
+        handler = createHandler();
+    }
+    
+    protected abstract StanzaHandler createHandler();
+    
+    
+    protected void assertErrorStanza(Stanza response, String stanzaName, 
Entity from, Entity to, 
+            String type, String errorName, List<XMLElement> 
expectedInnerElements) {
+        assertNotNull(response);
+        assertEquals(stanzaName, response.getName());
+        assertEquals(to, response.getTo());
+        assertEquals(from, response.getFrom());
+        assertEquals("error", response.getAttributeValue("type"));
+        
+        List<XMLElement> innerElements = response.getInnerElements();
+
+        int index = 0;
+        if(expectedInnerElements != null) {
+            for(XMLElement expectedInnerElement : expectedInnerElements) {
+                assertEquals(expectedInnerElement, innerElements.get(index));
+                index++;
+            }
+        }
+        
+        // error element must always be present
+        XMLElement errorElement = innerElements.get(index);
+        assertEquals("error", errorElement.getName());
+        assertEquals(type, errorElement.getAttributeValue("type"));
+        
+        XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
+        assertEquals(errorName, jidMalformedElement.getName());
+        assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, 
jidMalformedElement.getNamespaceURI());
     }
 }

Added: 
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=804170&view=auto
==============================================================================
--- 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
 (added)
+++ 
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
 Fri Aug 14 11:41:32 2009
@@ -0,0 +1,110 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+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.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.PresenceStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+import org.apache.vysper.xmpp.xmlfragment.XMLText;
+
+/**
+ */
+public class MUCMessageHandlerTestCase extends AbstractMUCHandlerTestCase {
+    
+    private Stanza sendMessage(Entity occupantJid, Entity roomJid, String 
type, String body) throws ProtocolException {
+        StanzaBuilder stanzaBuilder = 
StanzaBuilder.createMessageStanza(occupantJid, roomJid, null, body);
+        if(type != null) {
+            stanzaBuilder.addAttribute("type", type);
+        }
+        
+        Stanza messageStanza = stanzaBuilder.getFinalStanza();
+        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);
+    }
+    
+    public void testMessageWithNoVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+        Occupant occupant = room.addOccupant(occupant1Jid, "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");
+        // do not add user to room
+        
+        testNotAllowedMessage(room, "not-acceptable");
+    }
+    
+    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);
+
+        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));
+        
+        // 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);
+
+        // verify stanzas to existing occupants on the exiting user
+        assertMessageStanza(room1JidWithNick, occupant1Jid, body, 
occupant1Queue.getNext());
+        assertMessageStanza(room1JidWithNick, occupant2Jid, body, 
occupant2Queue.getNext());
+    }
+
+    private void assertMessageStanza(Entity from, Entity to, String body, 
Stanza stanza) throws XMLSemanticError {
+        assertEquals(from, stanza.getFrom());
+        assertEquals(to, stanza.getTo());
+        
+        XMLElement bodyElement = stanza.getSingleInnerElementsNamed("body");
+        assertEquals(body, bodyElement.getInnerText().getText());
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCMessageHandler(conference);
+    }
+}

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=804170&r1=804169&r2=804170&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
 Fri Aug 14 11:41:32 2009
@@ -1,5 +1,6 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.vysper.xmpp.addressing.Entity;
@@ -7,21 +8,25 @@
 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.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.Attribute;
 import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
 
 /**
  */
-public class MUCPresenceHandlerEnterRoomTestCase extends 
AbstractMUCPresenceHandlerTestCase {
+public class MUCPresenceHandlerEnterRoomTestCase extends 
AbstractMUCHandlerTestCase {
 
-    private Stanza enterRoom(Entity occupantJid, Entity roomJid) {
+    private Stanza enterRoom(Entity occupantJid, Entity roomJid) throws 
ProtocolException {
         return enterRoom(occupantJid, roomJid, null);
     }
     
-    private Stanza enterRoom(Entity occupantJid, Entity roomJid, String 
password) {
+    private Stanza enterRoom(Entity occupantJid, Entity roomJid, String 
password) throws ProtocolException {
         StanzaBuilder stanzaBuilder = 
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, null, null, 
null);
         
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC);
         if(password != null) {
@@ -38,7 +43,13 @@
         }
     }
     
-    public void testEnterExistingRoom() {
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCPresenceHandler(conference);
+    }
+    
+    public void testEnterExistingRoom() throws Exception {
         Room room = conference.findRoom(room1Jid);
         assertEquals(0, room.getOccupants().size());
 
@@ -51,7 +62,7 @@
         assertEquals("nick", occupant.getName());
     }
 
-    public void testEnterNonExistingRoom() {
+    public void testEnterNonExistingRoom() throws Exception {
         Room room = conference.findRoom(room2Jid);
         assertNull(room);
 
@@ -66,14 +77,14 @@
         assertEquals("nick", occupant.getName());
     }
     
-    public void testEnterWithoutNick() {
+    public void testEnterWithoutNick() throws Exception {
         // try entering without a nick
         PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, 
room1Jid);
 
-        assertErrorStanza(response, room1Jid, occupant1Jid, "modify", 
"jid-malformed");
+        assertPresenceErrorStanza(response, room1Jid, occupant1Jid, "modify", 
"jid-malformed");
     }
     
-    public void testEnterWithPassword() {
+    public void testEnterWithPassword() throws Exception {
         Room room = conference.createRoom(room2Jid, "Room 1", 
RoomType.PasswordProtected);
         room.setPassword("secret");
 
@@ -82,37 +93,22 @@
         assertEquals(1, room.getOccupants().size());
     }
     
-    public void testEnterWithoutPassword() {
+    public void testEnterWithoutPassword() throws Exception {
         Room room = conference.createRoom(room2Jid, "Room 1", 
RoomType.PasswordProtected);
         room.setPassword("secret");
 
         // try entering without a password
         PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid, 
room2JidWithNick);
         
-        assertErrorStanza(response, room2Jid, occupant1Jid, "auth", 
"not-authorized");
+        assertPresenceErrorStanza(response, room2Jid, occupant1Jid, "auth", 
"not-authorized");
     }
 
-    private void assertErrorStanza(PresenceStanza response, Entity from, 
Entity to, String type, String errorName) {
-        assertNotNull(response);
-        assertEquals("presence", response.getName());
-        assertEquals(to, response.getTo());
-        assertEquals(from, response.getFrom());
-        assertEquals("error", response.getType());
-        
-        List<XMLElement> innerElements = response.getInnerElements();
-        
-        XMLElement xElement = innerElements.get(0);
-        assertEquals("x", xElement.getName());
-        assertEquals(NamespaceURIs.XEP0045_MUC, xElement.getNamespaceURI());
-
-        XMLElement errorElement = innerElements.get(1);
-        assertEquals("error", errorElement.getName());
-        assertEquals(type, errorElement.getAttributeValue("type"));
-        
-        XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
-        assertEquals(errorName, jidMalformedElement.getName());
-        assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, 
jidMalformedElement.getNamespaceURI());
+    private void assertPresenceErrorStanza(PresenceStanza response, Entity 
from, Entity to,
+            String type, String errorName) {
+        XMLElement xElement = new XMLElement("x", NamespaceURIs.XEP0045_MUC, 
(Attribute[])null, (XMLFragment[])null);
+        assertErrorStanza(response, "presence", from, to, type, errorName, 
Arrays.asList(xElement));
     }
+
     
     public void testEnterRoomWithRelays() throws Exception {
 

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=804170&r1=804169&r2=804170&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 11:41:32 2009
@@ -7,7 +7,9 @@
 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.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -16,19 +18,15 @@
 
 /**
  */
-public class MUCPresenceHandlerExitRoomTestCase extends 
AbstractMUCPresenceHandlerTestCase {
+public class MUCPresenceHandlerExitRoomTestCase extends 
AbstractMUCHandlerTestCase {
     
-    private Stanza exitRoom(Entity occupantJid, Entity roomJid) {
+    private Stanza exitRoom(Entity occupantJid, Entity roomJid) throws 
ProtocolException {
         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);
+    private Stanza exitRoom(Entity occupantJid, Entity roomJid, String status) 
throws ProtocolException {
+        StanzaBuilder stanzaBuilder = 
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, 
PresenceStanzaType.UNAVAILABLE, null, status);
 
-        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) {
@@ -38,7 +36,12 @@
         }
     }
     
-    public void testExitRoom() {
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCPresenceHandler(conference);
+    }
+    
+    public void testExitRoom() throws Exception {
         Room room = conference.findRoom(room1Jid);
         room.addOccupant(occupant1Jid, "Nick1");
         room.addOccupant(occupant2Jid, "Nick2");
@@ -51,17 +54,17 @@
         assertEquals(occupant2Jid, occupant.getJid());
     }
 
-    public void testExitNonexistingRoom() {
+    public void testExitNonexistingRoom() throws Exception {
         // Quietly ignore
         assertNull(exitRoom(occupant1Jid, room2JidWithNick));
     }
 
-    public void testExitRoomWithoutEntering() {
+    public void testExitRoomWithoutEntering() throws Exception {
         // Exit a room where the user is not a participant, quietly ignore
         assertNull(exitRoom(occupant1Jid, room1JidWithNick));
     }
 
-    public void testTemporaryRoomDeleted() {
+    public void testTemporaryRoomDeleted() throws Exception {
         // Room1 is temporary
         Room room = conference.findRoom(room1Jid);
         assertTrue(room.isRoomType(RoomType.Temporary));
@@ -73,7 +76,7 @@
     }
     
 
-    public void testPersistentRoomNotDeleted() {
+    public void testPersistentRoomNotDeleted() throws Exception {
         // Room2 is persistent
         Room room = conference.createRoom(room2Jid, "Room 2", 
RoomType.Persistent);
         room.addOccupant(occupant1Jid, "Nick1");


Reply via email to