Author: ngn
Date: Fri Jul 30 21:43:30 2010
New Revision: 980976

URL: http://svn.apache.org/viewvc?rev=980976&view=rev
Log:
Implemented role changing use cases (VYSPER-125, VYSPER-126, VYSPER-135, 
VYSPER-136)

Added:
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
Modified:
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
    
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java

Modified: 
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java?rev=980976&r1=980975&r2=980976&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCIqAdminHandler.java
 Fri Jul 30 21:43:30 2010
@@ -19,8 +19,7 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
-import java.util.List;
-
+import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -78,77 +77,128 @@ public class MUCIqAdminHandler extends D
 
     @Override
     protected Stanza handleSet(IQStanza stanza, ServerRuntimeContext 
serverRuntimeContext, SessionContext sessionContext) {
-
         Room room = conference.findRoom(stanza.getTo());
 
         Occupant moderator = room.findOccupantByJID(stanza.getFrom());
 
-        // TODO add check if moderator or admin
+        // check if moderator
+        if (moderator.getRole() != Role.Moderator) {
+            // only moderators are allowed to continue
+            return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN);
+        }
 
         try {
-            List<IqAdminItem> items = IqAdminItem.extractItems(stanza);
+            XMLElement query = stanza.getSingleInnerElementsNamed("query", 
NamespaceURIs.XEP0045_MUC_ADMIN);
+            XMLElement itemElement = query.getSingleInnerElementsNamed("item", 
NamespaceURIs.XEP0045_MUC_ADMIN);
 
-            for (IqAdminItem item : items) {
-                if (item.getRole().equals(Role.None)) {
-                    // kicking a user
-
-                    // find kicked users jid
-                    Occupant toBeKicked = null;
-                    if (item.getNick() != null) {
-                        toBeKicked = room.findOccupantByNick(item.getNick());
-                    } else {
-                        // TODO fix
-                    }
-
-                    // a moderator can not kick someone with a higher 
affiliation
-                    // and, you can not kick yourself
-                    if 
(toBeKicked.getAffiliation().compareTo(moderator.getAffiliation()) < 0) {
-                        return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
-                                StanzaErrorCondition.NOT_ALLOWED);
-                    }
-
-                    if (moderator.getJid().equals(toBeKicked.getJid())) {
-                        return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
-                                StanzaErrorCondition.CONFLICT);
-                    }
-
-                    // remove user from room
-                    toBeKicked.setRole(Role.None);
-                    room.removeOccupant(toBeKicked.getJid());
-                    Entity kickedInRoom = roomAndNick(room, toBeKicked);
-
-                    Status kickedStatus = new Status(StatusCode.BEEN_KICKED);
-
-                    // notify user he got kicked
-                    Stanza presenceToKicked = 
MUCStanzaBuilder.createPresenceStanza(kickedInRoom, toBeKicked.getJid(),
-                            PresenceStanzaType.UNAVAILABLE, 
NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(
-                                    Affiliation.None, Role.None),
-                            // TODO handle <actor>
-                            // TODO handle <reason>
-                            kickedStatus);
-
-                    relayStanza(toBeKicked.getJid(), presenceToKicked, 
serverRuntimeContext);
-
-                    // notify remaining users that user got kicked
-                    for (Occupant remaining : room.getOccupants()) {
-                        Stanza presenceToRemaining = 
MUCStanzaBuilder.createPresenceStanza(kickedInRoom, remaining
-                                .getJid(), PresenceStanzaType.UNAVAILABLE, 
NamespaceURIs.XEP0045_MUC_USER,
-                                new MucUserPresenceItem(Affiliation.None, 
Role.None), kickedStatus);
+            IqAdminItem item = IqAdminItem.getWrapper(itemElement);
 
-                        relayStanza(remaining.getJid(), presenceToRemaining, 
serverRuntimeContext);
-                    }
-                }
+            Occupant target = null;
+            if (item.getNick() != null) {
+                target = room.findOccupantByNick(item.getNick());
+            } else {
+                return createBadRequestError(stanza, serverRuntimeContext, 
sessionContext, "Missing nick for item");
             }
 
