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 2009/08/14 11:34:44 UTC
svn commit: r804139 - in
/mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src:
main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/
test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/
Author: ngn
Date: Fri Aug 14 09:34:43 2009
New Revision: 804139
URL: http://svn.apache.org/viewvc?rev=804139&view=rev
Log:
Implement status messages when exiting room (VYSPER-110)
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/MUCPresenceHandlerExitRoomTestCase.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=804139&r1=804138&r2=804139&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 09:34:43 2009
@@ -188,10 +188,20 @@
Set<Occupant> allOccupants = room.getOccupants();
room.removeOccupant(occupantJid);
+
+ String statusMessage = null;
+ try {
+ XMLElement statusElement = stanza.getSingleInnerElementsNamed("status");
+ if(statusElement != null && statusElement.getInnerText() != null) {
+ statusMessage = statusElement.getInnerText().getText();
+ }
+ } catch (XMLSemanticError e) {
+ // ignore, status element did not exist
+ }
// relay presence of the newly added occupant to all existing occupants
for(Occupant occupant : allOccupants) {
- sendExitRoomPresenceToExisting(exitingOccupant, occupant, room, sessionContext);
+ sendExitRoomPresenceToExisting(exitingOccupant, occupant, room, statusMessage, sessionContext);
}
if(room.isRoomType(RoomType.Temporary) && room.isEmpty()) {
@@ -263,7 +273,8 @@
relayStanza(existingOccupant.getJid(), builder.getFinalStanza(), sessionContext);
}
- private void sendExitRoomPresenceToExisting(Occupant exitingOccupant, Occupant existingOccupant, Room room, SessionContext sessionContext) {
+ private void sendExitRoomPresenceToExisting(Occupant exitingOccupant, Occupant existingOccupant, Room room,
+ String statusMessage, SessionContext sessionContext) {
Entity roomAndNewUserNick = new EntityImpl(room.getJID(), exitingOccupant.getName());
StanzaBuilder builder = StanzaBuilder.createPresenceStanza(roomAndNewUserNick, existingOccupant.getJid(), null,
@@ -276,9 +287,21 @@
builder.endInnerElement();
- if(existingOccupant.getJid().equals(exitingOccupant.getJid())) {
- // send status to indicate that this is the users own presence
- builder.startInnerElement("status").addAttribute("code", "110").endInnerElement();
+ // is this stanza to be sent to the exiting user himself?
+ boolean ownStanza = existingOccupant.getJid().equals(exitingOccupant.getJid());
+
+ if(ownStanza || statusMessage != null) {
+ builder.startInnerElement("status");
+
+ if(ownStanza) {
+ // send status to indicate that this is the users own presence
+ builder.addAttribute("code", "110");
+ }
+ if(statusMessage != null) {
+ builder.addText(statusMessage);
+ }
+
+ builder.endInnerElement();
}
builder.endInnerElement();
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=804139&r1=804138&r2=804139&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 09:34:43 2009
@@ -19,8 +19,16 @@
public class MUCPresenceHandlerExitRoomTestCase extends AbstractMUCPresenceHandlerTestCase {
private Stanza exitRoom(Entity occupantJid, Entity roomJid) {
+ 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);
+ 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) {
@@ -85,12 +93,27 @@
exitRoom(occupant2Jid, room1JidWithNick);
// verify stanzas to existing occupants on the exiting user
- assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), false);
- assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), true);
+ assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), null, false);
+ assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), null, true);
+ }
+
+ public void testExitRoomWithRelaysWithStatus() throws Exception {
+ String statusMessage = "Custom status";
+
+ // add occupants to the room
+ Room room = conference.findOrCreateRoom(room1Jid, "Room 1");
+ room.addOccupant(occupant1Jid, "Nick 1");
+ room.addOccupant(occupant2Jid, "Nick 2");
+
+ // now, let user 2 exit room
+ exitRoom(occupant2Jid, room1JidWithNick, statusMessage);
+ // verify stanzas to existing occupants on the exiting user
+ assertExitPresenceStanza(room1Jid, "Nick 2", occupant1Jid, occupant1Queue.getNext(), statusMessage, false);
+ assertExitPresenceStanza(room1Jid, "Nick 2", occupant2Jid, occupant2Queue.getNext(), statusMessage, true);
}
- private void assertExitPresenceStanza(Entity roomJid, String nick, Entity to, Stanza stanza, boolean own) throws XMLSemanticError {
+ private void assertExitPresenceStanza(Entity roomJid, String nick, Entity to, Stanza stanza, String expectedStatus, boolean own) throws XMLSemanticError {
// should be from room + nick name
assertEquals(roomJid.getFullQualifiedName() + "/" + nick, stanza.getFrom().getFullQualifiedName());
// should be to the existing user
@@ -111,5 +134,12 @@
assertEquals(1, statuses.size());
assertEquals("110", statuses.get(0).getAttributeValue("code"));
}
+
+ if(expectedStatus != null) {
+ List<XMLElement> statuses = xElement.getInnerElementsNamed("status");
+ assertEquals(1, statuses.size());
+ assertEquals(expectedStatus, statuses.get(0).getInnerText().getText());
+
+ }
}
}