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/10/04 23:27:20 UTC

svn commit: r821620 - 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/ main/java/org/apache/vysper/x...

Author: ngn
Date: Sun Oct  4 21:27:20 2009
New Revision: 821620

URL: http://svn.apache.org/viewvc?rev=821620&view=rev
Log:
Implement room subject change (VYSPER-155, VYSPER-123)

Added:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCSubjectMessageHandlerTestCase.java
Modified:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.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/model/Occupant.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/RoomType.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/History.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/model/DiscussionMessageTestCase.java

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.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/ServerMain.java?rev=821620&r1=821619&r2=821620&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.java Sun Oct  4 21:27:20 2009
@@ -62,6 +62,7 @@
         final AccountManagement accountManagement = (AccountManagement)providerRegistry.retrieve(AccountManagement.class);
 
         accountManagement.addUser("test@vysper.org", "password");
+        accountManagement.addUser("test2@vysper.org", "password");
 
         XMPPServer server = new XMPPServer("vysper.org");
         server.addEndpoint(new TCPEndpoint());

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=821620&r1=821619&r2=821620&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 Sun Oct  4 21:27:20 2009
@@ -32,7 +32,9 @@
 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.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.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
@@ -43,6 +45,7 @@
 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.XMLSemanticError;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -108,6 +111,18 @@
                     if(sendingOccupant.hasVoice()) {
                         // relay message to all occupants in room
                         
+                        try {
+                            if(stanza.getSubjects() != null && !stanza.getSubjects().isEmpty()) {
+                                // subject message
+                                if(!room.isRoomType(RoomType.OpenSubject) && !sendingOccupant.isModerator()) {
+                                    // room only allows moderators to change the subject, and sender is not a moderator
+                                    return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN, stanza);
+                                }
+                            }
+                        } catch (XMLSemanticError e) {
+                            // not a subject message, ignore exception
+                        }
+                        
                         logger.debug("Relaying message to all room occupants");
                         for(Occupant occupent : room.getOccupants()) {
                             logger.debug("Relaying message to  {}", occupent);

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=821620&r1=821619&r2=821620&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 Sun Oct  4 21:27:20 2009
@@ -83,4 +83,8 @@
         return jid.getFullQualifiedName();
     }
     
+    public boolean isModerator() {
+        return role == Role.Moderator;
+    }
+    
 }

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.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/Room.java?rev=821620&r1=821619&r2=821620&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java Sun Oct  4 21:27:20 2009
@@ -171,7 +171,9 @@
         infoElements.add(new Feature(NamespaceURIs.XEP0045_MUC));
         
         for(RoomType type : roomTypes) {
-            infoElements.add(new Feature(type.getDiscoName()));            
+            if(type.includeInDisco()) {
+                infoElements.add(new Feature(type.getDiscoName()));
+            }
         }
         
         return infoElements;

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/RoomType.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/RoomType.java?rev=821620&r1=821619&r2=821620&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/RoomType.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/RoomType.java Sun Oct  4 21:27:20 2009
@@ -95,7 +95,13 @@
     /**
      * A room that anyone is allowed to enter without first providing the correct password; antonym: Password-Protected Room.
      */
-    Unsecured("muc_unsecured");
+    Unsecured("muc_unsecured"),
+    
+    // extra features, not covered by room types as defined in the XEP
+    /**
+     * Any visitor can change the room subject, not only a moderator
+     */
+    OpenSubject(null);
     
     private String discoName;
 
@@ -161,4 +167,9 @@
         }
     }
 