-            return StanzaBuilder.createIQStanza(stanza.getTo(), 
stanza.getFrom(), IQStanzaType.RESULT, stanza.getID())
-                    .build();
+            if (item.getRole() != null) {
+                return changeRole(stanza, serverRuntimeContext, 
sessionContext, item, room, moderator, target);
+            } else {
+                return createBadRequestError(stanza, serverRuntimeContext, 
sessionContext, "Unknown IQ stanza");
+            }
 
         } catch (XMLSemanticError e) {
-            return 
ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
 stanza,
-                    StanzaErrorType.MODIFY, "iq stanza of type set requires 
exactly one query element",
-                    getErrorLanguage(serverRuntimeContext, sessionContext), 
null);
+            return createBadRequestError(stanza, serverRuntimeContext, 
sessionContext,
+                    "iq stanza of type set requires exactly one query 
element");
+        }
+
+    }
+
+    private Stanza createBadRequestError(IQStanza stanza, ServerRuntimeContext 
serverRuntimeContext,
+            SessionContext sessionContext, String message) {
+        return 
ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
 stanza,
+                StanzaErrorType.MODIFY, "iq stanza of type set requires 
exactly one query element",
+                getErrorLanguage(serverRuntimeContext, sessionContext), null);
+    }
+
+    private Stanza changeRole(IQStanza stanza, ServerRuntimeContext 
serverRuntimeContext,
+            SessionContext sessionContext, IqAdminItem item, Room room, 
Occupant moderator, Occupant target) {
+        Role newRole = item.getRole();
+
+        // you can not change yourself
+        if (moderator.getJid().equals(target.getJid())) {
+            return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL, StanzaErrorCondition.CONFLICT);
+        }
+
+        // verify change
+        if (newRole == Role.None) {
+            // a moderator can not kick someone with a higher affiliation
+            if (target.getAffiliation().compareTo(moderator.getAffiliation()) 
< 0) {
+                return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
+                        StanzaErrorCondition.NOT_ALLOWED);
+            }
+        } else if (newRole == Role.Visitor) {
+            // moderator, admin and owner can not have their voice revoked
+            if (target.getAffiliation() == Affiliation.Admin || 
target.getAffiliation() == Affiliation.Owner) {
+                return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
+                        StanzaErrorCondition.NOT_ALLOWED);
+            }
+        } else if (newRole == Role.Participant) {
+            if (target.getRole() == Role.Moderator) {
+                // only admin and owner might revoke moderator
+                if (moderator.getAffiliation() != Affiliation.Admin && 
moderator.getAffiliation() != Affiliation.Owner) {
+                    return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
+                            StanzaErrorCondition.NOT_ALLOWED);
+                }
+                // admin and owners can not be revoked
+                if (target.getAffiliation() == Affiliation.Admin || 
target.getAffiliation() == Affiliation.Owner) {
+                    return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
+                            StanzaErrorCondition.NOT_ALLOWED);
+                }
+            }
+        } else if (newRole == Role.Moderator) {
+            // only admin and owner might grant moderator
+            if (moderator.getAffiliation() != Affiliation.Admin && 
moderator.getAffiliation() != Affiliation.Owner) {
+                return MUCHandlerHelper.createErrorReply(stanza, 
StanzaErrorType.CANCEL,
+                        StanzaErrorCondition.NOT_ALLOWED);
+            }
+        }
+
+        target.setRole(newRole);
+        if (newRole == Role.None) {
+            // remove user from room
+            room.removeOccupant(target.getJid());
+        }
+
+        Entity targetInRoom = roomAndNick(room, target);
+
+        Status status = null;
+        if (newRole == Role.None) {
+            status = new Status(StatusCode.BEEN_KICKED);
+
+            // notify user he got kicked
+            Stanza presenceToKicked = 
MUCStanzaBuilder.createPresenceStanza(targetInRoom, target.getJid(),
+                    PresenceStanzaType.UNAVAILABLE, 
NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(
+                            Affiliation.None, Role.None),
+                    // TODO handle <actor>
+                    // TODO handle <reason>
+                    status);
+
+            relayStanza(target.getJid(), presenceToKicked, 
serverRuntimeContext);
+        }
+
+        PresenceStanzaType availType = (newRole == Role.None) ? 
PresenceStanzaType.UNAVAILABLE : null;
+
+        // notify remaining users that user got role updated
+        MucUserPresenceItem presenceItem = new 
MucUserPresenceItem(target.getAffiliation(), newRole);
+        for (Occupant occupant : room.getOccupants()) {
+            Stanza presenceToRemaining = 
MUCStanzaBuilder.createPresenceStanza(targetInRoom, occupant.getJid(),
+                    availType, NamespaceURIs.XEP0045_MUC_USER, presenceItem, 
status);
+
+            relayStanza(occupant.getJid(), presenceToRemaining, 
serverRuntimeContext);
         }
 
