Author: ngn
Date: Mon Aug 10 14:46:44 2009
New Revision: 802813
URL: http://svn.apache.org/viewvc?rev=802813&view=rev
Log:
Support for sending extra information for non-anonymous and semi-anonymous
rooms on entering (VYSPER-109)
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.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/MUCEnterRoomHandler.java?rev=802813&r1=802812&r2=802813&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandler.java
Mon Aug 10 14:46:44 2009
@@ -27,7 +27,9 @@
import org.apache.vysper.xmpp.modules.core.base.handler.DefaultPresenceHandler;
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.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
@@ -112,7 +114,7 @@
// relay presence of the newly added occupant to all existing occupants
for(Occupant occupant : room.getOccupants()) {
- sendNewOccupantPresence(newOccupant, occupant, room,
sessionContext);
+ sendNewOccupantPresenceToExisting(newOccupant, occupant, room,
sessionContext);
}
return null;
@@ -144,17 +146,32 @@
relayStanza(newOccupant.getJid(), builder.getFinalStanza(),
sessionContext);
}
- private void sendNewOccupantPresence(Occupant newOccupant, Occupant
existingOccupant, Room room, SessionContext sessionContext) {
+ private void sendNewOccupantPresenceToExisting(Occupant newOccupant,
Occupant existingOccupant, Room room, SessionContext sessionContext) {
Entity roomAndNewUserNick = new EntityImpl(room.getJID(),
newOccupant.getName());
StanzaBuilder builder =
StanzaBuilder.createPresenceStanza(roomAndNewUserNick,
existingOccupant.getJid(), null, null, null, null);
builder.startInnerElement("x", NamespaceURIs.XEP0045_MUC_USER);
builder.startInnerElement("item")
.addAttribute("affiliation",
newOccupant.getAffiliation().toString())
- .addAttribute("role", newOccupant.getRole().toString())
- .endInnerElement();
+ .addAttribute("role", newOccupant.getRole().toString());
+
+ // section 7.1.5
+ if(room.getRoomTypes().contains(RoomType.NonAnonymous) ||
+ (room.getRoomTypes().contains(RoomType.SemiAnonymous) &&
existingOccupant.getRole() == Role.Moderator)) {
+ // room is non-anonymous or semi-anonmoys and the occupant a
moderator, send full user JID
+ builder.addAttribute("jid",
newOccupant.getJid().getFullQualifiedName());
+ // TODO unit test for semi + moderator
+ }
+
+ builder.endInnerElement();
if(existingOccupant.getJid().equals(newOccupant.getJid())) {
+
+ if(room.getRoomTypes().contains(RoomType.NonAnonymous)) {
+ // notify the user that this is a non-anonymous room
+ builder.startInnerElement("status").addAttribute("code",
"100").endInnerElement();
+ }
+
// send status to indicate that this is the users own presence
builder.startInnerElement("status").addAttribute("code",
"110").endInnerElement();
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.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/MUCEnterRoomHandlerTestCase.java?rev=802813&r1=802812&r2=802813&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCEnterRoomHandlerTestCase.java
Mon Aug 10 14:46:44 2009
@@ -153,6 +153,16 @@
assertEquals(room1Jid.getFullQualifiedName() + "/nick",
user2JoinedStanza.getFrom().getFullQualifiedName());
// should be to the existing user
assertEquals(occupant1Jid, user2JoinedStanza.getTo());
+
+ XMLElement xElement =
user2JoinedStanza.getSingleInnerElementsNamed("x");
+ assertEquals(NamespaceURIs.XEP0045_MUC_USER,
xElement.getNamespaceURI());
+
+ // since this room is non-anonymous, x must contain an item element
with the users full JID
+ XMLElement itemElement = xElement.getSingleInnerElementsNamed("item");
+ assertEquals(occupant2Jid.getFullQualifiedName(),
itemElement.getAttributeValue("jid"));
+ assertEquals("none", itemElement.getAttributeValue("affiliation"));
+ assertEquals("participant", itemElement.getAttributeValue("role"));
+
// verify stanzas to the new user on all existing users, including
himself with status=110 element
// own presence must be sent last
@@ -162,14 +172,15 @@
assertEquals(room1Jid.getFullQualifiedName() + "/Some nick",
stanza.getFrom().getFullQualifiedName());
assertEquals(occupant2Jid, stanza.getTo());
- // assert stanza from the joining user, must have extra status=110
element
+ // assert stanza from the joining user, must have extra status=110
element
stanza = occupant2Queue.getNext();
assertNotNull(stanza);
assertEquals(room1JidWithNick, stanza.getFrom());
assertEquals(occupant2Jid, stanza.getTo());
- XMLElement statusElement =
stanza.getFirstInnerElement().getSingleInnerElementsNamed("status");
- assertNotNull(statusElement);
- assertEquals("110", statusElement.getAttributeValue("code"));
+ List<XMLElement> statusElements =
stanza.getFirstInnerElement().getInnerElementsNamed("status");
+ assertEquals(2, statusElements.size());
+ assertEquals("100", statusElements.get(0).getAttributeValue("code"));
+ assertEquals("110", statusElements.get(1).getAttributeValue("code"));
}
}