Author: ngn
Date: Wed Sep 9 15:34:21 2009
New Revision: 812998
URL: http://svn.apache.org/viewvc?rev=812998&view=rev
Log:
Implement invites (VYSPER-113)
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/AbstractInviteDecline.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Decline.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Invite.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Password.java
Modified:
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/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/stanzas/Status.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/X.java
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.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/stanzas/XTestCase.java
Modified:
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=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCHandlerHelper.java
Wed Sep 9 15:34:21 2009
@@ -19,11 +19,17 @@
*/
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
+import java.util.ArrayList;
import java.util.List;
import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import
org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.AbstractInviteDecline;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Decline;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Invite;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Password;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
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;
@@ -80,6 +86,45 @@
builder.startInnerElement(errorName,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement();
builder.endInnerElement();
- return PresenceStanza.getWrapper(builder.getFinalStanza());
+ return builder.getFinalStanza();
}
+
+ public static Stanza createInviteMessageStanza(Stanza original, String
password) throws EntityFormatException {
+ X orginalX = X.fromStanza(original);
+
+ Invite invite = orginalX.getInvite();
+ if(invite == null || invite.getTo() == null) {
+ throw new IllegalArgumentException("Invalid invite element, must
exist and contain to attribute");
+ }
+
+ Invite newInvite = new Invite(original.getFrom(), null,
invite.getReason());
+ return createInviteDeclineMessageStanza(original, invite.getTo(),
password, newInvite);
+ }
+
+ public static Stanza createDeclineMessageStanza(Stanza original) throws
EntityFormatException {
+ X orginalX = X.fromStanza(original);
+
+ Decline decline = orginalX.getDecline();
+ if(decline == null || decline.getTo() == null) {
+ throw new IllegalArgumentException("Invalid decline element, must
exist and contain to attribute");
+ }
+
+ Decline newDecline = new Decline(original.getFrom(), null,
decline.getReason());
+ return createInviteDeclineMessageStanza(original, decline.getTo(),
null, newDecline);
+ }
+
+
+ public static Stanza createInviteDeclineMessageStanza(Stanza original,
Entity to, String password, AbstractInviteDecline invdec) throws
EntityFormatException {
+ StanzaBuilder builder =
StanzaBuilder.createMessageStanza(original.getTo(), to, null, null);
+ List<XMLElement> inner = new ArrayList<XMLElement>();
+ inner.add(invdec);
+ if(password != null) {
+ inner.add(new Password(password));
+ }
+
+ X newX = new X(NamespaceURIs.XEP0045_MUC_USER, inner);
+ builder.addPreparedElement(newX);
+ return builder.getFinalStanza();
+ }
+
}
Modified:
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=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandler.java
Wed Sep 9 15:34:21 2009
@@ -25,6 +25,7 @@
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.EntityFormatException;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
@@ -32,6 +33,7 @@
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.modules.extension.xep0045_muc.stanzas.X;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.stanza.MessageStanza;
@@ -130,7 +132,7 @@
} else {
return createMessageErrorStanza(moduleDomain, from,
stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.ITEM_NOT_FOUND,
stanza);
}
- } else if(type == null || type == MessageStanzaType.CHAT) {
+ } else if(type == null || type == MessageStanzaType.CHAT || type ==
MessageStanzaType.NORMAL) {
// private message
logger.debug("Received direct message to {}", roomWithNickJid);
Room room = conference.findRoom(roomJid);
@@ -138,28 +140,60 @@
Occupant sendingOccupant = room.findOccupantByJID(from);
// sender must be participant in room
- if(sendingOccupant != null) {
- Occupant receivingOccupant =
room.findOccupantByNick(roomWithNickJid.getResource());
-
- // must be sent to an existing occupant in the room
- if(receivingOccupant != null) {
-
- Entity roomAndSendingNick = new
EntityImpl(room.getJID(), sendingOccupant.getName());
- logger.debug("Relaying message to {}",
receivingOccupant);
- List<Attribute> replaceAttributes = new
ArrayList<Attribute>();
- replaceAttributes.add(new Attribute("from",
roomAndSendingNick.getFullQualifiedName()));
- replaceAttributes.add(new Attribute("to",
receivingOccupant.getJid().getFullQualifiedName()));
-
- relayStanza(receivingOccupant.getJid(),
- StanzaBuilder.createClone(stanza, true,
replaceAttributes).getFinalStanza(),
- serverRuntimeContext);
+ if(roomWithNickJid.isResourceSet()) {
+ if(sendingOccupant != null) {
+ // got resource, private message for occupant
+ Occupant receivingOccupant =
room.findOccupantByNick(roomWithNickJid.getResource());
+
+ // must be sent to an existing occupant in the room
+ if(receivingOccupant != null) {
+
+ Entity roomAndSendingNick = new
EntityImpl(room.getJID(), sendingOccupant.getName());
+ logger.debug("Relaying message to {}",
receivingOccupant);
+ List<Attribute> replaceAttributes = new
ArrayList<Attribute>();
+ replaceAttributes.add(new Attribute("from",
roomAndSendingNick.getFullQualifiedName()));
+ replaceAttributes.add(new Attribute("to",
receivingOccupant.getJid().getFullQualifiedName()));
+
+ relayStanza(receivingOccupant.getJid(),
+ StanzaBuilder.createClone(stanza,
true, replaceAttributes).getFinalStanza(),
+ serverRuntimeContext);
+ } else {
+ // TODO correct error?
+ return createMessageErrorStanza(moduleDomain,
from, stanza.getID(), StanzaErrorType.MODIFY,
StanzaErrorCondition.ITEM_NOT_FOUND, stanza);
+ }
+ } else {
+ // user must be occupant to send direct message
+ return createMessageErrorStanza(room.getJID(),
from, stanza.getID(), StanzaErrorType.MODIFY,
StanzaErrorCondition.NOT_ACCEPTABLE, stanza);
+ }
} else {
- // TODO correct error?
- return createMessageErrorStanza(moduleDomain, from,
stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.ITEM_NOT_FOUND,
stanza);
- }
- } else {
- return createMessageErrorStanza(room.getJID(), from,
stanza.getID(), StanzaErrorType.MODIFY, StanzaErrorCondition.NOT_ACCEPTABLE,
stanza);
- }
+ 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, StanzaErrorCondition.ITEM_NOT_FOUND,
stanza);
}
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=812998&r1=812997&r2=812998&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
Wed Sep 9 15:34:21 2009
@@ -30,7 +30,6 @@
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.DefaultPresenceHandler;
-import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Affiliation;
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;
@@ -48,9 +47,7 @@
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;
@@ -82,10 +79,7 @@
// the MUC child element (i.e., <x
xmlns='http://jabber.org/protocol/muc'/>) in the
// <presence/> stanza of type "error"."
- Attribute xmlns = new Attribute("xmlns", NamespaceURIs.XEP0045_MUC);
- XMLElement xElement = new XMLElement("x", null, Arrays.asList(xmlns),
(List<XMLFragment>)null);
-
- return MUCHandlerHelper.createErrorStanza("presence", from, to, id,
type, errorName, Arrays.asList(xElement));
+ return MUCHandlerHelper.createErrorStanza("presence", from, to, id,
type, errorName, Arrays.asList((XMLElement)new X()));
}
@Override
@@ -181,7 +175,7 @@
X x = X.fromStanza(stanza);
String password = null;
if(x != null) {
- password = x.getPassword();
+ password = x.getPasswordValue();
}
if(password == null || !password.equals(room.getPassword())) {
@@ -226,6 +220,7 @@
room.removeOccupant(occupantJid);
+ // TODO replace with use of X
String statusMessage = null;
try {
XMLElement statusElement =
stanza.getSingleInnerElementsNamed("status");
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/AbstractInviteDecline.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/stanzas/AbstractInviteDecline.java?rev=812998&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/AbstractInviteDecline.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/AbstractInviteDecline.java
Wed Sep 9 15:34:21 2009
@@ -0,0 +1,92 @@
+/*
+ * 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.stanzas;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+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 abstract class AbstractInviteDecline extends XMLElement {
+
+ public AbstractInviteDecline(String elmName, XMLElement elm) {
+ super(elmName, null, elm.getAttributes(),
elm.getInnerElements().toArray(new XMLElement[0]));
+ }
+
+ public AbstractInviteDecline(String elmName, Entity from, Entity to,
String reason) {
+ super(elmName, null,
+ createAttributes(from, to),
+ createFragments(reason));
+ }
+
+ private static List<Attribute> createAttributes(Entity from, Entity to) {
+ List<Attribute> attributes = new ArrayList<Attribute>();
+ if(to != null) attributes.add(new Attribute("to",
to.getFullQualifiedName()));
+ if(from != null) attributes.add(new Attribute("from",
from.getFullQualifiedName()));
+ return attributes;
+ }
+
+ private static List<XMLFragment> createFragments(String reason) {
+ List<XMLFragment> fragments = new ArrayList<XMLFragment>();
+ if(reason != null) {
+ XMLElement reasonElm = new XMLElement("reason", null,
(Attribute[])null, new XMLFragment[]{new XMLText(reason)});
+ fragments.add(reasonElm);
+ }
+ return fragments;
+ }
+
+ public Entity getFrom() throws EntityFormatException {
+ String value = getAttributeValue("from");
+ if(value != null) {
+ return EntityImpl.parse(value);
+ } else {
+ return null;
+ }
+ }
+
+ public Entity getTo() throws EntityFormatException {
+ String value = getAttributeValue("to");
+ if(value != null) {
+ return EntityImpl.parse(value);
+ } else {
+ return null;
+ }
+ }
+
+ public String getReason() {
+ try {
+ XMLElement reasonElm = getSingleInnerElementsNamed("reason");
+ if(reasonElm != null && reasonElm.getInnerText() != null) {
+ return reasonElm.getInnerText().getText();
+ } else {
+ return null;
+ }
+ } catch (XMLSemanticError e) {
+ throw new IllegalArgumentException("Invalid stanza", e);
+ }
+ }
+}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Decline.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/stanzas/Decline.java?rev=812998&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Decline.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Decline.java
Wed Sep 9 15:34:21 2009
@@ -0,0 +1,36 @@
+/*
+ * 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.stanzas;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+
+public class Decline extends AbstractInviteDecline {
+
+ private static final String ElEMENT_NAME = "decline";
+
+ public Decline(XMLElement elm) {
+ super(ElEMENT_NAME, elm);
+ }
+
+ public Decline(Entity from, Entity to, String reason) {
+ super(ElEMENT_NAME, from, to, reason);
+ }
+}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Invite.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/stanzas/Invite.java?rev=812998&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Invite.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Invite.java
Wed Sep 9 15:34:21 2009
@@ -0,0 +1,36 @@
+/*
+ * 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.stanzas;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+
+public class Invite extends AbstractInviteDecline {
+
+ private static final String ElEMENT_NAME = "invite";
+
+ public Invite(XMLElement elm) {
+ super(ElEMENT_NAME, elm);
+ }
+
+ public Invite(Entity from, Entity to, String reason) {
+ super(ElEMENT_NAME, from, to, reason);
+ }
+}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Password.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/stanzas/Password.java?rev=812998&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Password.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Password.java
Wed Sep 9 15:34:21 2009
@@ -0,0 +1,34 @@
+/*
+ * 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.stanzas;
+
+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.XMLText;
+
+public class Password extends XMLElement {
+
+ public Password(String password) {
+ super("password", null, (Attribute[])null, new XMLFragment[]{new
XMLText(password)});
+ }
+
+
+}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Status.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/stanzas/Status.java?rev=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Status.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/Status.java
Wed Sep 9 15:34:21 2009
@@ -20,15 +20,9 @@
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
import java.util.List;
-import org.apache.vysper.xmpp.datetime.DateTimeProfile;
-import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.xmlfragment.Attribute;
-import org.apache.vysper.xmpp.xmlfragment.NamespaceAttribute;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
import org.apache.vysper.xmpp.xmlfragment.XMLText;
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/X.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/stanzas/X.java?rev=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/X.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/X.java
Wed Sep 9 15:34:21 2009
@@ -65,12 +65,38 @@
new NamespaceAttribute(ns)}, elements.toArray(new XMLElement[]{}));
}
+ public Invite getInvite() {
+ try {
+ XMLElement inviteElm = getSingleInnerElementsNamed("invite");
+ if(inviteElm != null) {
+ return new Invite(inviteElm);
+ } else {
+ return null;
+ }
+ } catch (XMLSemanticError e) {
+ throw new IllegalArgumentException("Invalid stanza", e);
+ }
+ }
+
+ public Decline getDecline() {
+ try {
+ XMLElement inviteElm = getSingleInnerElementsNamed("decline");
+ if(inviteElm != null) {
+ return new Decline(inviteElm);
+ } else {
+ return null;
+ }
+ } catch (XMLSemanticError e) {
+ throw new IllegalArgumentException("Invalid stanza", e);
+ }
+ }
+
- public String getPassword() {
+ public Password getPassword() {
try {
XMLElement passwordElm = getSingleInnerElementsNamed("password");
if(passwordElm != null && passwordElm.getInnerText() != null) {
- return passwordElm.getInnerText().getText();
+ return new Password(passwordElm.getInnerText().getText());
} else {
return null;
}
@@ -79,6 +105,14 @@
}
}
+ public String getPasswordValue() {
+ Password password = getPassword();
+ if(password != null && password.getInnerText() != null) {
+ return password.getInnerText().getText();
+ } else {
+ return null;
+ }
+ }
}
Modified:
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=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/handler/MUCMessageHandlerTestCase.java
Wed Sep 9 15:34:21 2009
@@ -10,6 +10,10 @@
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.Decline;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Invite;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Password;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
import org.apache.vysper.xmpp.protocol.ProtocolException;
import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -30,8 +34,16 @@
private Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
String body) throws ProtocolException {
+ return sendMessage(from, to, type, body, null);
+ }
+
+ private Stanza sendMessage(Entity from, Entity to, MessageStanzaType type,
+ String body, X x) throws ProtocolException {
StanzaBuilder stanzaBuilder = StanzaBuilder.createMessageStanza(from,
to, type, null, body);
+ if(x != null) {
+ stanzaBuilder.addPreparedElement(x);
+ }
Stanza messageStanza = stanzaBuilder.getFinalStanza();
ResponseStanzaContainer container = handler.execute(messageStanza,
@@ -142,17 +154,68 @@
}
+ public void testInviteMessageWithPassword() throws Exception {
+ String reason = "Join me!";
+
+ // add occupants to the room
+ Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+ room.setPassword("secret");
+ room.addOccupant(OCCUPANT1_JID, "nick");
+
+ Invite invite = new Invite(null, OCCUPANT2_JID, reason);
+ // send message to occupant 1
+ assertNull(sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new
X(invite)));
+
+ X expectedX = new X(new Invite(OCCUPANT1_JID, null, reason), new
Password("secret"));
+ // verify stanzas to existing occupants on the exiting user
+ assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, expectedX,
+ occupant2Queue.getNext());
+ assertNull(occupant1Queue.getNext());
+ }
+
+ public void testDeclineMessage() throws Exception {
+ String reason = "No way";
+
+ // add occupants to the room
+ Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+ room.addOccupant(OCCUPANT2_JID, "nick");
+
+ Decline decline = new Decline(null, OCCUPANT2_JID, reason);
+ // send message to occupant 1
+ Stanza error = sendMessage(OCCUPANT1_JID, ROOM1_JID, null, null, new
X(decline));
+ assertNull(error);
+
+ X expectedX = new X(new Decline(OCCUPANT1_JID, null, reason));
+ // verify stanzas to existing occupants on the exiting user
+ assertMessageStanza(ROOM1_JID, OCCUPANT2_JID, null, null, expectedX,
+ occupant2Queue.getNext());
+ assertNull(occupant1Queue.getNext());
+ }
+
private void assertMessageStanza(Entity from, Entity to, String type,
String body, Stanza stanza) throws XMLSemanticError {
+ assertMessageStanza(from, to, type, body, null, stanza);
+ }
+
+ private void assertMessageStanza(Entity from, Entity to, String type,
+ String expectedBody, X expectedX, Stanza stanza) throws
XMLSemanticError {
+ assertNotNull(stanza);
assertEquals(from, stanza.getFrom());
assertEquals(to, stanza.getTo());
if (type != null) {
assertEquals(type, stanza.getAttributeValue("type"));
}
- XMLElement bodyElement = stanza.getSingleInnerElementsNamed("body");
- assertEquals(body, bodyElement.getInnerText().getText());
+ if(expectedBody != null) {
+ XMLElement bodyElement =
stanza.getSingleInnerElementsNamed("body");
+ assertEquals(expectedBody, bodyElement.getInnerText().getText());
+ }
+
+ if(expectedX != null) {
+ X actualX = X.fromStanza(stanza);
+ assertEquals(expectedX, actualX);
+ }
}
@Override
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=812998&r1=812997&r2=812998&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
Wed Sep 9 15:34:21 2009
@@ -130,7 +130,7 @@
public void testEnterWithoutNick() throws Exception {
// try entering without a nick
- PresenceStanza response = (PresenceStanza) enterRoom(OCCUPANT1_JID,
ROOM1_JID);
+ Stanza response = enterRoom(OCCUPANT1_JID, ROOM1_JID);
assertPresenceErrorStanza(response, ROOM1_JID, OCCUPANT1_JID,
"modify", "jid-malformed");
}
@@ -149,12 +149,12 @@
room.setPassword("secret");
// try entering without a password
- PresenceStanza response = (PresenceStanza) enterRoom(OCCUPANT1_JID,
ROOM2_JID_WITH_NICK);
+ Stanza response = enterRoom(OCCUPANT1_JID, ROOM2_JID_WITH_NICK);
assertPresenceErrorStanza(response, ROOM2_JID, OCCUPANT1_JID, "auth",
"not-authorized");
}
- private void assertPresenceErrorStanza(PresenceStanza response, Entity
from, Entity to,
+ private void assertPresenceErrorStanza(Stanza response, Entity from,
Entity to,
String type, String errorName) {
Attribute xmlns = new NamespaceAttribute(NamespaceURIs.XEP0045_MUC);
XMLElement xElement = new XMLElement("x", null, Arrays.asList(xmlns),
(XMLFragment[])null);
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/XTestCase.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/stanzas/XTestCase.java?rev=812998&r1=812997&r2=812998&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/XTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/stanzas/XTestCase.java
Wed Sep 9 15:34:21 2009
@@ -43,6 +43,6 @@
X x = X.fromStanza(builder.getFinalStanza());
assertNotNull(x);
- assertEquals("secret", x.getPassword());
+ assertEquals("secret", x.getPasswordValue());
}
}