+        return StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), 
IQStanzaType.RESULT, stanza.getID())
+                .build();
     }
 
     protected void relayStanza(Entity receiver, Stanza stanza, 
ServerRuntimeContext serverRuntimeContext) {

Modified: 
mina/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/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java?rev=980976&r1=980975&r2=980976&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
 Fri Jul 30 21:43:30 2010
@@ -103,7 +103,6 @@ public class MUCPresenceHandler extends 
         }
 
         String type = stanza.getType();
-        System.out.println("11111" + stanza);
         if (type == null) {
             return available(stanza, roomJid, occupantJid, nick, 
serverRuntimeContext);
         } else if (type.equals("unavailable")) {
@@ -132,7 +131,6 @@ public class MUCPresenceHandler extends 
 
         // TODO what to use for the room name?
         Room room = conference.findOrCreateRoom(roomJid, roomJid.getNode());
-        System.out.println(room);
 
         if (room.isInRoom(newOccupantJid)) {
             // user is already in room, change nick

Modified: 
mina/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/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java?rev=980976&r1=980975&r2=980976&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
 Fri Jul 30 21:43:30 2010
@@ -192,7 +192,7 @@ public abstract class AbstractMUCHandler
     protected void assertPresenceStanza(Stanza stanza, Entity expectedFrom, 
Entity expectedTo, String expectedType,
             MucUserPresenceItem expectedItem, StatusCode expectedStatus) 
throws Exception {
         List<MucUserPresenceItem> expectedItems = Arrays.asList(expectedItem);
-        List<StatusCode> expectedStatuses = Arrays.asList(expectedStatus);
+        List<StatusCode> expectedStatuses = expectedStatus == null ? null : 
Arrays.asList(expectedStatus);
         assertPresenceStanza(stanza, expectedFrom, expectedTo, expectedType, 
expectedItems, expectedStatuses);
     }
 
@@ -221,7 +221,6 @@ public abstract class AbstractMUCHandler
             assertEquals(expectedItem.getAffiliation().toString(), 
itemElm.getAttributeValue("affiliation"));
             assertEquals(expectedItem.getRole().toString(), 
itemElm.getAttributeValue("role"));
         }
-
         if (expectedStatuses != null) {
             for (StatusCode status : expectedStatuses) {
                 XMLElement statusElm = innerElements.next();

Added: 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java?rev=980976&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
 (added)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantModeratorTestCase.java
 Fri Jul 30 21:43:30 2010
@@ -0,0 +1,98 @@
+/*
+ *  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 static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLElementBuilder;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+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.stanzas.IqAdminItem;
+import 
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+
+/**
+ */
+public class GrantModeratorTestCase extends AbstractMUCHandlerTestCase {
+
+    public void testGrantVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occ1.setRole(Role.Moderator);
+        occ1.setAffiliation(Affiliation.Admin);
+        
+        Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occ2.setRole(Role.Participant);
+
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick 2", 
Role.Moderator)));
+        
+        assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+        assertEquals(Role.Moderator, room.findOccupantByNick("Nick 
2").getRole());
+
+        // verify that remaining users got presence
+        assertPresenceStanza(occupant2Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.None, 
Role.Moderator), null);
+        assertPresenceStanza(occupant1Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.None, 
Role.Moderator), null);
+    }
+    
+    public void testMemberAttemptGrantModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Member);
+        occupant1.setRole(Role.Moderator);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        testGrantNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+
+    private void testGrantNotAllowed(Room room, String nickToRevoke, String 
expectedError) throws ProtocolException {
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(nickToRevoke, 
Role.Moderator)));
+
+        XMLElement expectedInner = new XMLElementBuilder("query", 
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+                "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick", 
nickToRevoke).addAttribute("role", "moderator")
+                .endInnerElement().build();
+
+        assertErrorStanza(result, "iq", ROOM2_JID, OCCUPANT1_JID, "cancel", 
expectedError, expectedInner);
+
+        assertNotNull(room.findOccupantByNick("nick"));
+        assertNotNull(room.findOccupantByNick("Nick 2"));
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCIqAdminHandler(conference);
+    }
+
+}

