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 2010/08/08 23:10:16 UTC

svn commit: r983483 [1/2] - in /mina/vysper/trunk/server/extensions/xep0045-muc/src: main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/ main/java/org/apache/vysp...

Author: ngn
Date: Sun Aug  8 21:10:15 2010
New Revision: 983483

URL: http://svn.apache.org/viewvc?rev=983483&view=rev
Log:
Implemented change affiliation use cases (VYSPER-130, VYSPER-132, VYSPER-133, VYSPER-142, VYSPER-143, VYSPER-145, VYSPER-146)
Refactored test cases (needs more work)

Added:
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserItem.java
      - copied, changed from r958281, mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserPresenceItem.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractAffiliationTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractGrantRevokeTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/BanUserTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantAdminTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantMembershipTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/GrantOwnershipTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeAdminTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeMembershipTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RevokeOwnershipTestCase.java
Removed:
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserPresenceItem.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/MUCMessageHandler.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/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Affiliation.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessage.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/IqAdminItem.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeSubjectTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java
    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/MessageTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ModeratorKickOccupantTestCase.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
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionHistoryTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessageTestCase.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/RoomTestCase.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=983483&r1=983482&r2=983483&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 Sun Aug  8 21:10:15 2010
@@ -19,9 +19,11 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import org.apache.vysper.xml.fragment.Renderer;
 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.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
@@ -32,8 +34,9 @@ import org.apache.vysper.xmpp.modules.ex
 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.IqAdminItem;
-import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
@@ -72,7 +75,7 @@ public class MUCIqAdminHandler extends D
     }
 
     private Entity roomAndNick(Room room, Occupant occupant) {
-        return new EntityImpl(room.getJID(), occupant.getName());
+        return new EntityImpl(room.getJID(), occupant.getNick());
     }
 
     @Override
@@ -86,29 +89,31 @@ public class MUCIqAdminHandler extends D
             // only moderators are allowed to continue
             return MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN);
         }
-
         try {
             XMLElement query = stanza.getSingleInnerElementsNamed("query", NamespaceURIs.XEP0045_MUC_ADMIN);
             XMLElement itemElement = query.getSingleInnerElementsNamed("item", NamespaceURIs.XEP0045_MUC_ADMIN);
 
-            IqAdminItem item = IqAdminItem.getWrapper(itemElement);
-
-            Occupant target = null;
-            if (item.getNick() != null) {
-                target = room.findOccupantByNick(item.getNick());
-            } else {
-                return createBadRequestError(stanza, serverRuntimeContext, sessionContext, "Missing nick for item");
+            IqAdminItem item;
+            try {
+                item = IqAdminItem.getWrapper(itemElement);
+            } catch (EntityFormatException e) {
+                return createBadRequestError(stanza, serverRuntimeContext, sessionContext,
+                    "Invalid JID");
             }
 
+
             if (item.getRole() != null) {
-                return changeRole(stanza, serverRuntimeContext, sessionContext, item, room, moderator, target);
+                return changeRole(stanza, serverRuntimeContext, sessionContext, item, room, moderator);
+            } else if(item.getAffiliation() != null) {
+                return changeAffiliation(stanza, serverRuntimeContext, sessionContext, item, room, moderator);
             } else {
                 return createBadRequestError(stanza, serverRuntimeContext, sessionContext, "Unknown IQ stanza");
             }
 
         } catch (XMLSemanticError e) {
+            e.printStackTrace();
             return createBadRequestError(stanza, serverRuntimeContext, sessionContext,
-                    "iq stanza of type set requires exactly one query element");
+                    "Invalid IQ stanza");
         }
 
     }
@@ -116,12 +121,131 @@ public class MUCIqAdminHandler extends D
     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",
+                StanzaErrorType.MODIFY, message,
                 getErrorLanguage(serverRuntimeContext, sessionContext), null);
     }
