Author: ngn
Date: Mon Aug 24 11:25:29 2009
New Revision: 807152
URL: http://svn.apache.org/viewvc?rev=807152&view=rev
Log:
Implement changing show and status presence (VYSPER-112)
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.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/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerEnterRoomTestCase.java
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=807152&r1=807151&r2=807152&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
Mon Aug 24 11:25:29 2009
@@ -109,16 +109,25 @@
}
+ private String getInnerElementText(XMLElement element, String childName) {
+ try {
+ XMLElement childElm =
element.getSingleInnerElementsNamed(childName);
+ if(childElm != null && childElm.getInnerText() != null) {
+ return childElm.getInnerText().getText();
+ } else {
+ return null;
+ }
+ } catch (XMLSemanticError e) {
+ return null;
+ }
+ }
+
private Stanza available(PresenceStanza stanza, Entity roomJid,
Entity newOccupantJid, String nick, SessionContext sessionContext)
{
// TODO what to use for the room name?
Room room = conference.findOrCreateRoom(roomJid, roomJid.getNode());
- if(room.isInRoom(nick)) {
- // user with this nick is already in room
- return createPresenceErrorStanza(roomJid, newOccupantJid,
stanza.getID(), "cancel", "conflict");
- }
if(room.isInRoom(newOccupantJid)) {
// user is already in room, change nick
@@ -127,8 +136,17 @@
// occupant is already in room
Occupant occupant = room.findOccupantByJID(newOccupantJid);
if(nick.equals(occupant.getName())) {
- // TODO nick unchanged, should we do anything here?
+ // nick unchanged, change show and status
+ for(Occupant receiver : room.getOccupants()) {
+ sendChangeShowStatus(occupant, receiver, room,
getInnerElementText(stanza, "show"),
+ getInnerElementText(stanza, "status"),
sessionContext);
+ }
} else {
+ if(room.isInRoom(nick)) {
+ // user with this nick is already in room
+ return createPresenceErrorStanza(roomJid, newOccupantJid,
stanza.getID(), "cancel", "conflict");
+ }
+
String oldNick = occupant.getName();
// update the nick
occupant.setName(nick);
@@ -146,6 +164,12 @@
}
} else {
logger.debug("{} has requested to enter room {}", newOccupantJid,
roomJid);
+
+ if(room.isInRoom(nick)) {
+ // user with this nick is already in room
+ return createPresenceErrorStanza(roomJid, newOccupantJid,
stanza.getID(), "cancel", "conflict");
+ }
+
// check password if password protected
if(room.isRoomType(RoomType.PasswordProtected)) {
String password = null;
@@ -297,6 +321,28 @@
logger.debug("Room presence from {} sent to {}", roomAndOldNick,
receiver);
relayStanza(receiver.getJid(), builder.getFinalStanza(),
sessionContext);
}
+
+
+ private void sendChangeShowStatus(Occupant changer, Occupant receiver,
Room room, String show, String status, SessionContext sessionContext) {
+ Entity roomAndNick = new EntityImpl(room.getJID(), changer.getName());
+
+ StanzaBuilder builder =
StanzaBuilder.createPresenceStanza(roomAndNick, receiver.getJid(), null,
+ null, show, status);
+ builder.startInnerElement("x", NamespaceURIs.XEP0045_MUC_USER);
+
+
+ boolean includeJid = includeJidInItem(room, receiver);
+ new MUCUserItem(changer).insertElement(builder, includeJid, true);
+
+// if(receiver.getJid().equals(changer.getJid())) {
+// // send status to indicate that this is the users own presence
+// new Status(StatusCode.OWN_PRESENCE).insertElement(builder);
+// }
+ builder.endInnerElement();
+
+ logger.debug("Room presence from {} sent to {}", roomAndNick,
receiver);
+ relayStanza(receiver.getJid(), builder.getFinalStanza(),
sessionContext);
+ }
private boolean includeJidInItem(Room room, Occupant receiver) {
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.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/MUCPresenceHandlerChangeStatusTestCase.java?rev=807152&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCPresenceHandlerChangeStatusTestCase.java
Mon Aug 24 11:25:29 2009
@@ -0,0 +1,111 @@
+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.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.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.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+
+/**
+ */
+public class MUCPresenceHandlerChangeStatusTestCase extends
AbstractMUCHandlerTestCase {
+
+ private Stanza changeStatus(Entity occupantJid, Entity roomWithNickJid,
String show, String status) throws ProtocolException {
+ StanzaBuilder stanzaBuilder =
StanzaBuilder.createPresenceStanza(occupantJid, roomWithNickJid, null, null,
show, status);
+
+ Stanza presenceStanza = stanzaBuilder.getFinalStanza();
+ ResponseStanzaContainer container = handler.execute(presenceStanza,
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+ if(container != null) {
+ return container.getResponseStanza();
+ } else {
+ return null;
+ }
+ }
+
+
+ @Override
+ protected StanzaHandler createHandler() {
+ return new MUCPresenceHandler(conference);
+ }
+
+ public void testChangeShowStatus() throws Exception {
+ Room room = conference.findRoom(ROOM1_JID);
+ room.addOccupant(OCCUPANT1_JID, "nick");
+ room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+ assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa",
"Gone"));
+
+ MUCUserItem item = new MUCUserItem(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);
+ }
+
+
+ public void testChangeShow() throws Exception {
+ Room room = conference.findRoom(ROOM1_JID);
+ room.addOccupant(OCCUPANT1_JID, "nick");
+ room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+ assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, "xa",
null));
+
+ MUCUserItem item = new MUCUserItem(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);
+ }
+
+
+ public void testChangeStatus() throws Exception {
+ Room room = conference.findRoom(ROOM1_JID);
+ room.addOccupant(OCCUPANT1_JID, "nick");
+ room.addOccupant(OCCUPANT2_JID, "nick 2");
+
+ assertNull(changeStatus(OCCUPANT1_JID, ROOM1_JID_WITH_NICK, null,
"Gone"));
+
+ MUCUserItem item = new MUCUserItem(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);
+ }
+
+ private void assertPresenceStanza(Stanza stanza, Entity expectedFrom,
Entity expectedTo, String expectedShow,
+ String expectedStatus,
+ MUCUserItem expectedItem) throws XMLSemanticError {
+
+ PresenceStanza presenceStanza = (PresenceStanza)
PresenceStanza.getWrapper(stanza);
+ assertNotNull(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"));
+
+ }
+
+}
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=807152&r1=807151&r2=807152&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
Mon Aug 24 11:25:29 2009
@@ -11,6 +11,8 @@
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.server.SessionContext;
+import org.apache.vysper.xmpp.server.TestSessionContext;
import org.apache.vysper.xmpp.stanza.PresenceStanza;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -28,6 +30,13 @@
}
private Stanza enterRoom(Entity occupantJid, Entity roomJid, String
password) throws ProtocolException {
+ SessionContext userSessionContext;
+ if(occupantJid.equals(OCCUPANT1_JID)) {
+ userSessionContext = sessionContext;
+ } else {
+ userSessionContext = sessionContext2;
+ }
+
StanzaBuilder stanzaBuilder =
StanzaBuilder.createPresenceStanza(occupantJid, roomJid, null, null, null,
null);
stanzaBuilder.startInnerElement("x").addNamespaceAttribute(NamespaceURIs.XEP0045_MUC);
if(password != null) {
@@ -36,14 +45,23 @@
stanzaBuilder.endInnerElement();
Stanza presenceStanza = stanzaBuilder.getFinalStanza();
- ResponseStanzaContainer container = handler.execute(presenceStanza,
sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+ ResponseStanzaContainer container = handler.execute(presenceStanza,
userSessionContext.getServerRuntimeContext(), true, userSessionContext, null);
if(container != null) {
return container.getResponseStanza();
} else {
return null;
}
}
-
+
+ protected TestSessionContext sessionContext2;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ sessionContext2 =
TestSessionContext.createWithStanzaReceiverRelayAuthenticated();
+ sessionContext2.setInitiatingEntity(OCCUPANT2_JID);
+ }
@Override
protected StanzaHandler createHandler() {