Added: 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java?rev=980976&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
 (added)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantVoiceTestCase.java
 Fri Jul 30 21:43:30 2010
@@ -0,0 +1,71 @@
+/*
+ *  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 static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLElementBuilder;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+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.stanzas.IqAdminItem;
+import 
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+
+/**
+ */
+public class GrantVoiceTestCase extends AbstractMUCHandlerTestCase {
+
+    public void testGrantVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occ1.setRole(Role.Moderator);
+        occ1.setAffiliation(Affiliation.Member);
+        
+        Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occ2.setRole(Role.Visitor);
+
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick 2", 
Role.Participant)));
+        
+        assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+        assertEquals(Role.Participant, room.findOccupantByNick("Nick 
2").getRole());
+
+        // verify that remaining users got presence
+        assertPresenceStanza(occupant2Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.None, 
Role.Participant), null);
+        assertPresenceStanza(occupant1Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.None, 
Role.Participant), null);
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCIqAdminHandler(conference);
+    }
+
+}

Added: 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java?rev=980976&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
 (added)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeModeratorTestCase.java
 Fri Jul 30 21:43:30 2010
@@ -0,0 +1,134 @@
+/*
+ *  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 static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLElementBuilder;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+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.stanzas.IqAdminItem;
+import 
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+
+/**
+ */
+public class RevokeModeratorTestCase extends AbstractMUCHandlerTestCase {
+
+    public void testRevokeModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occ1.setRole(Role.Moderator);
+        occ1.setAffiliation(Affiliation.Admin);
+        
+        Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occ2.setRole(Role.Moderator);
+        occ2.setAffiliation(Affiliation.Member);
+
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick 2", 
Role.Participant)));
+        assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+        assertEquals(Role.Participant, room.findOccupantByNick("Nick 
2").getRole());
+
+        // verify that remaining users got presence
+        assertPresenceStanza(occupant2Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.Member, 
Role.Participant), null);
+        assertPresenceStanza(occupant1Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.Member, 
Role.Participant), null);
+    }
+
+    public void testMemberAttemptRevokeModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Member);
+        occupant1.setRole(Role.Moderator);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 2").setRole(Role.Moderator);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testAttemptRevokeOwnerModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Owner);
+        occupant1.setRole(Role.Moderator);
+
+        Occupant occupant2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occupant2.setAffiliation(Affiliation.Owner);
+        occupant2.setRole(Role.Moderator);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testAttemptRevokeAdminModerator() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Admin);
+        occupant1.setRole(Role.Moderator);
+
+        Occupant occupant2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occupant2.setAffiliation(Affiliation.Owner);
+        occupant2.setRole(Role.Moderator);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testToRevokeYourself() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setRole(Role.Moderator);
+
+        // added only for presence check later
+        room.addOccupant(OCCUPANT2_JID, "Nick 
2").setAffiliation(Affiliation.Owner);
+
+        testRevokeNotAllowed(room, "nick", "conflict");
+    }
+
+    private void testRevokeNotAllowed(Room room, String nickToRevoke, String 
expectedError) throws ProtocolException {
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(nickToRevoke, 
Role.Participant)));
+
+        XMLElement expectedInner = new XMLElementBuilder("query", 
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+                "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick", 
nickToRevoke).addAttribute("role", "participant")
+                .endInnerElement().build();
+
+        assertErrorStanza(result, "iq", ROOM2_JID, OCCUPANT1_JID, "cancel", 
expectedError, expectedInner);
+
+        assertNotNull(room.findOccupantByNick("nick"));
+        assertNotNull(room.findOccupantByNick("Nick 2"));
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCIqAdminHandler(conference);
+    }
+
+}