+
+    public boolean includeInDisco() {
+        return discoName != null;
+    }
+
 }

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/History.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/stanzas/History.java?rev=821620&r1=821619&r2=821620&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/History.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/History.java Sun Oct  4 21:27:20 2009
@@ -21,7 +21,6 @@
 
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.Date;
 import java.util.List;
 
 import org.apache.vysper.xmpp.datetime.DateTimeProfile;

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=821620&r1=821619&r2=821620&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 Sun Oct  4 21:27:20 2009
@@ -61,7 +61,7 @@
     
     
     protected void assertErrorStanza(Stanza response, String stanzaName, Entity from, Entity to, 
-            String type, String errorName, List<XMLElement> expectedInnerElements) {
+            String type, String errorName, XMLElement... expectedInnerElements) {
         assertNotNull(response);
         assertEquals(stanzaName, response.getName());
         assertEquals(to, response.getTo());

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.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/AbstractMUCMessageHandlerTestCase.java?rev=821620&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java Sun Oct  4 21:27:20 2009
@@ -0,0 +1,109 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import static org.apache.vysper.xmpp.stanza.MessageStanzaType.GROUPCHAT;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
+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.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.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 AbstractMUCMessageHandlerTestCase extends AbstractMUCHandlerTestCase {
+
+    protected static final String BODY = "Body";
+
+    protected Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
+            String body) throws ProtocolException {
+        return sendMessage(from, to, type, body, null, null);
+    }
+    
+    protected Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
+            String body, X x, String subject) throws ProtocolException {
+        StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(from,
+                to, type, null, body);
+        if(subject != null) {
+            stanzaBuilder.startInnerElement("subject").addText(subject).endInnerElement();
+        }
+        if(x != null) {
+            stanzaBuilder.addPreparedElement(x);
+        }
+
+        Stanza messageStanza = stanzaBuilder.getFinalStanza();
+        ResponseStanzaContainer container = handler.execute(messageStanza,
+                sessionContext.getServerRuntimeContext(), true, sessionContext,
+                null);
+        if (container != null) {
+            return container.getResponseStanza();
+        } else {
+            return null;
+        }
+    }
+
+    protected void assertMessageErrorStanza(Stanza response, Entity from,
+            Entity to, String type, String errorName,
+            XMLElement... expectedInnerElements) {
+        assertErrorStanza(response, "message", from, to, type, errorName,
+                expectedInnerElements);
+    }
+
+    protected void testNotAllowedMessage(Room room, String expectedErrorName)
+            throws Exception {
+        String body = "Message body";
+
+        // now, let user 2 exit room
+        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, ROOM1_JID, OCCUPANT1_JID, "modify",
+                expectedErrorName,expectedBody);
+
+        // no message should be relayed
+        assertNull(occupant1Queue.getNext());
+        assertNull(occupant2Queue.getNext());
+    }
+
+    protected void assertMessageStanza(Entity from, Entity to, String type,
+            String body, Stanza stanza) throws XMLSemanticError {
+        assertMessageStanza(from, to, type, body, null, null, stanza);
+    }
+    
+    protected void assertMessageStanza(Entity from, Entity to, String type,
+            String expectedBody, String expectedSubject, X expectedX, Stanza stanza) throws XMLSemanticError {
+        assertNotNull(stanza);
+        MessageStanza msgStanza = (MessageStanza) MessageStanza.getWrapper(stanza);
+        
+        assertEquals(from, stanza.getFrom());
+        assertEquals(to, stanza.getTo());
+        if (type != null) {
+            assertEquals(type, stanza.getAttributeValue("type"));
+        }
+
+        assertEquals(expectedBody, msgStanza.getBody(null));
+        assertEquals(expectedSubject, msgStanza.getSubject(null));
+
+        if(expectedX != null) {
+            X actualX = X.fromStanza(stanza);
+            assertEquals(expectedX, actualX);
+        }
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        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/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=821620&r1=821619&r2=821620&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 Sun Oct  4 21:27:20 2009
@@ -3,9 +3,7 @@
 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;
@@ -14,54 +12,16 @@
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Invite;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Password;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
-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.MessageStanzaType;
 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 static final String BODY = "Body";
-
-    private Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
-            String body) throws ProtocolException {
-        return sendMessage(from, to, type, body, null);
-    }
-    
-    private Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
-            String body, X x) throws ProtocolException {
-        StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(from,
-                to, type, null, body);
-        if(x != null) {
-            stanzaBuilder.addPreparedElement(x);
-        }
-
-        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 class MUCMessageHandlerTestCase extends AbstractMUCMessageHandlerTestCase {
 
     public void testMessageWithNoVoice() throws Exception {
         Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
@@ -79,25 +39,6 @@
         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(OCCUPANT1_JID, ROOM1_JID,
-                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",
-                expectedErrorName, Arrays.asList(expectedBody));
-
-        // no message should be relayed
-        assertNull(occupant1Queue.getNext());
-        assertNull(occupant2Queue.getNext());
-    }
-
     public void testMessageToRoomWithRelays() throws Exception {
         String body = "Message body";
 
@@ -133,6 +74,7 @@
         assertNull(occupant1Queue.getNext());
     }
 
+    
     public void testGroupChatMessageToOccupant() throws Exception {
         // add occupants to the room
         Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
@@ -146,7 +88,7 @@
         XMLElement expectedBody = new XMLElement("body", null,
                 (Attribute[]) null, new XMLFragment[] { text });
         assertMessageErrorStanza(errorStanza, ROOM1_JID, OCCUPANT1_JID, "modify",
-                "bad-request", Arrays.asList(expectedBody));
+                "bad-request", expectedBody);
 
         // no message should be relayed
         assertNull(occupant1Queue.getNext());
@@ -164,11 +106,11 @@
 
         Invite invite = new Invite(null, OCCUPANT2_JID, reason);
         // send message to occupant 1
-        assertNull(sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new X(invite)));
+        assertNull(sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new X(invite), null));
 
         X expectedX = new X(new Invite(OCCUPANT1_JID, null, reason), new Password("secret"));
         // verify stanzas to existing occupants on the exiting user
-        assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, expectedX,
+        assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, null, expectedX,
                 occupant2Queue.getNext());
         assertNull(occupant1Queue.getNext());
     }
@@ -182,44 +124,13 @@
 
         Decline decline = new Decline(null, OCCUPANT2_JID, reason);
         // send message to occupant 1