+    
+    private Stanza changeAffiliation(IQStanza stanza, ServerRuntimeContext serverRuntimeContext,
+            SessionContext sessionContext, IqAdminItem item, Room room, Occupant moderator) {
+        // only allowed by admins and owners
+        if(moderator.getAffiliation() != Affiliation.Admin && moderator.getAffiliation() != Affiliation.Owner) {
+            return MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
+                    StanzaErrorCondition.NOT_ALLOWED);
+        }
+        
+        
+        Entity target = null;
+        
+        if (item.getNick() != null) {
+            target = room.findOccupantByNick(item.getNick()).getJid();
+        } else {
+            try {
+                if(item.getJid() != null) {
+                    target = item.getJid();
+                } else {
+                    return createBadRequestError(stanza, serverRuntimeContext, sessionContext, "Missing nick for item");
+                }
+            } catch (EntityFormatException e) {
+                return createBadRequestError(stanza, serverRuntimeContext, sessionContext, "Invalid JID");
+            }
+        }
+        
+        Affiliation currentAffiliation = room.getAffiliations().getAffiliation(target);
+        Affiliation newAffiliation = item.getAffiliation();
+
+        // if the target is present in the room, we need to send presence updates
+        // otherwise we should send messages
+        Occupant targetOccupant = room.findOccupantByJID(target);
+        
+        // notify remaining users that user got affiliation updated
+        PresenceStanzaType presenceType = null;
+        Status status = null;
+        Role newRole;
+        Entity from;
+        if(targetOccupant != null) {
+            newRole = targetOccupant.getRole();
+            from = roomAndNick(room, targetOccupant);
+        } else {
+            newRole = Role.None;
+            from = room.getJID();
+            
+        }
+        
+        // only owners can revoke ownership and admin
+        if((currentAffiliation == Affiliation.Owner || currentAffiliation == Affiliation.Admin) && moderator.getAffiliation() != Affiliation.Owner) {
+            return MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
+                    StanzaErrorCondition.NOT_ALLOWED);
+        }
+        
+        // if the occupant is getting revoke as a member, and this is a members-only room, he also needs to leave the room
+        if((newAffiliation == Affiliation.None && room.isRoomType(RoomType.MembersOnly)) || newAffiliation == Affiliation.Outcast) {
+            if(newAffiliation == Affiliation.Outcast && targetOccupant.getAffiliation().compareTo(moderator.getAffiliation()) < 0) {
+                return MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
+                        StanzaErrorCondition.NOT_ALLOWED);
+            }
+            
+            if(targetOccupant != null) {
+                room.removeOccupant(target);
+            }
+            presenceType = PresenceStanzaType.UNAVAILABLE;
+            
+            if(newAffiliation == Affiliation.Outcast) {
+                status = new Status(StatusCode.BEEN_BANNED);
+            } else {
+                status = new Status(StatusCode.REMOVED_BY_AFFILIATION);
+            }
+
+            newRole = Role.None;
+            
+            MucUserItem presenceItem = new MucUserItem(newAffiliation, newRole);
+
+            Stanza presenceToFormerMember = MUCStanzaBuilder.createPresenceStanza(from, targetOccupant.getJid(),
+                    presenceType, NamespaceURIs.XEP0045_MUC_USER, presenceItem, status);
+
+            relayStanza(targetOccupant.getJid(), presenceToFormerMember, serverRuntimeContext);
+        } else if(newAffiliation == Affiliation.Owner || newAffiliation == Affiliation.Admin) {
+            if(moderator.getAffiliation() != Affiliation.Owner) {
+                return MUCHandlerHelper.createErrorReply(stanza, StanzaErrorType.CANCEL,
+                        StanzaErrorCondition.NOT_ALLOWED);
+            }
+        }
+        room.getAffiliations().add(target, newAffiliation);
+            
+
+        if(targetOccupant != null) {
+            MucUserItem presenceItem = new MucUserItem(newAffiliation, newRole);
+            for (Occupant occupant : room.getOccupants()) {
+                Stanza presenceToRemaining = MUCStanzaBuilder.createPresenceStanza(from, occupant.getJid(),
+                        presenceType, NamespaceURIs.XEP0045_MUC_USER, presenceItem, status);
+
+                relayStanza(occupant.getJid(), presenceToRemaining, serverRuntimeContext);
+            }
+        } else {
+            room.getAffiliations().add(target, newAffiliation);
+            
+            MucUserItem presenceItem = new MucUserItem(target, null, newAffiliation, Role.None);
+            for (Occupant occupant : room.getOccupants()) {
+                StanzaBuilder builder = MUCStanzaBuilder.createMessageStanza(room.getJID(), occupant.getJid(), null, null);
+                builder.addPreparedElement(presenceItem);
+
+                relayStanza(occupant.getJid(), builder.build(), serverRuntimeContext);
+            }
+            
+        }
+
+        return StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID())
+                .build();
+    }
 
     private Stanza changeRole(IQStanza stanza, ServerRuntimeContext serverRuntimeContext,
-            SessionContext sessionContext, IqAdminItem item, Room room, Occupant moderator, Occupant target) {
+            SessionContext sessionContext, IqAdminItem item, Room room, Occupant moderator) {
+        Occupant target = null;
+        if (item.getNick() != null) {
+            target = room.findOccupantByNick(item.getNick());
+        } else {
+            return createBadRequestError(stanza, serverRuntimeContext, sessionContext, "Missing nick for item");
+        }
+        
         Role newRole = item.getRole();
 
         // you can not change yourself
@@ -177,7 +301,7 @@ public class MUCIqAdminHandler extends D
 
             // notify user he got kicked
             Stanza presenceToKicked = MUCStanzaBuilder.createPresenceStanza(targetInRoom, target.getJid(),
-                    PresenceStanzaType.UNAVAILABLE, NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(
+                    PresenceStanzaType.UNAVAILABLE, NamespaceURIs.XEP0045_MUC_USER, new MucUserItem(
                             Affiliation.None, Role.None),
                     // TODO handle <actor>
                     // TODO handle <reason>
@@ -189,7 +313,7 @@ public class MUCIqAdminHandler extends D
         PresenceStanzaType availType = (newRole == Role.None) ? PresenceStanzaType.UNAVAILABLE : null;
 
         // notify remaining users that user got role updated
-        MucUserPresenceItem presenceItem = new MucUserPresenceItem(target.getAffiliation(), newRole);
+        MucUserItem presenceItem = new MucUserItem(target.getAffiliation(), newRole);
         for (Occupant occupant : room.getOccupants()) {
             Stanza presenceToRemaining = MUCStanzaBuilder.createPresenceStanza(targetInRoom, occupant.getJid(),
                     availType, NamespaceURIs.XEP0045_MUC_USER, presenceItem, status);

Modified: mina/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/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java Sun Aug  8 21:10:15 2010
@@ -110,7 +110,7 @@ public class MUCMessageHandler extends D
                 // sender must be participant in room
                 if (sendingOccupant != null) {
 
-                    Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getName());
+                    Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getNick());
                     if (sendingOccupant.hasVoice()) {
                         // relay message to all occupants in room
 
@@ -169,7 +169,7 @@ public class MUCMessageHandler extends D
                         // must be sent to an existing occupant in the room
                         if (receivingOccupant != null) {
 
-                            Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getName());
+                            Entity roomAndSendingNick = new EntityImpl(room.getJID(), sendingOccupant.getNick());
                             logger.debug("Relaying message to  {}", receivingOccupant);
                             List<Attribute> replaceAttributes = new ArrayList<Attribute>();
                             replaceAttributes.add(new Attribute("from", roomAndSendingNick.getFullQualifiedName()));

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=983483&r1=983482&r2=983483&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 Sun Aug  8 21:10:15 2010
@@ -40,7 +40,7 @@ import org.apache.vysper.xmpp.modules.ex
 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.History;
-import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
@@ -138,7 +138,7 @@ public class MUCPresenceHandler extends 
 
             // occupant is already in room
             Occupant occupant = room.findOccupantByJID(newOccupantJid);
-            if (nick.equals(occupant.getName())) {
+            if (nick.equals(occupant.getNick())) {
                 // nick unchanged, change show and status
                 for (Occupant receiver : room.getOccupants()) {
                     sendChangeShowStatus(occupant, receiver, room, getInnerElementText(stanza, "show"),
@@ -150,9 +150,9 @@ public class MUCPresenceHandler extends 
                     return createPresenceErrorStanza(roomJid, newOccupantJid, stanza.getID(), "cancel", "conflict");
                 }
 
-                String oldNick = occupant.getName();
+                String oldNick = occupant.getNick();
                 // update the nick
-                occupant.setName(nick);
+                occupant.setNick(nick);
 
                 // send out unavailable presences to all existing occupants
                 for (Occupant receiver : room.getOccupants()) {
@@ -187,15 +187,11 @@ public class MUCPresenceHandler extends 
                 }
             }
 
-            Occupant newOccupant = room.addOccupant(newOccupantJid, nick);
-            if (newOccupant == null) {
-                // outcast
-                return createPresenceErrorStanza(roomJid, newOccupantJid, stanza.getID(), "auth", "forbidden");
-            }
-            if (room.isRoomType(RoomType.MembersOnly) && newOccupant.getAffiliation() == Affiliation.None) {
-                // non-member can not enter members only room
-                return createPresenceErrorStanza(roomJid, newOccupantJid, stanza.getID(), "auth",
-                        "registration-required");
+            Occupant newOccupant;
+            try {
+                newOccupant = room.addOccupant(newOccupantJid, nick);
+            } catch(RuntimeException e) {
+                return createPresenceErrorStanza(roomJid, newOccupantJid, stanza.getID(), "auth", e.getMessage());
             }
 
             // relay presence of all existing room occupants to the now joined occupant
@@ -272,9 +268,9 @@ public class MUCPresenceHandler extends 
             return;
         }
 
-        Entity roomAndOccupantNick = new EntityImpl(room.getJID(), existingOccupant.getName());
+        Entity roomAndOccupantNick = new EntityImpl(room.getJID(), existingOccupant.getNick());
         Stanza presenceToNewOccupant = MUCStanzaBuilder.createPresenceStanza(roomAndOccupantNick, newOccupant.getJid(),
-                null, NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(existingOccupant.getAffiliation(),
+                null, NamespaceURIs.XEP0045_MUC_USER, new MucUserItem(existingOccupant.getAffiliation(),
                         existingOccupant.getRole()));
 
         logger.debug("Room presence from {} sent to {}", newOccupant, roomAndOccupantNick);
@@ -283,14 +279,14 @@ public class MUCPresenceHandler extends 
 
     private void sendNewOccupantPresenceToExisting(Occupant newOccupant, Occupant existingOccupant, Room room,
             ServerRuntimeContext serverRuntimeContext) {
-        Entity roomAndNewUserNick = new EntityImpl(room.getJID(), newOccupant.getName());
+        Entity roomAndNewUserNick = new EntityImpl(room.getJID(), newOccupant.getNick());
 
         List<XMLElement> inner = new ArrayList<XMLElement>();
 
         // room is non-anonymous or semi-anonymous and the occupant a moderator, send full user JID
         boolean includeJid = room.getRoomTypes().contains(RoomType.NonAnonymous)
                 || (room.getRoomTypes().contains(RoomType.SemiAnonymous) && existingOccupant.getRole() == Role.Moderator);
-        inner.add(new MucUserPresenceItem(newOccupant, includeJid, false));
+        inner.add(new MucUserItem(newOccupant, includeJid, false));
 
         if (existingOccupant.getJid().equals(newOccupant.getJid())) {
 
@@ -317,7 +313,7 @@ public class MUCPresenceHandler extends 
         List<XMLElement> inner = new ArrayList<XMLElement>();
 
         boolean includeJid = includeJidInItem(room, receiver);
-        inner.add(new MucUserPresenceItem(changer, includeJid, true));
+        inner.add(new MucUserItem(changer, includeJid, true));
         inner.add(new Status(StatusCode.NEW_NICK));
 
         if (receiver.getJid().equals(changer.getJid())) {
@@ -333,7 +329,7 @@ public class MUCPresenceHandler extends 
 
     private void sendChangeShowStatus(Occupant changer, Occupant receiver, Room room, String show, String status,
             ServerRuntimeContext serverRuntimeContext) {
-        Entity roomAndNick = new EntityImpl(room.getJID(), changer.getName());
+        Entity roomAndNick = new EntityImpl(room.getJID(), changer.getNick());
 
         StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomAndNick, receiver.getJid(), null, null, show,
                 status);
@@ -344,7 +340,7 @@ public class MUCPresenceHandler extends 
         //            new Status(StatusCode.OWN_PRESENCE).insertElement(builder);
         //        }
 
-        builder.addPreparedElement(new X(NamespaceURIs.XEP0045_MUC_USER, new MucUserPresenceItem(changer, includeJid,
+        builder.addPreparedElement(new X(NamespaceURIs.XEP0045_MUC_USER, new MucUserItem(changer, includeJid,
                 true)));
 
         logger.debug("Room presence from {} sent to {}", roomAndNick, receiver);
@@ -359,11 +355,11 @@ public class MUCPresenceHandler extends 
 
     private void sendChangeNickAvailable(Occupant changer, Occupant receiver, Room room,
             ServerRuntimeContext serverRuntimeContext) {
-        Entity roomAndOldNick = new EntityImpl(room.getJID(), changer.getName());
+        Entity roomAndOldNick = new EntityImpl(room.getJID(), changer.getNick());
 
         List<XMLElement> inner = new ArrayList<XMLElement>();
         boolean includeJid = includeJidInItem(room, receiver);
-        inner.add(new MucUserPresenceItem(changer, includeJid, false));
+        inner.add(new MucUserItem(changer, includeJid, false));
 
         if (receiver.getJid().equals(changer.getJid())) {
             // send status to indicate that this is the users own presence
@@ -377,10 +373,10 @@ public class MUCPresenceHandler extends 
 
     private void sendExitRoomPresenceToExisting(Occupant exitingOccupant, Occupant existingOccupant, Room room,
             String statusMessage, ServerRuntimeContext serverRuntimeContext) {
-        Entity roomAndNewUserNick = new EntityImpl(room.getJID(), exitingOccupant.getName());
+        Entity roomAndNewUserNick = new EntityImpl(room.getJID(), exitingOccupant.getNick());
 
         List<XMLElement> inner = new ArrayList<XMLElement>();
-        inner.add(new MucUserPresenceItem(null, null, existingOccupant.getAffiliation(), Role.None));
+        inner.add(new MucUserItem(null, null, existingOccupant.getAffiliation(), Role.None));
 
         // is this stanza to be sent to the exiting user himself?
         boolean ownStanza = existingOccupant.getJid().equals(exitingOccupant.getJid());

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Affiliation.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/model/Affiliation.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Affiliation.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Affiliation.java Sun Aug  8 21:10:15 2010
@@ -47,7 +47,7 @@ import org.apache.vysper.compliance.Spec
 @SpecCompliant(spec = "xep-0045", section = "5.2", status = SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE)
 public enum Affiliation {
 
-    Owner, Admin, Member, Outcast, None;
+    Owner, Admin, Member, None, Outcast;
 
     public static Affiliation fromString(String s) {
         if ("owner".equals(s))
@@ -56,7 +56,7 @@ public enum Affiliation {
             return Admin;
         else if ("member".equals(s))
             return Member;
-        else if ("outcatse".equals(s))
+        else if ("outcast".equals(s))
             return Outcast;
         else if ("none".equals(s))
             return None;

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessage.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/model/DiscussionMessage.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessage.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/DiscussionMessage.java Sun Aug  8 21:10:15 2010
@@ -42,7 +42,7 @@ public class DiscussionMessage {
 
     public DiscussionMessage(Stanza stanza, Occupant from, Calendar timestamp) {
         this.message = stanza;
-        this.fromNick = from.getName();
+        this.fromNick = from.getNick();
 
         this.timestamp = (Calendar) timestamp.clone();
     }

Modified: mina/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/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java Sun Aug  8 21:10:15 2010
@@ -28,38 +28,36 @@ import org.apache.vysper.xmpp.addressing
  */
 public class Occupant {
 
-    private Affiliation affiliation;
+    private Room room;
 
     private Role role;
 
     private Entity jid;
 
-    private String name;
+    private String nick;
 
-    public Occupant(Entity jid, String name, Affiliation affiliation, Role role) {
+    public Occupant(Entity jid, String nick, Room room, Role role) {
         if (jid == null)
             throw new IllegalArgumentException("JID can not be null");
-        if (name == null)
+        if (nick == null)
             throw new IllegalArgumentException("Name can not be null");
-        if (affiliation == null)
-            throw new IllegalArgumentException("Affiliation can not be null");
+        if (room == null)
+            throw new IllegalArgumentException("Room can not be null");
         if (role == null)
             throw new IllegalArgumentException("Role can not be null");
 
         this.jid = jid;
-        this.name = name;
-        this.affiliation = affiliation;
+        this.nick = nick;
+        this.room = room;
         this.role = role;
     }
 
     public Affiliation getAffiliation() {
+        Affiliation affiliation = room.getAffiliations().getAffiliation(jid);
+        if(affiliation == null) affiliation = Affiliation.None;
         return affiliation;
     }
 
-    public void setAffiliation(Affiliation affiliation) {
-        this.affiliation = affiliation;
-    }
-
     public Role getRole() {
         return role;
     }
@@ -68,12 +66,12 @@ public class Occupant {
         this.role = role;
     }
 
-    public String getName() {
-        return name;
+    public String getNick() {
+        return nick;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setNick(String nick) {
+        this.nick = nick;
     }
 
     public Entity getJid() {

Modified: mina/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/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Room.java Sun Aug  8 21:10:15 2010
@@ -109,18 +109,21 @@ public class Room implements InfoRequest
     public Occupant addOccupant(Entity occupantJid, String name) {
         Affiliation affiliation = affiliations.getAffiliation(occupantJid);
 
+        // TODO throw a domain specific exception
         if (affiliation == Affiliation.Outcast) {
-            return null;
+            throw new RuntimeException("forbidden");
         }
 
         // default to none
-        if (affiliation == null)
+        if (affiliation == null) {
             affiliation = Affiliation.None;
-
+        }
+        
         Role role = Role.getRole(affiliation, roomTypes);
-        Occupant occupant = new Occupant(occupantJid, name, affiliation, role);
+        Occupant occupant = new Occupant(occupantJid, name, this, role);
         if (isRoomType(RoomType.MembersOnly) && affiliation == Affiliation.None) {
             // don't add non member to room
+            throw new RuntimeException("registration-required");
         } else {
             occupants.put(occupantJid, occupant);
         }
@@ -133,7 +136,7 @@ public class Room implements InfoRequest
 
     public Occupant findOccupantByNick(String nick) {
         for (Occupant occupant : getOccupants()) {
-            if (occupant.getName().equals(nick))
+            if (occupant.getNick().equals(nick))
                 return occupant;
         }
 
@@ -192,7 +195,7 @@ public class Room implements InfoRequest
             // private room, return empty list
         } else {
             for (Occupant occupant : getOccupants()) {
-                items.add(new Item(new EntityImpl(getJID(), occupant.getName())));
+                items.add(new Item(new EntityImpl(getJID(), occupant.getNick())));
             }
         }
         return items;

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/IqAdminItem.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/stanzas/IqAdminItem.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/IqAdminItem.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/IqAdminItem.java Sun Aug  8 21:10:15 2010
@@ -25,6 +25,10 @@ import java.util.List;
 import org.apache.vysper.xml.fragment.Attribute;
 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.EntityFormatException;
+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.Role;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -35,7 +39,7 @@ import org.apache.vysper.xmpp.stanza.IQS
  */
 public class IqAdminItem extends XMLElement {
 
-    public static List<IqAdminItem> extractItems(IQStanza stanza) throws XMLSemanticError {
+    public static List<IqAdminItem> extractItems(IQStanza stanza) throws XMLSemanticError, EntityFormatException {
         XMLElement query = stanza.getSingleInnerElementsNamed("query", NamespaceURIs.XEP0045_MUC_ADMIN);
         List<XMLElement> itemElms = query.getInnerElementsNamed("item", NamespaceURIs.XEP0045_MUC_ADMIN);
 
@@ -46,25 +50,61 @@ public class IqAdminItem extends XMLElem
         return items;
     }
 
-    public static IqAdminItem getWrapper(XMLElement itemElm) {
+    public static IqAdminItem getWrapper(XMLElement itemElm) throws EntityFormatException {
         String nick = itemElm.getAttributeValue("nick");
+        
+        String jidStr = itemElm.getAttributeValue("jid");
+        Entity jid = null;
+        if(jidStr != null) {
+            jid = EntityImpl.parse(jidStr); 
+        }
+       
         String roleStr = itemElm.getAttributeValue("role");
         Role role = null;
         if (roleStr != null) {
             role = Role.fromString(roleStr);
         }
 
-        return new IqAdminItem(nick, role);
+        String affiliationStr = itemElm.getAttributeValue("affiliation");
+        Affiliation affiliation = null;
+        if (affiliationStr != null) {
+            affiliation = Affiliation.fromString(affiliationStr);
+        }
+
+        return new IqAdminItem(nick, jid, role, affiliation);
     }
 
     public IqAdminItem(String nick, Role role) {
-        super(NamespaceURIs.XEP0045_MUC_ADMIN, "item", null, createAttributes(nick, role), null);
+        super(NamespaceURIs.XEP0045_MUC_ADMIN, "item", null, createAttributes(nick, null, role, null), null);
+    }
+
+    public IqAdminItem(String nick, Affiliation affiliation) {
+        super(NamespaceURIs.XEP0045_MUC_ADMIN, "item", null, createAttributes(nick, null, null, affiliation), null);
+    }
+
+    public IqAdminItem(Entity jid, Affiliation affiliation) {
+        super(NamespaceURIs.XEP0045_MUC_ADMIN, "item", null, createAttributes(null, jid, null, affiliation), null);
+    }
+
+    public IqAdminItem(String nick, Entity jid, Role role, Affiliation affiliation) {
+        super(NamespaceURIs.XEP0045_MUC_ADMIN, "item", null, createAttributes(nick, jid, role, affiliation), null);
     }
 
+    
     public String getNick() {
         return getAttributeValue("nick");
     }
 
+    public Entity getJid() throws EntityFormatException {
+        String jidStr = getAttributeValue("jid");
+        Entity jid = null;
+        if(jidStr != null) {
+            return EntityImpl.parse(jidStr); 
+        } else {
+            return null;
+        }
+    }
+
     public Role getRole() {
         String value = getAttributeValue("role");
         if (value != null) {
@@ -74,12 +114,30 @@ public class IqAdminItem extends XMLElem
         }
     }
 
-    private static List<Attribute> createAttributes(String nick, Role role) {
+    public Affiliation getAffiliation() {
+        String value = getAttributeValue("affiliation");
+        if (value != null) {
+            return Affiliation.fromString(value);
+        } else {
+            return null;
+        }
+    }
+
+    private static List<Attribute> createAttributes(String nick, Entity jid, Role role, Affiliation affiliation) {
         List<Attribute> attributes = new ArrayList<Attribute>();
-        if (nick != null)
+        if (nick != null) {
             attributes.add(new Attribute("nick", nick));
-        if (role != null)
+        }
+        if (jid != null) {
+            attributes.add(new Attribute("jid", jid.getFullQualifiedName()));
+        }
+        if (role != null) {
             attributes.add(new Attribute("role", role.toString()));
+        }
+        if (affiliation != null) {
+            attributes.add(new Attribute("affiliation", affiliation.toString()));
+        }
+        
         return attributes;
     }
 

Copied: mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserItem.java (from r958281, mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserPresenceItem.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/stanzas/MucUserItem.java?p2=mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserItem.java&p1=mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserPresenceItem.java&r1=958281&r2=983483&rev=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserPresenceItem.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/MucUserItem.java Sun Aug  8 21:10:15 2010
@@ -36,23 +36,23 @@ import org.apache.vysper.xmpp.protocol.N
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
-public class MucUserPresenceItem extends XMLElement {
+public class MucUserItem extends XMLElement {
 
-    public MucUserPresenceItem(Occupant occupant, boolean includeJid, boolean includeNick) {
+    public MucUserItem(Occupant occupant, boolean includeJid, boolean includeNick) {
         super(NamespaceURIs.XEP0045_MUC_USER, "item", null, createAttributes(occupant, includeJid, includeNick), null);
     }
 
-    public MucUserPresenceItem(Affiliation affiliation, Role role) {
+    public MucUserItem(Affiliation affiliation, Role role) {
         super(NamespaceURIs.XEP0045_MUC_USER, "item", null, createAttributes(null, null, affiliation, role), null);
     }
 
-    public MucUserPresenceItem(Entity jid, String nick, Affiliation affiliation, Role role) {
+    public MucUserItem(Entity jid, String nick, Affiliation affiliation, Role role) {
         super(NamespaceURIs.XEP0045_MUC_USER, "item", null, createAttributes(jid, nick, affiliation, role), null);
     }
 
     private static List<Attribute> createAttributes(Occupant occupant, boolean includeJid, boolean includeNick) {
         Entity jid = includeJid ? occupant.getJid() : null;
-        String nick = includeNick ? occupant.getName() : null;
+        String nick = includeNick ? occupant.getNick() : null;
 
         return createAttributes(jid, nick, occupant.getAffiliation(), occupant.getRole());
     }

Added: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractAffiliationTestCase.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/AbstractAffiliationTestCase.java?rev=983483&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractAffiliationTestCase.java (added)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractAffiliationTestCase.java Sun Aug  8 21:10:15 2010
@@ -0,0 +1,37 @@
+/*
+ *  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.modules.extension.xep0045_muc.model.Affiliation;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.IqAdminItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ProtocolException;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+
+/**
+ */
+public abstract class AbstractAffiliationTestCase extends AbstractGrantRevokeTestCase {
+
+
+}

Added: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractGrantRevokeTestCase.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/AbstractGrantRevokeTestCase.java?rev=983483&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractGrantRevokeTestCase.java (added)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractGrantRevokeTestCase.java Sun Aug  8 21:10:15 2010
@@ -0,0 +1,66 @@
+/*
+ *  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.modules.extension.xep0045_muc.model.Affiliation;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.IqAdminItem;
+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;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
+
+/**
+ */
+public abstract class AbstractGrantRevokeTestCase extends AbstractMUCHandlerTestCase {
+
+    protected void assertChangeNotAllowed(String nickToGrant, StanzaErrorCondition expectedError, Affiliation newAffiliation, Role newRole) throws ProtocolException {
+        
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(nickToGrant, null, newRole, newAffiliation)));
+
+        XMLElementBuilder builder = new XMLElementBuilder("query", NamespaceURIs.XEP0045_MUC_ADMIN).startInnerElement(
+                "item", NamespaceURIs.XEP0045_MUC_ADMIN).addAttribute("nick", nickToGrant);
+        if(newAffiliation != null) {
+            builder.addAttribute("affiliation", newAffiliation.toString());
+        }
+        if(newRole != null) {
+            builder.addAttribute("role", newRole.toString());
+        }
+        builder.endInnerElement();
+
+        XMLElement expectedInner = builder.build();
+        
+        assertErrorStanza(result, "iq", ROOM2_JID, OCCUPANT1_JID, StanzaErrorType.CANCEL, expectedError, expectedInner);
+    }
+    
+    @Override
+    protected StanzaHandler createHandler() {
+        return new MUCIqAdminHandler(conference);
+    }
+
+}

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=983483&r1=983482&r2=983483&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 Sun Aug  8 21:10:15 2010
@@ -34,7 +34,7 @@ import org.apache.vysper.xmpp.delivery.S
 import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.TestSessionContext;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
-import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
@@ -45,8 +45,11 @@ import org.apache.vysper.xmpp.stanza.IQS
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.MessageStanza;
 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.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 
 /**
  */
@@ -99,8 +102,8 @@ public abstract class AbstractMUCHandler
 
     protected abstract StanzaHandler createHandler();
 
-    protected void assertErrorStanza(Stanza response, String stanzaName, Entity from, Entity to, String type,
-            String errorName, XMLElement... expectedInnerElements) {
+    protected void assertErrorStanza(Stanza response, String stanzaName, Entity from, Entity to, StanzaErrorType type,
+            StanzaErrorCondition expectedError, XMLElement... expectedInnerElements) {
         assertNotNull(response);
         assertEquals(stanzaName, response.getName());
         assertEquals(to, response.getTo());
@@ -122,11 +125,11 @@ public abstract class AbstractMUCHandler
         // error element must always be present
         XMLElement errorElement = innerElements.get(index);
         assertEquals("error", errorElement.getName());
-        assertEquals(type, errorElement.getAttributeValue("type"));
+        assertEquals(type.value(), errorElement.getAttributeValue("type"));
 
-        XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
-        assertEquals(errorName, jidMalformedElement.getName());
-        assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, jidMalformedElement.getNamespaceURI());
+        XMLElement errorTypeElement = errorElement.getFirstInnerElement();
+        assertEquals(expectedError.value(), errorTypeElement.getName());
+        assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, errorTypeElement.getNamespaceURI());
     }
 
     protected void assertMessageStanza(Entity from, Entity to, String type, String body, Stanza stanza)
@@ -154,6 +157,31 @@ public abstract class AbstractMUCHandler
         }
     }
 
+    protected void assertMessageStanza(Entity from, Entity to, String type, XMLElement expectedInner, Stanza actual) throws XMLSemanticError {
+        assertMessageStanza(from, to, type, Arrays.asList(expectedInner), actual);
+    }
+    
+    protected void assertMessageStanza(Entity from, Entity to, String type, List<XMLElement> expectedInner, Stanza actual) throws XMLSemanticError {
+        assertNotNull(actual);
+        MessageStanza msgStanza = (MessageStanza) MessageStanza.getWrapper(actual);
+
+        assertEquals(from, actual.getFrom());
+        assertEquals(to, actual.getTo());
+        if (type != null) {
+            assertEquals(type, msgStanza.getType());
+        }
+
+        assertEquals("Length of inner elements", expectedInner.size(), actual.getInnerElements().size());
+        
+        for(int i = 0; i<expectedInner.size(); i++) {
+            assertEquals(
+                    new Renderer(expectedInner.get(i)).getComplete() 
+                    + " \n "
+                    + new Renderer(actual.getInnerElements().get(i)).getComplete(),
+                    expectedInner.get(i), actual.getInnerElements().get(i));
+        }
+    }
+    
     protected void assertIqResultStanza(Entity from, Entity to, String id, Stanza stanza) throws XMLSemanticError {
         assertNotNull(stanza);
         IQStanza iqStanza = (IQStanza) IQStanza.getWrapper(stanza);
@@ -164,51 +192,44 @@ public abstract class AbstractMUCHandler
         assertEquals("result", iqStanza.getType());
     }
 
-    protected void assertPresenceStanza(Stanza stanza, Entity expectedFrom, Entity expectedTo, String expectedShow,
-            String expectedStatus, MucUserPresenceItem expectedItem) throws XMLSemanticError, Exception {
-
-        PresenceStanza presenceStanza = (PresenceStanza) PresenceStanza.getWrapper(stanza);
-        assertNotNull("Stanza must not be null", stanza);
-        assertEquals(expectedFrom, stanza.getFrom());
-        assertEquals(expectedTo, stanza.getTo());
-        assertEquals(expectedShow, presenceStanza.getShow());
-        assertEquals(expectedStatus, presenceStanza.getStatus(null));
-
-        XMLElement xElm = stanza.getSingleInnerElementsNamed("x");
-        assertEquals(NamespaceURIs.XEP0045_MUC_USER, xElm.getNamespaceURI());
-
-        List<XMLElement> innerElements = xElm.getInnerElements();
-
-        assertEquals(1, innerElements.size());
-        XMLElement itemElm = innerElements.get(0);
-        assertEquals("item", itemElm.getName());
-        assertEquals(expectedItem.getJid().getFullQualifiedName(), itemElm.getAttributeValue("jid"));
-        assertEquals(expectedItem.getNick(), itemElm.getAttributeValue("nick"));
-        assertEquals(expectedItem.getAffiliation().toString(), itemElm.getAttributeValue("affiliation"));
-        assertEquals(expectedItem.getRole().toString(), itemElm.getAttributeValue("role"));
-
-    }
-
-    protected void assertPresenceStanza(Stanza stanza, Entity expectedFrom, Entity expectedTo, String expectedType,
-            MucUserPresenceItem expectedItem, StatusCode expectedStatus) throws Exception {
-        List<MucUserPresenceItem> expectedItems = Arrays.asList(expectedItem);
+    protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType, MucUserItem expectedItem,
+            StatusCode expectedStatus, Stanza actualStanza) throws Exception {
+        List<MucUserItem> expectedItems = Arrays.asList(expectedItem);
         List<StatusCode> expectedStatuses = expectedStatus == null ? null : Arrays.asList(expectedStatus);
-        assertPresenceStanza(stanza, expectedFrom, expectedTo, expectedType, expectedItems, expectedStatuses);
+        assertPresenceStanza(expectedFrom, expectedTo, expectedType, expectedItems, expectedStatuses, actualStanza);
     }
 
-    protected void assertPresenceStanza(Stanza stanza, Entity expectedFrom, Entity expectedTo, String expectedType,
-            List<MucUserPresenceItem> expectedItems, List<StatusCode> expectedStatuses) throws Exception {
-
-        assertNotNull(stanza);
-        assertEquals(expectedFrom, stanza.getFrom());
-        assertEquals(expectedTo, stanza.getTo());
-        assertEquals(expectedType, stanza.getAttributeValue("type"));
+    protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType, 
+            List<MucUserItem> expectedMucItems,
+            List<StatusCode> expectedMucStatuses, Stanza actualStanza) throws Exception {
+        assertPresenceStanza(expectedFrom, expectedTo, expectedType, null, null, expectedMucItems, expectedMucStatuses, actualStanza);
+    }
+    
+    protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType, 
+            String expectedShow, String expectedStatus,  
+            List<MucUserItem> expectedMucItems, List<StatusCode> expectedMucStatuses, 
+            Stanza actualStanza) throws Exception {
+
+        PresenceStanza actualPresenceStanza = (PresenceStanza) PresenceStanza.getWrapper(actualStanza);
+        
+        assertNotNull(actualStanza);
+        assertEquals(expectedFrom, actualStanza.getFrom());
+        assertEquals(expectedTo, actualStanza.getTo());
+        
+        if(expectedType != null) {
+            assertEquals(expectedType.value(), actualStanza.getAttributeValue("type"));
+        } else {
+            assertEquals(null, actualStanza.getAttributeValue("type"));
+        }
+        
+        assertEquals(expectedShow, actualPresenceStanza.getShow());
+        assertEquals(expectedStatus, actualPresenceStanza.getStatus(null));
 
-        XMLElement xElm = stanza.getFirstInnerElement();
-        assertEquals(NamespaceURIs.XEP0045_MUC_USER, xElm.getNamespaceURI());
+        XMLElement xElm = actualStanza.getSingleInnerElementsNamed("x", NamespaceURIs.XEP0045_MUC_USER);
+        assertNotNull(xElm);
 
         Iterator<XMLElement> innerElements = xElm.getInnerElements().iterator();
-        for (MucUserPresenceItem expectedItem : expectedItems) {
+        for (MucUserItem expectedItem : expectedMucItems) {
             XMLElement itemElm = innerElements.next();
 
             assertEquals("item", itemElm.getName());
@@ -221,8 +242,8 @@ 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) {
+        if (expectedMucStatuses != null) {
+            for (StatusCode status : expectedMucStatuses) {
                 XMLElement statusElm = innerElements.next();
 
                 assertEquals("status", statusElm.getName());

Modified: mina/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/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java Sun Aug  8 21:10:15 2010
@@ -33,6 +33,8 @@ import org.apache.vysper.xmpp.protocol.S
 import org.apache.vysper.xmpp.stanza.MessageStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 
 /**
  */
@@ -64,19 +66,20 @@ public abstract class AbstractMUCMessage
         }
     }
 
-    protected void assertMessageErrorStanza(Stanza response, Entity from, Entity to, String type, String errorName,
+    protected void assertMessageErrorStanza(Stanza actualResponse, Entity expectedFrom, Entity expectedTo, 
+            StanzaErrorType expectedErrorType, StanzaErrorCondition expectedErrorName,
             XMLElement... expectedInnerElements) {
-        assertErrorStanza(response, "message", from, to, type, errorName, expectedInnerElements);
+        assertErrorStanza(actualResponse, "message", expectedFrom, expectedTo, expectedErrorType, expectedErrorName, expectedInnerElements);
     }
 
-    protected void testNotAllowedMessage(Room room, String expectedErrorName) throws Exception {
+    protected void testNotAllowedMessage(Room room, StanzaErrorCondition expectedErrorName) throws Exception {
         String body = "Message body";
 
         // now, let user 2 exit room
         Stanza errorStanza = sendMessage(OCCUPANT1_JID, ROOM1_JID, GROUPCHAT, body);
 
         XMLElement expectedBody = new XMLElementBuilder("body").addText(body).build();
-        assertMessageErrorStanza(errorStanza, ROOM1_JID, OCCUPANT1_JID, "modify", expectedErrorName, expectedBody);
+        assertMessageErrorStanza(errorStanza, ROOM1_JID, OCCUPANT1_JID, StanzaErrorType.MODIFY, expectedErrorName, expectedBody);
 
         // no message should be relayed
         assertNull(occupant1Queue.getNext());

Added: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/BanUserTestCase.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/BanUserTestCase.java?rev=983483&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/BanUserTestCase.java (added)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/BanUserTestCase.java Sun Aug  8 21:10:15 2010
@@ -0,0 +1,92 @@
+/*
+ *  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.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.MucUserItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+
+/**
+ */
+public class BanUserTestCase extends AbstractAffiliationTestCase {
+
+    public void testBanUser() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occ1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occ1.setRole(Role.Moderator);
+        room.getAffiliations().add(OCCUPANT1_JID, Affiliation.Admin);
+        
+        room.getAffiliations().add(OCCUPANT2_JID, Affiliation.Member);
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        
+        // send message to room
+        IQStanza result = (IQStanza) IQStanza.getWrapper(sendIq(OCCUPANT1_JID, ROOM2_JID, SET, "id1",
+                NamespaceURIs.XEP0045_MUC_ADMIN, new IqAdminItem(OCCUPANT2_JID, Affiliation.Outcast)));
+        
+        assertIqResultStanza(ROOM2_JID, OCCUPANT1_JID, "id1", result);
+
+        assertNull(room.findOccupantByNick("Nick 2"));
+        assertEquals(Affiliation.Outcast, room.getAffiliations().getAffiliation(OCCUPANT2_JID));
+
+        // banned user is notified
+        assertPresenceStanza(new EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT2_JID, PresenceStanzaType.UNAVAILABLE,
+                new MucUserItem(null, null, Affiliation.Outcast, Role.None), StatusCode.BEEN_BANNED, occupant2Queue.getNext());
+        
+        // verify that remaining users got message
+        // must be sent from the room
+        assertPresenceStanza(new EntityImpl(ROOM2_JID, "Nick 2"), OCCUPANT1_JID, PresenceStanzaType.UNAVAILABLE,
+                new MucUserItem(null, null, Affiliation.Outcast, Role.None), StatusCode.BEEN_BANNED, occupant1Queue.getNext());
+    }
+
+    public void testNonAdmin() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setRole(Role.Moderator);
+        room.getAffiliations().add(OCCUPANT1_JID, Affiliation.Member);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        assertChangeNotAllowed("Nick 2", StanzaErrorCondition.NOT_ALLOWED, Affiliation.None, null);
+    }
+
+    public void testAdminBanningOwner() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM2_JID, "Room 2");
+        Occupant occupant1 = room.addOccupant(OCCUPANT1_JID, "nick");
+        occupant1.setRole(Role.Moderator);
+        room.getAffiliations().add(OCCUPANT1_JID, Affiliation.Admin);
+
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        room.getAffiliations().add(OCCUPANT2_JID, Affiliation.Owner);
+
+        assertChangeNotAllowed("Nick 2", StanzaErrorCondition.NOT_ALLOWED, Affiliation.Outcast, null);
+    }
+
+}

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.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/ChangeNickTestCase.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeNickTestCase.java Sun Aug  8 21:10:15 2010
@@ -27,12 +27,13 @@ import org.apache.vysper.xmpp.modules.ex
 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.MucUserPresenceItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
 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;
 
@@ -69,21 +70,21 @@ public class ChangeNickTestCase extends 
         changeNick(OCCUPANT1_JID, new EntityImpl(ROOM1_JID, "new nick"));
 
         Occupant occupant = room.findOccupantByJID(OCCUPANT1_JID);
-        assertEquals("new nick", occupant.getName());
+        assertEquals("new nick", occupant.getNick());
 
-        MucUserPresenceItem unavailbleItem = new MucUserPresenceItem(OCCUPANT1_JID, "new nick", Affiliation.None,
+        MucUserItem unavailbleItem = new MucUserItem(OCCUPANT1_JID, "new nick", Affiliation.None,
                 Role.Participant);
-        assertPresenceStanza(occupant1Queue.getNext(), new EntityImpl(ROOM1_JID, "nick"), OCCUPANT1_JID, "unavailable",
-                Arrays.asList(unavailbleItem), Arrays.asList(StatusCode.NEW_NICK, StatusCode.OWN_PRESENCE));
-        assertPresenceStanza(occupant2Queue.getNext(), new EntityImpl(ROOM1_JID, "nick"), OCCUPANT2_JID, "unavailable",
-                Arrays.asList(unavailbleItem), Arrays.asList(StatusCode.NEW_NICK));
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "nick"), OCCUPANT1_JID, PresenceStanzaType.UNAVAILABLE, Arrays.asList(unavailbleItem),
+                Arrays.asList(StatusCode.NEW_NICK, StatusCode.OWN_PRESENCE), occupant1Queue.getNext());
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "nick"), OCCUPANT2_JID, PresenceStanzaType.UNAVAILABLE, Arrays.asList(unavailbleItem),
+                Arrays.asList(StatusCode.NEW_NICK), occupant2Queue.getNext());
 
-        MucUserPresenceItem availbleItem = new MucUserPresenceItem(OCCUPANT1_JID, null, Affiliation.None,
+        MucUserItem availbleItem = new MucUserItem(OCCUPANT1_JID, null, Affiliation.None,
                 Role.Participant);
-        assertPresenceStanza(occupant1Queue.getNext(), new EntityImpl(ROOM1_JID, "new nick"), OCCUPANT1_JID, null,
-                Arrays.asList(availbleItem), Arrays.asList(StatusCode.OWN_PRESENCE));
-        assertPresenceStanza(occupant2Queue.getNext(), new EntityImpl(ROOM1_JID, "new nick"), OCCUPANT2_JID, null,
-                Arrays.asList(availbleItem), null);
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "new nick"), OCCUPANT1_JID, null, Arrays.asList(availbleItem),
+                Arrays.asList(StatusCode.OWN_PRESENCE), occupant1Queue.getNext());
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "new nick"), OCCUPANT2_JID, null, Arrays.asList(availbleItem),
+                null, occupant2Queue.getNext());
     }
 
     public void testChangeNickWithDuplicateNick() throws Exception {

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.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/ChangeStatusTestCase.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeStatusTestCase.java Sun Aug  8 21:10:15 2010
@@ -19,11 +19,14 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
 
+import java.util.Arrays;
+
+import org.apache.vysper.xml.fragment.XMLSemanticError;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
-import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserPresenceItem;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -61,9 +64,9 @@ public class ChangeStatusTestCase extend
 
         assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa", "Gone"));
 
-        MucUserPresenceItem item = new MucUserPresenceItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
-        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT1_JID, "xa", "Gone", item);
-        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "xa", "Gone", item);
+        MucUserItem item = new MucUserItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT1_JID, "xa", "Gone", item, occupant1Queue.getNext());
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "xa", "Gone", item, occupant2Queue.getNext());
     }
 
     public void testChangeShow() throws Exception {
@@ -73,9 +76,9 @@ public class ChangeStatusTestCase extend
 
         assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa", null));
 
-        MucUserPresenceItem item = new MucUserPresenceItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
-        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT1_JID, "xa", null, item);
-        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "xa", null, item);
+        MucUserItem item = new MucUserItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT1_JID, "xa", null, item, occupant1Queue.getNext());
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT2_JID, "xa", null, item, occupant2Queue.getNext());
     }
 
     public void testChangeStatus() throws Exception {
@@ -85,9 +88,15 @@ public class ChangeStatusTestCase extend
 
         assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, null, "Gone"));
 
-        MucUserPresenceItem item = new MucUserPresenceItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
-        assertPresenceStanza(occupant1Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT1_JID, null, "Gone", item);
-        assertPresenceStanza(occupant2Queue.getNext(), ROOM1_JID_WITH_NICK, OCCUPANT2_JID, null, "Gone", item);
+        MucUserItem item = new MucUserItem(OCCUPANT1_JID, "nick", Affiliation.None, Role.Participant);
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT1_JID, null, "Gone", item, occupant1Queue.getNext());
+        assertPresenceStanza(ROOM1_JID_WITH_NICK, OCCUPANT2_JID, null, "Gone", item, occupant2Queue.getNext());
     }
 
+    private void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, String expectedShow, String expectedStatus,
+            MucUserItem expectedItem, Stanza actualStanza) throws XMLSemanticError, Exception {
+
+        assertPresenceStanza(expectedFrom, expectedTo, null, expectedShow, expectedStatus, 
+                Arrays.asList(expectedItem), null, actualStanza);
+    }
 }

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeSubjectTestCase.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/ChangeSubjectTestCase.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeSubjectTestCase.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/ChangeSubjectTestCase.java Sun Aug  8 21:10:15 2010
@@ -26,6 +26,8 @@ import org.apache.vysper.xmpp.modules.ex
 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.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 
 /**
  */
@@ -71,7 +73,7 @@ public class ChangeSubjectTestCase exten
         // send message to room
         Stanza error = sendMessage(OCCUPANT1_JID, ROOM2_JID, GROUPCHAT, null, null, SUBJECT);
 
-        assertMessageErrorStanza(error, ROOM2_JID, OCCUPANT1_JID, "auth", "forbidden", new XMLElementBuilder("subject")
+        assertMessageErrorStanza(error, ROOM2_JID, OCCUPANT1_JID, StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN, new XMLElementBuilder("subject")
                 .addText(SUBJECT).build());
 
         assertNull(occupant1Queue.getNext());

Modified: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.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/EnterRoomTestCase.java?rev=983483&r1=983482&r2=983483&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java (original)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/EnterRoomTestCase.java Sun Aug  8 21:10:15 2010
@@ -43,6 +43,8 @@ import org.apache.vysper.xmpp.stanza.Mes
 import org.apache.vysper.xmpp.stanza.MessageStanzaType;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 
 /**
  */
@@ -107,7 +109,7 @@ public class EnterRoomTestCase extends A
         Occupant occupant = room.getOccupants().iterator().next();
 
         assertEquals(OCCUPANT1_JID, occupant.getJid());
-        assertEquals("nick", occupant.getName());
+        assertEquals("nick", occupant.getNick());
     }
 
     public void testEnterWithGroupchatProtocol() throws Exception {
@@ -121,7 +123,7 @@ public class EnterRoomTestCase extends A
         Occupant occupant = room.getOccupants().iterator().next();
 
         assertEquals(OCCUPANT1_JID, occupant.getJid());
-        assertEquals("nick", occupant.getName());
+        assertEquals("nick", occupant.getNick());
     }
 
     public void testEnterAsAdmin() throws Exception {
@@ -140,7 +142,7 @@ public class EnterRoomTestCase extends A
         room.getAffiliations().add(OCCUPANT1_JID, Affiliation.Outcast);
 
         Stanza error = enterRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK);
-        assertPresenceErrorStanza(error, ROOM1_JID, OCCUPANT1_JID, "auth", "forbidden");
+        assertPresenceErrorStanza(error, ROOM1_JID, OCCUPANT1_JID, StanzaErrorType.AUTH, StanzaErrorCondition.FORBIDDEN);
 
         assertEquals(0, room.getOccupants().size());
     }
@@ -149,7 +151,7 @@ public class EnterRoomTestCase extends A
         Room room = conference.createRoom(ROOM2_JID, "Room", RoomType.MembersOnly);
 
         Stanza error = enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK);
-        assertPresenceErrorStanza(error, ROOM2_JID, OCCUPANT1_JID, "auth", "registration-required");
+        assertPresenceErrorStanza(error, ROOM2_JID, OCCUPANT1_JID, StanzaErrorType.AUTH, StanzaErrorCondition.REGISTRATION_REQUIRED);
 
         assertEquals(0, room.getOccupants().size());
     }
@@ -173,14 +175,14 @@ public class EnterRoomTestCase extends A
         Occupant occupant = room.getOccupants().iterator().next();
 
         assertEquals(OCCUPANT1_JID, occupant.getJid());
-        assertEquals("nick", occupant.getName());
+        assertEquals("nick", occupant.getNick());
     }
 
     public void testEnterWithoutNick() throws Exception {
         // try entering without a nick
         Stanza response = enterRoom(OCCUPANT1_JID, ROOM1_JID);
 
-        assertPresenceErrorStanza(response, ROOM1_JID, OCCUPANT1_JID, "modify", "jid-malformed");
+        assertPresenceErrorStanza(response, ROOM1_JID, OCCUPANT1_JID, StanzaErrorType.MODIFY, StanzaErrorCondition.JID_MALFORMED);
     }
 
     public void testEnterWithPassword() throws Exception {
@@ -199,10 +201,10 @@ public class EnterRoomTestCase extends A
         // try entering without a password
         Stanza response = enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK);
 
-        assertPresenceErrorStanza(response, ROOM2_JID, OCCUPANT1_JID, "auth", "not-authorized");
+        assertPresenceErrorStanza(response, ROOM2_JID, OCCUPANT1_JID, StanzaErrorType.AUTH, StanzaErrorCondition.NOT_AUTHORIZED);
     }
 
-    private void assertPresenceErrorStanza(Stanza response, Entity from, Entity to, String type, String errorName) {
+    private void assertPresenceErrorStanza(Stanza response, Entity from, Entity to, StanzaErrorType type, StanzaErrorCondition errorName) {
         XMLElement xElement = new XMLElementBuilder("x", NamespaceURIs.XEP0045_MUC).build();
         assertErrorStanza(response, "presence", from, to, type, errorName, xElement);
     }
@@ -257,13 +259,13 @@ public class EnterRoomTestCase extends A
         Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
         room.getHistory().append(
                 StanzaBuilder.createMessageStanza(OCCUPANT2_JID, ROOM1_JID, MessageStanzaType.GROUPCHAT, null, "Body")
-                        .build(), new Occupant(OCCUPANT2_JID, "nick2", Affiliation.None, Role.Participant));
+                        .build(), new Occupant(OCCUPANT2_JID, "nick2", room, Role.Participant));
         room.getHistory().append(
                 StanzaBuilder.createMessageStanza(OCCUPANT2_JID, ROOM1_JID, MessageStanzaType.GROUPCHAT, null, "Body2")
-                        .build(), new Occupant(OCCUPANT2_JID, "nick2", Affiliation.None, Role.Participant));
+                        .build(), new Occupant(OCCUPANT2_JID, "nick2", room, Role.Participant));
         room.getHistory().append(
                 StanzaBuilder.createMessageStanza(OCCUPANT2_JID, ROOM1_JID, MessageStanzaType.GROUPCHAT, null, "Body3")
-                        .build(), new Occupant(OCCUPANT2_JID, "nick2", Affiliation.None, Role.Participant));
+                        .build(), new Occupant(OCCUPANT2_JID, "nick2", room, Role.Participant));
 
         // now, let user 1 enter room
         enterRoom(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, null, new History(2, null, null, null), false);