Added: 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java?rev=980976&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
 (added)
+++ 
mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeVoiceTestCase.java
 Fri Jul 30 21:43:30 2010
@@ -0,0 +1,131 @@
+/*
+ *  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 static org.apache.vysper.xmpp.stanza.IQStanzaType.SET;
+
+import org.apache.vysper.xml.fragment.Renderer;
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLElementBuilder;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
+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.stanzas.IqAdminItem;
+import 
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+
+/**
+ */
+public class RevokeVoiceTestCase extends AbstractMUCHandlerTestCase {
+
+    public void testRevokeVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occ1.setRole(Role.Moderator);
+        occ1.setAffiliation(Affiliation.Member);
+        
+        Occupant occ2 = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        occ2.setRole(Role.Participant);
+        occ2.setAffiliation(Affiliation.Member);
+
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem("Nick 2", 
Role.Visitor)));
+        assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+        assertEquals(Role.Visitor, room.findOccupantByNick("Nick 
2").getRole());
+
+        // verify that remaining users got presence
+        assertPresenceStanza(occupant2Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.Member, 
Role.Visitor), null);
+        assertPresenceStanza(occupant1Queue.getNext(), new 
EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID,
+                null, new MucUserPresenceItem(null, null, Affiliation.Member, 
Role.Visitor), null);
+    }
+
+    public void testMemberAttemptRevokeAdmin() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Member);
+        occupant1.setRole(Role.Moderator);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 
2").setAffiliation(Affiliation.Admin);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testMemberAttemptRevokeOwner() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Member);
+        occupant1.setRole(Role.Moderator);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 
2").setAffiliation(Affiliation.Owner);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testAdminAttemptRevokeOwner() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setAffiliation(Affiliation.Admin);
+        occupant1.setRole(Role.Moderator);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 
2").setAffiliation(Affiliation.Owner);
+
+        testRevokeNotAllowed(room, "Nick 2", "not-allowed");
+    }
+
+    public void testToKickYourself() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setRole(Role.Moderator);
+
+        // added only for presence check later
+        room.addOccupant(OCCUPANT2_JID, "Nick 
2").setAffiliation(Affiliation.Owner);
+
+        testRevokeNotAllowed(room, "nick", "conflict");
+    }
+
+    private void testRevokeNotAllowed(Room room, String nickToRevoke, String 
expectedError) throws ProtocolException {
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, 
ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(nickToRevoke, 
Role.Visitor)));
+
+        XMLElement expectedInner = new XMLElementBuilder("query", 
NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+                "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick", 
nickToRevoke).addAttribute("role", "visitor")
+                .endInnerElement().build();
+
+        assertErrorStanza(result, "iq", ROOM2_JID, OCCUPANT1_JID, "cancel", 
expectedError, expectedInner);
+
+        assertNotNull(room.findOccupantByNick("nick"));
+        assertNotNull(room.findOccupantByNick("Nick 2"));
+    }
+
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCIqAdminHandler(conference);
+    }
+
+}


Reply via email to