-        Stanza error = sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new X(decline));
+        Stanza error = sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new X(decline), null);
         assertNull(error);
 
         X expectedX = new X(new Decline(OCCUPANT1_JID, null, reason));
         // verify stanzas to existing occupants on the exiting user
-        assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, expectedX,
+        assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, null, expectedX,
                 occupant2Queue.getNext());
         assertNull(occupant1Queue.getNext());
     }
-
-    
-    private void assertMessageStanza(Entity from, Entity to, String type,
-            String body, Stanza stanza) throws XMLSemanticError {
-        assertMessageStanza(from, to, type, body, null, stanza);
-    }
-    
-    private void assertMessageStanza(Entity from, Entity to, String type,
-            String expectedBody, X expectedX, Stanza stanza) throws XMLSemanticError {
-        assertNotNull(stanza);
-        assertEquals(from, stanza.getFrom());
-        assertEquals(to, stanza.getTo());
-        if (type != null) {
-            assertEquals(type, stanza.getAttributeValue("type"));
-        }
-
-        if(expectedBody != null) {
-            XMLElement bodyElement = stanza.getSingleInnerElementsNamed("body");
-            assertEquals(expectedBody, bodyElement.getInnerText().getText());
-        }
-        
-        if(expectedX != null) {
-            X actualX = X.fromStanza(stanza);
-            assertEquals(expectedX, actualX);
-        }
-    }
-
-    @Override
-    protected StanzaHandler createHandler() {
-        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=821620&r1=821619&r2=821620&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 Sun Oct  4 21:27:20 2009
@@ -186,7 +186,7 @@
             String type, String errorName) {
         Attribute xmlns = new NamespaceAttribute(NamespaceURIs.XEP0045_MUC);
         XMLElement xElement = new XMLElement("x", null, Arrays.asList(xmlns), (XMLFragment[])null);
-        assertErrorStanza(response, "presence", from, to, type, errorName, Arrays.asList(xElement));
+        assertErrorStanza(response, "presence", from, to, type, errorName, xElement);
     }
 
     

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCSubjectMessageHandlerTestCase.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/MUCSubjectMessageHandlerTestCase.java?rev=821620&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCSubjectMessageHandlerTestCase.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCSubjectMessageHandlerTestCase.java Sun Oct  4 21:27:20 2009
@@ -0,0 +1,67 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import static org.apache.vysper.xmpp.stanza.MessageStanzaType.GROUPCHAT;
+
+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.stanza.Stanza;
+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.XMLText;
+
+
+/**
+ */
+public class MUCSubjectMessageHandlerTestCase extends AbstractMUCMessageHandlerTestCase {
+
+    private static final String SUBJECT = "Subject";
+
+    public void testChangeSubjectNonModeratorAllowed() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2", RoomType.OpenSubject);
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to room
+        assertNull(sendMessage(OCCUPANT1_JID, ROOM2_JID, GROUPCHAT, null, null, SUBJECT));
+
+        // verify stanzas to existing occupants on the exiting user
+        assertMessageStanza(ROOM2_JID_WITH_NICK, OCCUPANT1_JID, "groupchat", null, SUBJECT, null,
+                occupant1Queue.getNext());
+        assertMessageStanza(ROOM2_JID_WITH_NICK, OCCUPANT2_JID, "groupchat", null, SUBJECT, null,
+                occupant2Queue.getNext());
+    }
+
+    public void testChangeSubject() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        room.addOccupant(OCCUPANT1_JID, "nick").setRole(Role.Moderator);
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to room
+        assertNull(sendMessage(OCCUPANT1_JID, ROOM2_JID, GROUPCHAT, null, null, SUBJECT));
+
+        // verify stanzas to existing occupants on the exiting user
+        assertMessageStanza(ROOM2_JID_WITH_NICK, OCCUPANT1_JID, "groupchat", null, SUBJECT, null,
+                occupant1Queue.getNext());
+        assertMessageStanza(ROOM2_JID_WITH_NICK, OCCUPANT2_JID, "groupchat", null, SUBJECT, null,
+                occupant2Queue.getNext());
+    }
+
+    public void testChangeSubjectNonModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        // send message to room
+        Stanza error = sendMessage(OCCUPANT1_JID, ROOM2_JID, GROUPCHAT, null, null, SUBJECT);
+
+        assertMessageErrorStanza(error, ROOM2_JID, OCCUPANT1_JID, "auth", "forbidden", 
+                new XMLElement("subject", null, (Attribute[])null, new XMLFragment[]{new XMLText(SUBJECT)}));
+        
+        assertNull(occupant1Queue.getNext());
+        assertNull(occupant2Queue.getNext());
+    }
+
+
+}

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessageTestCase.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/model/DiscussionMessageTestCase.java?rev=821620&r1=821619&r2=821620&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessageTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessageTestCase.java Sun Oct  4 21:27:20 2009
@@ -20,7 +20,6 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.model;
 
 import java.util.Calendar;
-import java.util.Date;
 import java.util.TimeZone;
 
 import junit.framework.TestCase;