Author: ngn
Date: Fri Aug 14 11:41:32 2009
New Revision: 804170
URL: http://svn.apache.org/viewvc?rev=804170&view=rev
Log:
Implement sending message stanzas to room (VYSPER-117)
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
- copied, changed from r804134,
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
Removed:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java?rev=804170&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
Fri Aug 14 11:41:32 2009
@@ -0,0 +1,84 @@
+/*
+ * 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 java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.stanza.PresenceStanza;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+
+/**
+ *
+ *
+ * @author The Apache MINA Project ([email protected])
+ */
+public class MUCHandlerHelper {
+
+ public static boolean verifyNamespace(Stanza stanza) {
+ // either, the stanza should have a x element with the MUC namespace.
Or, no extension
+ // element at all. Else, return false
+
+ XMLElement xElement = stanza.getFirstInnerElement();
+ if(xElement != null && xElement.getName().equals("x")
+ &&
xElement.getNamespaceURI().equals(NamespaceURIs.XEP0045_MUC)) {
+ // got x element and in the correct namespace
+ return true;
+ } else if(xElement != null && xElement.getNamespaceURI() == null) {
+ // no extension namespace, ok
+ return true;
+ } else if(xElement == null) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static Stanza createErrorStanza(String stanzaName, Entity from,
Entity to, String type, String errorName, List<XMLElement> innerElements) {
+ // <presence
+ // from='[email protected]'
+ // to='[email protected]/pda'
+ // type='error'>
+ // <error type='modify'>
+ // <jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ // </error>
+ // </presence>
+
+ StanzaBuilder builder = new StanzaBuilder(stanzaName);
+ builder.addAttribute("from", from.getFullQualifiedName());
+ builder.addAttribute("to", to.getFullQualifiedName());
+ builder.addAttribute("type", "error");
+
+ if(innerElements != null) {
+ for(XMLElement innerElement : innerElements) {
+ builder.addPreparedElement(innerElement);
+ }
+ }
+
+ builder.startInnerElement("error").addAttribute("type", type);
+ builder.startInnerElement(errorName,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
+ builder.endInnerElement();
+
+ return PresenceStanza.getWrapper(builder.getFinalStanza());
+ }
+}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java?rev=804170&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
Fri Aug 14 11:41:32 2009
@@ -0,0 +1,137 @@
+/*
+ * 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 java.util.Arrays;
+import java.util.List;
+
+import org.apache.vysper.compliance.SpecCompliance;
+import org.apache.vysper.compliance.SpecCompliant;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.delivery.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.model.Conference;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Occupant;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.stanza.MessageStanza;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of <a
href="http://xmpp.org/extensions/xep-0045.html">XEP-0045 Multi-user chat</a>.
+ *
+ *
+ * @author The Apache MINA Project ([email protected])
+ */
+...@speccompliance(compliant = {
+ @SpecCompliant(spec = "xep-0045", section = "7.9", status =
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage =
SpecCompliant.ComplianceCoverage.PARTIAL),
+ @SpecCompliant(spec = "xep-0045", section = "7.9", status =
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage =
SpecCompliant.ComplianceCoverage.PARTIAL) })
+public class MUCMessageHandler extends DefaultMessageHandler {
+
+ final Logger logger = LoggerFactory.getLogger(MUCMessageHandler.class);
+
+ private Conference conference;
+
+ public MUCMessageHandler(Conference conference) {
+ this.conference = conference;
+ }
+
+ @Override
+ protected boolean verifyNamespace(Stanza stanza) {
+ return MUCHandlerHelper.verifyNamespace(stanza);
+ }
+
+ private Stanza copyMessageStanza(Entity from, Entity to, Stanza original) {
+ StanzaBuilder builder = new StanzaBuilder("message");
+ builder.addAttribute("from", from.getFullQualifiedName());
+ builder.addAttribute("to", to.getFullQualifiedName());
+
+ for(XMLElement innerElement : original.getInnerElements()) {
+ builder.addPreparedElement(innerElement);
+ }
+
+ return builder.getFinalStanza();
+ }
+
+ private Stanza createMessageErrorStanza(Entity from, Entity to, String
type, String errorName, Stanza stanza) {
+ return MUCHandlerHelper.createErrorStanza("message", from, to, type,
errorName, stanza.getInnerElements());
+ }
+
+ @Override
+ protected Stanza executeMessageLogic(MessageStanza stanza,
+ ServerRuntimeContext serverRuntimeContext,
+ SessionContext sessionContext) {
+
+ String type = stanza.getType();
+ if(type != null && type.equals("groupchat")) {
+ // groupchat, message to a room
+ Entity roomWithNickJid = stanza.getTo();
+ Room room = conference.findRoom(roomWithNickJid.getBareJID());
+ if(room != null) {
+ // sender must be participant in room
+ Entity from = stanza.getFrom();
+ Occupant sendingOccupant = room.findOccupant(from);
+
+ if(sendingOccupant != null) {
+
+ Entity roomAndSendingNick = new EntityImpl(room.getJID(),
sendingOccupant.getName());
+ if(sendingOccupant.hasVoice()) {
+ // relay message to all occupants in room
+
+ for(Occupant occupent : room.getOccupants()) {
+ relayStanza(occupent.getJid(),
+ copyMessageStanza(roomAndSendingNick,
occupent.getJid(), stanza),
+ sessionContext);
+ }
+ } else {
+ return createMessageErrorStanza(room.getJID(), from,
"modify", "forbidden", stanza);
+ }
+ } else {
+ return createMessageErrorStanza(room.getJID(), from,
"modify", "not-acceptable", stanza);
+ }
+ } else {
+ // TODO how to handle unknown room?
+ }
+ }
+
+ return null;
+
+ }
+
+ protected void relayStanza(Entity receiver, Stanza stanza,
+ SessionContext sessionContext) {
+ try {
+ sessionContext.getServerRuntimeContext().getStanzaRelay().relay(
+ receiver, stanza, new IgnoreFailureStrategy());
+ } catch (DeliveryException e) {
+ logger.warn("presence relaying failed ", e);
+ }
+ }
+}
Modified:
mina/sandbox/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/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java?rev=804170&r1=804169&r2=804170&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandler.java
Fri Aug 14 11:41:32 2009
@@ -19,6 +19,8 @@
*/
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+import java.util.Arrays;
+import java.util.List;
import java.util.Set;
import org.apache.vysper.compliance.SpecCompliant;
@@ -39,7 +41,9 @@
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.xmlfragment.Attribute;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,46 +67,16 @@
@Override
protected boolean verifyNamespace(Stanza stanza) {
- // either, the stanza should have a x element with the MUC namespace.
Or, no extension
- // element at all. Else, return false
-
- XMLElement xElement = stanza.getFirstInnerElement();
- if(xElement != null && xElement.getName().equals("x")
- &&
xElement.getNamespaceURI().equals(NamespaceURIs.XEP0045_MUC)) {
- // got x element and in the correct namespace
- return true;
- } else if(xElement != null && xElement.getNamespaceURI() == null) {
- // no extension namespace, ok
- return true;
- } else if(xElement == null) {
- return true;
- } else {
- return false;
- }
+ return MUCHandlerHelper.verifyNamespace(stanza);
}
- private Stanza sendError(Entity roomJid, Entity occupantJid, String type,
String error) {
- // <presence
- // from='[email protected]'
- // to='[email protected]/pda'
- // type='error'>
- // <error type='modify'>
- // <jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
- // </error>
- // </presence>
-
- StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomJid,
occupantJid, null,
- PresenceStanzaType.ERROR, null, null);
-
+ private Stanza createPresenceErrorStanza(Entity from, Entity to, String
type, String errorName) {
// "Note: If an error occurs in relation to joining a room, the
service SHOULD include
// the MUC child element (i.e., <x
xmlns='http://jabber.org/protocol/muc'/>) in the
// <presence/> stanza of type "error"."
- builder.startInnerElement("x",
NamespaceURIs.XEP0045_MUC).endInnerElement();
- builder.startInnerElement("error").addAttribute("type", type);
- builder.startInnerElement(error,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
- builder.endInnerElement();
-
- return PresenceStanza.getWrapper(builder.getFinalStanza());
+
+ XMLElement xElement = new XMLElement("x", NamespaceURIs.XEP0045_MUC,
(List<Attribute>)null, (List<XMLFragment>)null);
+ return MUCHandlerHelper.createErrorStanza("presence", from, to, type,
errorName, Arrays.asList(xElement));
}
@Override
@@ -117,7 +91,7 @@
// user did not send nick name
if(nick == null) {
- return sendError(roomJid, occupantJid, "modify", "jid-malformed");
+ return createPresenceErrorStanza(roomJid, occupantJid, "modify",
"jid-malformed");
}
String type = stanza.getType();
@@ -156,7 +130,7 @@
if(password == null || !password.equals(room.getPassword())) {
// password missing or not matching
- return sendError(roomJid, newOccupantJid, "auth",
"not-authorized");
+ return createPresenceErrorStanza(roomJid, newOccupantJid,
"auth", "not-authorized");
}
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java?rev=804170&r1=804169&r2=804170&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/model/Occupant.java
Fri Aug 14 11:41:32 2009
@@ -69,5 +69,9 @@
return jid;
}
+ public boolean hasVoice() {
+ return role == Role.Moderator || role == Role.Participant;
+ }
+
}
Copied:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
(from r804134,
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java)
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java?p2=mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java&p1=mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java&r1=804134&r2=804170&rev=804170&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCPresenceHandlerTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/AbstractMUCHandlerTestCase.java
Fri Aug 14 11:41:32 2009
@@ -1,5 +1,7 @@
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+import java.util.List;
+
import junit.framework.TestCase;
import org.apache.vysper.TestUtil;
@@ -7,11 +9,15 @@
import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
/**
*/
-public abstract class AbstractMUCPresenceHandlerTestCase extends TestCase {
+public abstract class AbstractMUCHandlerTestCase extends TestCase {
protected TestSessionContext sessionContext;
@@ -23,7 +29,7 @@
protected Entity occupant1Jid =
TestUtil.parseUnchecked("[email protected]");
protected Entity occupant2Jid =
TestUtil.parseUnchecked("[email protected]");
- protected MUCPresenceHandler handler;
+ protected StanzaHandler handler;
protected Conference conference = new Conference("foo");
@@ -42,6 +48,37 @@
conference.createRoom(room1Jid, "Room 1");
- handler = new MUCPresenceHandler(conference);
+ handler = createHandler();
+ }
+
+ protected abstract StanzaHandler createHandler();
+
+
+ protected void assertErrorStanza(Stanza response, String stanzaName,
Entity from, Entity to,
+ String type, String errorName, List<XMLElement>
expectedInnerElements) {
+ assertNotNull(response);
+ assertEquals(stanzaName, response.getName());
+ assertEquals(to, response.getTo());
+ assertEquals(from, response.getFrom());
+ assertEquals("error", response.getAttributeValue("type"));
+
+ List<XMLElement> innerElements = response.getInnerElements();
+
+ int index = 0;
+ if(expectedInnerElements != null) {
+ for(XMLElement expectedInnerElement : expectedInnerElements) {
+ assertEquals(expectedInnerElement, innerElements.get(index));
+ index++;
+ }
+ }
+
+ // error element must always be present
+ XMLElement errorElement = innerElements.get(index);
+ assertEquals("error", errorElement.getName());
+ assertEquals(type, errorElement.getAttributeValue("type"));
+
+ XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
+ assertEquals(errorName, jidMalformedElement.getName());
+ assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS,
jidMalformedElement.getNamespaceURI());
}
}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java?rev=804170&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
Fri Aug 14 11:41:32 2009
@@ -0,0 +1,110 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+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.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.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.xmlfragment.Attribute;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+import org.apache.vysper.xmpp.xmlfragment.XMLText;
+
+/**
+ */
+public class MUCMessageHandlerTestCase extends AbstractMUCHandlerTestCase {
+
+ private Stanza sendMessage(Entity occupantJid, Entity roomJid, String
type, String body) throws ProtocolException {
+ StanzaBuilder stanzaBuilder =
StanzaBuilder.createMessageStanza(occupantJid, roomJid, null, body);
+ if(type != null) {
+ stanzaBuilder.addAttribute("type", type);
+ }
+
+ Stanza messageStanza = stanzaBuilder.getFinalStanza();
+ ResponseStanzaContainer container = handler.execute(messageStanza,
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+ if(container != null) {
+ return container.getResponseStanza();
+ } else {
+ return null;
+ }
+ }
+
+ private void assertMessageErrorStanza(Stanza response, Entity from, Entity
to,
+ String type, String errorName, List<XMLElement>
expectedInnerElements) {
+ assertErrorStanza(response, "message", from, to, type, errorName,
expectedInnerElements);
+ }
+
+ public void testMessageWithNoVoice() throws Exception {
+ Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+ Occupant occupant = room.addOccupant(occupant1Jid, "nick");
+ // make sure the occupant has no voice
+ occupant.setRole(Role.Visitor);
+
+
+ testNotAllowedMessage(room, "forbidden");
+ }
+
+ public void testMessageUserNotOccupant() throws Exception {
+ Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+ // do not add user to room
+
+ testNotAllowedMessage(room, "not-acceptable");
+ }
+
+ private void testNotAllowedMessage(Room room, String expectedErrorName)
throws Exception {
+ String body = "Message body";
+
+
+ // now, let user 2 exit room
+ Stanza errorStanza = sendMessage(occupant1Jid, room1JidWithNick,
"groupchat", body);
+
+ XMLText text = new XMLText(body);
+ XMLElement expectedBody = new XMLElement("body", null,
(Attribute[])null, new XMLFragment[]{text});
+ assertMessageErrorStanza(errorStanza, room1Jid, occupant1Jid,
"modify", expectedErrorName, Arrays.asList(expectedBody));
+
+ // no message should be relayed
+ assertNull(occupant1Queue.getNext());
+ assertNull(occupant2Queue.getNext());
+ }
+
+ public void testMessageToRoomWithRelays() throws Exception {
+ String body = "Message body";
+
+ // add occupants to the room
+ Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+ room.addOccupant(occupant1Jid, "nick");
+ room.addOccupant(occupant2Jid, "Nick 2");
+
+ // now, let user 2 exit room
+ sendMessage(occupant1Jid, room1JidWithNick, "groupchat", body);
+
+ // verify stanzas to existing occupants on the exiting user
+ assertMessageStanza(room1JidWithNick, occupant1Jid, body,
occupant1Queue.getNext());
+ assertMessageStanza(room1JidWithNick, occupant2Jid, body,
occupant2Queue.getNext());
+ }
+
+ private void assertMessageStanza(Entity from, Entity to, String body,
Stanza stanza) throws XMLSemanticError {
+ assertEquals(from, stanza.getFrom());
+ assertEquals(to, stanza.getTo());
+
+ XMLElement bodyElement = stanza.getSingleInnerElementsNamed("body");
+ assertEquals(body, bodyElement.getInnerText().getText());
+ }
+
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCMessageHandler(conference);
+ }
+}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java?rev=804170&r1=804169&r2=804170&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
Fri Aug 14 11:41:32 2009
@@ -1,5 +1,6 @@
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+import java.util.Arrays;
import java.util.List;
import org.apache.vysper.xmpp.addressing.Entity;
@@ -7,21 +8,25 @@
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.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.PresenceStanza;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
/**
*/
-public class MUCPresenceHandlerEnterRoomTestCase extends
AbstractMUCPresenceHandlerTestCase {
+public class MUCPresenceHandlerEnterRoomTestCase extends
AbstractMUCHandlerTestCase {
- private Stanza enterRoom(Entity occupantJid, Entity roomJid) {
+ private Stanza enterRoom(Entity occupantJid, Entity roomJid) throws
ProtocolException {
return enterRoom(occupantJid, roomJid, null);
}
- private Stanza enterRoom(Entity occupantJid, Entity roomJid, String
password) {
+ private Stanza enterRoom(Entity occupantJid, Entity roomJid, String
password) throws ProtocolException {
StanzaBuilder stanzaBuilder =
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, null, null,
null);
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC);
if(password != null) {
@@ -38,7 +43,13 @@
}
}
- public void testEnterExistingRoom() {
+
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCPresenceHandler(conference);
+ }
+
+ public void testEnterExistingRoom() throws Exception {
Room room = conference.findRoom(room1Jid);
assertEquals(0, room.getOccupants().size());
@@ -51,7 +62,7 @@
assertEquals("nick", occupant.getName());
}
- public void testEnterNonExistingRoom() {
+ public void testEnterNonExistingRoom() throws Exception {
Room room = conference.findRoom(room2Jid);
assertNull(room);
@@ -66,14 +77,14 @@
assertEquals("nick", occupant.getName());
}
- public void testEnterWithoutNick() {
+ public void testEnterWithoutNick() throws Exception {
// try entering without a nick
PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid,
room1Jid);
- assertErrorStanza(response, room1Jid, occupant1Jid, "modify",
"jid-malformed");
+ assertPresenceErrorStanza(response, room1Jid, occupant1Jid, "modify",
"jid-malformed");
}
- public void testEnterWithPassword() {
+ public void testEnterWithPassword() throws Exception {
Room room = conference.createRoom(room2Jid, "Room 1",
RoomType.PasswordProtected);
room.setPassword("secret");
@@ -82,37 +93,22 @@
assertEquals(1, room.getOccupants().size());
}
- public void testEnterWithoutPassword() {
+ public void testEnterWithoutPassword() throws Exception {
Room room = conference.createRoom(room2Jid, "Room 1",
RoomType.PasswordProtected);
room.setPassword("secret");
// try entering without a password
PresenceStanza response = (PresenceStanza) enterRoom(occupant1Jid,
room2JidWithNick);
- assertErrorStanza(response, room2Jid, occupant1Jid, "auth",
"not-authorized");
+ assertPresenceErrorStanza(response, room2Jid, occupant1Jid, "auth",
"not-authorized");
}
- private void assertErrorStanza(PresenceStanza response, Entity from,
Entity to, String type, String errorName) {
- assertNotNull(response);
- assertEquals("presence", response.getName());
- assertEquals(to, response.getTo());
- assertEquals(from, response.getFrom());
- assertEquals("error", response.getType());
-
- List<XMLElement> innerElements = response.getInnerElements();
-
- XMLElement xElement = innerElements.get(0);
- assertEquals("x", xElement.getName());
- assertEquals(NamespaceURIs.XEP0045_MUC, xElement.getNamespaceURI());
-
- XMLElement errorElement = innerElements.get(1);
- assertEquals("error", errorElement.getName());
- assertEquals(type, errorElement.getAttributeValue("type"));
-
- XMLElement jidMalformedElement = errorElement.getFirstInnerElement();
- assertEquals(errorName, jidMalformedElement.getName());
- assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS,
jidMalformedElement.getNamespaceURI());
+ private void assertPresenceErrorStanza(PresenceStanza response, Entity
from, Entity to,
+ String type, String errorName) {
+ XMLElement xElement = new XMLElement("x", NamespaceURIs.XEP0045_MUC,
(Attribute[])null, (XMLFragment[])null);
+ assertErrorStanza(response, "presence", from, to, type, errorName,
Arrays.asList(xElement));
}
+
public void testEnterRoomWithRelays() throws Exception {
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java?rev=804170&r1=804169&r2=804170&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerExitRoomTestCase.java
Fri Aug 14 11:41:32 2009
@@ -7,7 +7,9 @@
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.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;
@@ -16,19 +18,15 @@
/**
*/
-public class MUCPresenceHandlerExitRoomTestCase extends
AbstractMUCPresenceHandlerTestCase {
+public class MUCPresenceHandlerExitRoomTestCase extends
AbstractMUCHandlerTestCase {
- private Stanza exitRoom(Entity occupantJid, Entity roomJid) {
+ private Stanza exitRoom(Entity occupantJid, Entity roomJid) throws
ProtocolException {
return exitRoom(occupantJid, roomJid, null);
}
- private Stanza exitRoom(Entity occupantJid, Entity roomJid, String status)
{
- StanzaBuilder stanzaBuilder =
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null,
PresenceStanzaType.UNAVAILABLE, null, null);
+ private Stanza exitRoom(Entity occupantJid, Entity roomJid, String status)
throws ProtocolException {
+ StanzaBuilder stanzaBuilder =
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null,
PresenceStanzaType.UNAVAILABLE, null, status);
- if(status != null) {
-
stanzaBuilder.startInnerElement("status").addText(status).endInnerElement();
- }
-
Stanza presenceStanza = stanzaBuilder.getFinalStanza();
ResponseStanzaContainer container = handler.execute(presenceStanza,
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
if(container != null) {
@@ -38,7 +36,12 @@
}
}
- public void testExitRoom() {
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCPresenceHandler(conference);
+ }
+
+ public void testExitRoom() throws Exception {
Room room = conference.findRoom(room1Jid);
room.addOccupant(occupant1Jid, "Nick1");
room.addOccupant(occupant2Jid, "Nick2");
@@ -51,17 +54,17 @@
assertEquals(occupant2Jid, occupant.getJid());
}
- public void testExitNonexistingRoom() {
+ public void testExitNonexistingRoom() throws Exception {
// Quietly ignore
assertNull(exitRoom(occupant1Jid, room2JidWithNick));
}
- public void testExitRoomWithoutEntering() {
+ public void testExitRoomWithoutEntering() throws Exception {
// Exit a room where the user is not a participant, quietly ignore
assertNull(exitRoom(occupant1Jid, room1JidWithNick));
}
- public void testTemporaryRoomDeleted() {
+ public void testTemporaryRoomDeleted() throws Exception {
// Room1 is temporary
Room room = conference.findRoom(room1Jid);
assertTrue(room.isRoomType(RoomType.Temporary));
@@ -73,7 +76,7 @@
}
- public void testPersistentRoomNotDeleted() {
+ public void testPersistentRoomNotDeleted() throws Exception {
// Room2 is persistent
Room room = conference.createRoom(room2Jid, "Room 2",
RoomType.Persistent);
room.addOccupant(occupant1Jid, "Nick1");