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());
+ }
+}