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());
     }
 }


Reply via email to