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/12 23:48:16 UTC

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

Author: ngn
Date: Thu Aug 12 21:48:16 2010
New Revision: 985000

URL: http://svn.apache.org/viewvc?rev=985000&view=rev
Log:
Implemented requesting and approving voice requests (VYSPER-121, VYSPER-128)

Added:
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/dataforms/
    mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/dataforms/VoiceRequestForm.java
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RequestVoiceTestCase.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/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/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCMessageHandlerTestCase.java

Added: mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/dataforms/VoiceRequestForm.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/dataforms/VoiceRequestForm.java?rev=985000&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/dataforms/VoiceRequestForm.java (added)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/dataforms/VoiceRequestForm.java Thu Aug 12 21:48:16 2010
@@ -0,0 +1,105 @@
+/*
+ *  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.dataforms;
+
+import static org.apache.vysper.xmpp.stanza.dataforms.DataForm.Type.submit;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.stanza.dataforms.DataForm;
+import org.apache.vysper.xmpp.stanza.dataforms.DataFormEncoder;
+import org.apache.vysper.xmpp.stanza.dataforms.Field;
+import org.apache.vysper.xmpp.stanza.dataforms.Field.Type;
+import static org.apache.vysper.xmpp.stanza.dataforms.Field.Type.HIDDEN;
+import static org.apache.vysper.xmpp.stanza.dataforms.Field.Type.TEXT_SINGLE;
+
+
+/**
+ * 
+ *  
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class VoiceRequestForm {
+    
+    private static final String TITLE = "Voice request";
+    private static final String INSTRUCTION = "To approve this request for voice, select " + 
+      "the \"Grant voice to this person?\" " +
+      "checkbox and click OK. To skip this request, " + 
+      "click the cancel button.";
+    
+/*
+  <x xmlns='jabber:x:data' type='form'>
+    <title>Voice request</title>
+    <instructions>
+      
+    </instructions>
+    <field var='FORM_TYPE' type='hidden'>
+        <value>http://jabber.org/protocol/muc#request</value>
+    </field>
+    <field var='muc#role'
+           type='text-single'
+           label='Requested role'>
+      <value>participant</value>
+    </field>
+    <field var='muc#jid'
+           type='text-single'
+           label='User ID'>
+      <value>hag66@shakespeare.lit/pda</value>
+    </field>
+    <field var='muc#roomnick'
+           type='text-single'
+           label='Room Nickname'>
+      <value>thirdwitch</value>
+    </field>
+    <field var='muc#request_allow'
+           type='boolean'
+           label='Grant voice to this person?'>
+      <value>false</value>
+    </field>
+  </x>
+ */
+    
+    private Entity requestor;
+    private String nick;
+    
+    public VoiceRequestForm(Entity requestor, String nick) {
+        this.requestor = requestor;
+        this.nick = nick;
+    }
+    
+    public DataForm createForm() {
+        DataForm form = new DataForm();
+        form.setType(submit);
+        form.setTitle(TITLE);
+        form.addInstruction(INSTRUCTION);
+        form.addField(new Field("FORM_TYPE", HIDDEN, null, NamespaceURIs.XEP0045_MUC_REQUEST));
+        form.addField(new Field("muc#jid", TEXT_SINGLE, "User ID", requestor.getFullQualifiedName()));
+        form.addField(new Field("muc#roomnick", TEXT_SINGLE, "Room Nickname", nick));
+        form.addField(new Field("muc#request_allow", Type.BOOLEAN, "Grant voice to this person?", "false"));
+        
+        return form;
+    }
+    
+    public XMLElement createFormXML() {
+        return new DataFormEncoder().getXML(createForm());
+    }
+}

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=985000&r1=984999&r2=985000&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 Thu Aug 12 21:48:16 2010
@@ -19,7 +19,6 @@
  */
 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;
@@ -101,7 +100,6 @@ public class MUCIqAdminHandler extends D
                     "Invalid JID");
             }
 
-
             if (item.getRole() != null) {
                 return changeRole(stanza, serverRuntimeContext, sessionContext, item, room, moderator);
             } else if(item.getAffiliation() != null) {
@@ -230,7 +228,6 @@ public class MUCIqAdminHandler extends D
 
                 relayStanza(occupant.getJid(), builder.build(), serverRuntimeContext);
             }
-            
         }
 
         return StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID())

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=985000&r1=984999&r2=985000&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 Thu Aug 12 21:48:16 2010
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.vysper.compliance.SpecCompliance;
 import org.apache.vysper.compliance.SpecCompliant;
 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;
@@ -32,10 +33,14 @@ import org.apache.vysper.xmpp.addressing
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
 import org.apache.vysper.xmpp.modules.core.base.handler.DefaultMessageHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCStanzaBuilder;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.dataforms.VoiceRequestForm;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Role;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -161,7 +166,19 @@ public class MUCMessageHandler extends D
                 Occupant sendingOccupant = room.findOccupantByJID(from);
 
                 // sender must be participant in room
-                if (roomWithNickJid.isResourceSet()) {
+                if(roomWithNickJid.equals(roomJid)) {
+                    // check x element
+                    
+                    if(stanza.getVerifier().onlySubelementEquals("x", NamespaceURIs.JABBER_X_DATA)) {
+                        // voice requests
+                        logger.debug("Received voice request for room {}", roomJid);
+                        
+                        handleVoiceRequest(from, sendingOccupant, room, stanza, serverRuntimeContext);
+                    } else if(stanza.getVerifier().onlySubelementEquals("x", NamespaceURIs.XEP0045_MUC)) {
+                        // invites/declines
+                        return handleInvites(stanza, from, sendingOccupant, room, serverRuntimeContext);
+                    }
+                } else if (roomWithNickJid.isResourceSet()) {
                     if (sendingOccupant != null) {
                         // got resource, private message for occupant
                         Occupant receivingOccupant = room.findOccupantByNick(roomWithNickJid.getResource());
@@ -188,38 +205,6 @@ public class MUCMessageHandler extends D
                         return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY,
                                 StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
                     }
-                } else {
-                    X x = X.fromStanza(stanza);
-                    if (x != null && x.getInvite() != null) {
-                        if (sendingOccupant != null) {
-                            // invite, forward modified invite
-                            try {
-                                Stanza invite = MUCHandlerHelper.createInviteMessageStanza(stanza, room.getPassword());
-                                relayStanza(invite.getTo(), invite, serverRuntimeContext);
-                            } catch (EntityFormatException e) {
-                                // invalid format of invite element
-                                return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
-                                        StanzaErrorType.MODIFY, StanzaErrorCondition.JID_MALFORMED, stanza);
-                            }
-                        } else {
-                            // user must be occupant to send invite
-                            return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
-                                    StanzaErrorType.MODIFY, StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
-                        }
-                    } else if (x != null && x.getDecline() != null) {
-                        // invite, forward modified decline
-                        try {
-                            Stanza decline = MUCHandlerHelper.createDeclineMessageStanza(stanza);
-                            relayStanza(decline.getTo(), decline, serverRuntimeContext);
-                        } catch (EntityFormatException e) {
-                            // invalid format of invite element
-                            return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
-                                    StanzaErrorType.MODIFY, StanzaErrorCondition.JID_MALFORMED, stanza);
-                        }
-                    } else {
-                        return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY,
-                                StanzaErrorCondition.UNEXPECTED_REQUEST, stanza);
-                    }
                 }
             } else {
                 return createMessageErrorStanza(moduleDomain, from, stanza.getID(), StanzaErrorType.MODIFY,
@@ -230,6 +215,94 @@ public class MUCMessageHandler extends D
         return null;
     }
 
+    private Stanza handleInvites(MessageStanza stanza, Entity from, Occupant sendingOccupant, Room room,
+            ServerRuntimeContext serverRuntimeContext) {
+        X x = X.fromStanza(stanza);
+        if (x != null && x.getInvite() != null) {
+            if (sendingOccupant != null) {
+                // invite, forward modified invite
+                try {
+                    Stanza invite = MUCHandlerHelper.createInviteMessageStanza(stanza, room.getPassword());
+                    relayStanza(invite.getTo(), invite, serverRuntimeContext);
+                } catch (EntityFormatException e) {
+                    // invalid format of invite element
+                    return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
+                            StanzaErrorType.MODIFY, StanzaErrorCondition.JID_MALFORMED, stanza);
+                }
+            } else {
+                // user must be occupant to send invite
+                return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
+                        StanzaErrorType.MODIFY, StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
+            }
+        } else if (x != null && x.getDecline() != null) {
+            // invite, forward modified decline
+            try {
+                Stanza decline = MUCHandlerHelper.createDeclineMessageStanza(stanza);
+                relayStanza(decline.getTo(), decline, serverRuntimeContext);
+            } catch (EntityFormatException e) {
+                // invalid format of invite element
+                return createMessageErrorStanza(room.getJID(), from, stanza.getID(),
+                        StanzaErrorType.MODIFY, StanzaErrorCondition.JID_MALFORMED, stanza);
+            }
+        } else {
+            return createMessageErrorStanza(room.getJID(), from, stanza.getID(), StanzaErrorType.MODIFY,
+                    StanzaErrorCondition.UNEXPECTED_REQUEST, stanza);
+        }
+        
+        return null;
+    }
+
+    private void handleVoiceRequest(Entity from, Occupant sendingOccupant, Room room, Stanza stanza,
+            ServerRuntimeContext serverRuntimeContext) {
+        List<XMLElement> dataXs = stanza.getInnerElementsNamed("x", NamespaceURIs.JABBER_X_DATA);
+        XMLElement dataX = dataXs.get(0);
+        
+        // check if "request_allow" is set
+        List<XMLElement> fields = dataX.getInnerElementsNamed("field", NamespaceURIs.JABBER_X_DATA);
+        String requestAllow = getFieldValue(fields, "muc#request_allow");
+        if("true".equals(requestAllow)) {
+            // submitted voice grant, only allowed by moderators
+            if(sendingOccupant.isModerator()) {
+                String requestNick = getFieldValue(fields, "muc#roomnick");
+                Occupant requestor = room.findOccupantByNick(requestNick);
+                requestor.setRole(Role.Participant);
+                
+                // notify remaining users that user got role updated
+                MucUserItem presenceItem = new MucUserItem(requestor.getAffiliation(), requestor.getRole());
+                for (Occupant occupant : room.getOccupants()) {
+                    Stanza presenceToRemaining = MUCStanzaBuilder.createPresenceStanza(requestor.getJidInRoom(), occupant.getJid(),
+                            null, NamespaceURIs.XEP0045_MUC_USER, presenceItem);
+
+                    relayStanza(occupant.getJid(), presenceToRemaining, serverRuntimeContext);
+                }
+            }
+        } else if(requestAllow == null) {
+            // no request allow, treat as voice request
+            VoiceRequestForm requestForm = new VoiceRequestForm(from, sendingOccupant.getNick());
+            
+            for(Occupant moderator : room.getModerators()) {
+                Stanza request = StanzaBuilder.createMessageStanza(room.getJID(), moderator.getJid(), null, null)
+                    .addPreparedElement(requestForm.createFormXML()).build();
+                
+                relayStanza(moderator.getJid(), request, serverRuntimeContext);
+            }
+        }
+    }
+    
+    private String getFieldValue(List<XMLElement> fields, String var) {
+        for(XMLElement field : fields) {
+            if(var.equals(field.getAttributeValue("var"))) {
+                try {
+                    return field.getSingleInnerElementsNamed("value", NamespaceURIs.JABBER_X_DATA).getInnerText().getText();
+                } catch (XMLSemanticError e) {
+                    return null;
+                }
+            }
+        }
+        return null;
+
+    }
+
     protected void relayStanza(Entity receiver, Stanza stanza, ServerRuntimeContext serverRuntimeContext) {
         try {
             serverRuntimeContext.getStanzaRelay().relay(receiver, stanza, new IgnoreFailureStrategy());

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=985000&r1=984999&r2=985000&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 Thu Aug 12 21:48:16 2010
@@ -20,6 +20,7 @@
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc.model;
 
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
 
 /**
  * An occupant (user) in a room
@@ -90,5 +91,9 @@ public class Occupant {
     public boolean isModerator() {
         return role == Role.Moderator;
     }
+    
+    public Entity getJidInRoom() {
+        return new EntityImpl(room.getJID(), nick);
+    }
 
 }

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=985000&r1=984999&r2=985000&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 Thu Aug 12 21:48:16 2010
@@ -143,6 +143,19 @@ public class Room implements InfoRequest
         return null;
     }
 
+    public Set<Occupant> getModerators() {
+        return getByRole(Role.Moderator);
+    }
+    
+    private Set<Occupant> getByRole(Role role) {
+        Set<Occupant> matches = new HashSet<Occupant>();
+        for (Occupant occupant : getOccupants()) {
+            if (role.equals(occupant.getRole()))
+                matches.add(occupant);
+        }
+        return matches;
+    }
+    
     public boolean isInRoom(Entity jid) {
         return findOccupantByJID(jid) != null;
     }

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=985000&r1=984999&r2=985000&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 Thu Aug 12 21:48:16 2010
@@ -46,7 +46,12 @@ public abstract class AbstractMUCMessage
         return sendMessage(from, to, type, body, null, null);
     }
 
-    protected Stanza sendMessage(Entity from, Entity to, MessageStanzaType type, String body, X x, String subject)
+    protected Stanza sendMessage(Entity from, Entity to, XMLElement x)
+    throws ProtocolException {
+        return sendMessage(from, to, null, null, x, null);
+    }
+    
+    protected Stanza sendMessage(Entity from, Entity to, MessageStanzaType type, String body, XMLElement x, String subject)
             throws ProtocolException {
         StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(from, to, type, null, body);
         if (subject != null) {

Added: mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RequestVoiceTestCase.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/RequestVoiceTestCase.java?rev=985000&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RequestVoiceTestCase.java (added)
+++ mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/RequestVoiceTestCase.java Thu Aug 12 21:48:16 2010
@@ -0,0 +1,87 @@
+/*
+ *  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.dataforms.DataForm.Type.submit;
+import static org.apache.vysper.xmpp.stanza.dataforms.Field.Type.TEXT_SINGLE;
+
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.dataforms.VoiceRequestForm;
+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.MucUserItem;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.dataforms.DataForm;
+import org.apache.vysper.xmpp.stanza.dataforms.DataFormEncoder;
+import org.apache.vysper.xmpp.stanza.dataforms.Field;
+/**
+ */
+public class RequestVoiceTestCase extends AbstractMUCMessageHandlerTestCase {
+
+    public void testRequestVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        Occupant moderator = room.addOccupant(OCCUPANT1_JID, "nick");
+        moderator.setRole(Role.Moderator);
+        
+        Occupant requestor = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        requestor.setRole(Role.Visitor);
+        
+        DataForm form = new DataForm();
+        form.setType(submit);
+        form.addField(new Field(null, null, "FORM_TYPE", NamespaceURIs.XEP0045_MUC_REQUEST));
+
+        form.addField(new Field("Requested role", TEXT_SINGLE, "muc#role", "participant"));
+
+        sendMessage(OCCUPANT2_JID, ROOM1_JID, new DataFormEncoder().getXML(form));
+
+        Stanza request = occupant1Queue.getNext();
+        assertMessageStanza(ROOM1_JID, OCCUPANT1_JID, null, new VoiceRequestForm(OCCUPANT2_JID, "Nick 2").createFormXML(), request);
+    }
+
+    public void testGrantVoice() throws Exception {
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        Occupant moderator = room.addOccupant(OCCUPANT1_JID, "nick");
+        moderator.setRole(Role.Moderator);
+        
+        Occupant requestor = room.addOccupant(OCCUPANT2_JID, "Nick 2");
+        requestor.setRole(Role.Visitor);
+        
+        DataForm form = new DataForm();
+        form.setType(submit);
+        form.addField(new Field(null, null, "FORM_TYPE", NamespaceURIs.XEP0045_MUC_REQUEST));
+        form.addField(new Field(null, null, "muc#role", "participant"));
+        form.addField(new Field(null, null, "muc#jid", OCCUPANT2_JID.getFullQualifiedName()));
+        form.addField(new Field(null, null, "muc#roomnick", "Nick 2"));
+        form.addField(new Field(null, null, "muc#request_allow", "true"));
+
+        sendMessage(OCCUPANT1_JID, ROOM1_JID, new DataFormEncoder().getXML(form));
+
+        assertEquals(Role.Participant, room.findOccupantByNick("Nick 2").getRole());
+
+        // verify that remaining users got presence
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "Nick 2"), OCCUPANT2_JID, null,
+                new MucUserItem(null, null, Affiliation.None, Role.Participant), null, occupant2Queue.getNext());
+        assertPresenceStanza(new EntityImpl(ROOM1_JID, "Nick 2"), OCCUPANT1_JID, null,
+                new MucUserItem(null, null, Affiliation.None, Role.Participant), null, occupant1Queue.getNext());
+    }
+}