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/20 22:04:44 UTC

svn commit: r806334 - in /mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src: main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/

Author: ngn
Date: Thu Aug 20 20:04:44 2009
New Revision: 806334

URL: http://svn.apache.org/viewvc?rev=806334&view=rev
Log:
Implemented forwarding disco requests for room occupants (VYSPER-106)

Added:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantDiscoItemsTestCase.java
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantInfoDiscoTestCase.java
Modified:
    mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java

Modified: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.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/MUCModule.java?rev=806334&r1=806333&r2=806334&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java (original)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java Thu Aug 20 20:04:44 2009
@@ -19,15 +19,19 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
 
+import java.util.Arrays;
 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.delivery.DeliveryException;
+import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
 import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler.MUCMessageHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler.MUCPresenceHandler;
 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.storage.OccupantStorageProvider;
 import org.apache.vysper.xmpp.modules.extension.xep0045_muc.storage.RoomStorageProvider;
@@ -39,8 +43,12 @@
 import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.ServiceDiscoveryRequestException;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.SubdomainHandlerDictionary;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,6 +63,7 @@
     private Entity domain;
     
     private final Logger logger = LoggerFactory.getLogger(MUCModule.class);
+    private ServerRuntimeContext serverRuntimeContext;
     
     public MUCModule(Entity domain) {
         this(domain, new Conference("Conference"));
@@ -79,10 +88,11 @@
     @Override
     public void initialize(ServerRuntimeContext serverRuntimeContext) {
         super.initialize(serverRuntimeContext);
-
+        
+        this.serverRuntimeContext = serverRuntimeContext;
         RoomStorageProvider roomStorageProvider = (RoomStorageProvider) serverRuntimeContext.getStorageProvider(RoomStorageProvider.class);
         OccupantStorageProvider occupantStorageProvider = (OccupantStorageProvider) serverRuntimeContext.getStorageProvider(OccupantStorageProvider.class);
-        
+
         if (roomStorageProvider == null) {
             logger.warn("No room storage provider found, using the default (in memory)");
         } else {
@@ -132,18 +142,25 @@
      * @see ItemRequestListener#getItemsFor(InfoRequest)
      */
     public List<Item> getItemsFor(InfoRequest request) throws ServiceDiscoveryRequestException {
-        if(request.getTo().getNode() == null) {
+        Entity to = request.getTo();
+        if(to.getNode() == null) {
             // items request on the component
             return conference.getItemsFor(request);
         } else {
             // might be an items request on a room
-            Room room = conference.findRoom(request.getTo());
+            Room room = conference.findRoom(to.getBareJID());
             if(room != null) {
-                return room.getItemsFor(request);
-            } else {
-                return null;
+                if(to.getResource() != null) {
+                    // request for an occupant
+                    Occupant occupant = room.findOccupantByNick(to.getResource());
+                    // request for occupant, relay
+                    if(occupant != null) relayDiscoStanza(occupant.getJid(), request, NamespaceURIs.XEP0030_SERVICE_DISCOVERY_ITEMS);
+                } else {
+                    return room.getItemsFor(request);
+                }
             }
         }
+        return null;
     }
     
     @Override
@@ -165,13 +182,39 @@
         infoRequestListeners.add(this);
     }
     
+    private void relayDiscoStanza(Entity receiver, InfoRequest request, String ns) {
+        // TODO how to get id?
+        StanzaBuilder builder = StanzaBuilder.createIQStanza(request.getFrom(), receiver, IQStanzaType.GET, "1");
+        builder.startInnerElement("query", ns);
+        if(request.getNode() != null) {
+            builder.addAttribute("node", request.getNode());
+        }
+
+        try {
+            serverRuntimeContext.getStanzaRelay().relay(receiver, builder.getFinalStanza(), new IgnoreFailureStrategy());
+        } catch (DeliveryException e) {
+            // ignore
+        }
+        
+    }
+    
     public List<InfoElement> getInfosFor(InfoRequest request)
             throws ServiceDiscoveryRequestException {
-        Room room = conference.findRoom(request.getTo());
-        if(room != null) {
-            return room.getInfosFor(request);
-        } else {
-            return null;
+        Entity to = request.getTo();
+        
+        if(to.getNode() != null) {
+            Room room = conference.findRoom(to.getBareJID());
+            if(room != null) {
+                if(to.getResource() != null) {
+                    Occupant occupant = room.findOccupantByNick(to.getResource());
+                    // request for occupant, relay
+                    if(occupant != null) relayDiscoStanza(occupant.getJid(), request, NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
+                } else {
+                // request for room
+                    return room.getInfosFor(request);
+                }
+            }
         }
+        return null;
     }
 }

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.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/ServerMain.java?rev=806334&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/ServerMain.java Thu Aug 20 20:04:44 2009
@@ -0,0 +1,90 @@
+/*
+ *  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;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.mina.TCPEndpoint;
+import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.authorization.AccountManagement;
+import org.apache.vysper.xmpp.modules.Module;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.server.XMPPServer;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class ServerMain {
+
+    /**
+     * boots the server as a standalone application
+     * 
+     * adding a module from the command line:
+     * using a runtime property, one or more modules can be specified, like this:
+     * -Dvysper.add.module=org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule,... more ...
+     * 
+     * @param args
+     */
+    public static void main(String[] args) throws AccountCreationException, EntityFormatException {
+
+        StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+        final AccountManagement accountManagement = (AccountManagement)providerRegistry.retrieve(AccountManagement.class);
+
+        accountManagement.addUser("test@vysper.org", "password");
+
+        XMPPServer server = new XMPPServer("vysper.org");
+        server.addEndpoint(new TCPEndpoint());
+        //server.addEndpoint(new StanzaSessionFactory());
+        server.setStorageProviderRegistry(providerRegistry);
+
+        server.setTLSCertificateInfo(new File("src/main/resources/bogus_mina_tls.cert"), "boguspw");
+
+        try {
+            server.start();
+            System.out.println("vysper server is running...");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        server.addModule(new SoftwareVersionModule());
+        server.addModule(new EntityTimeModule());
+        server.addModule(new VcardTempModule());
+        server.addModule(new XmppPingModule());
+        server.addModule(new PrivateDataModule());
+        
+        Conference conference = new Conference("Test conference");
+        server.addModule(new MUCModule("chat.vysper.org", conference));
+
+    }
+}

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.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/AbstractMUCOccupantDiscoTestCase.java?rev=806334&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/AbstractMUCOccupantDiscoTestCase.java Thu Aug 20 20:04:44 2009
@@ -0,0 +1,74 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
+
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler.AbstractMUCHandlerTestCase;
+import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Room;
+import org.apache.vysper.xmpp.modules.servicediscovery.collection.ServiceCollector;
+import org.apache.vysper.xmpp.modules.servicediscovery.handler.DiscoInfoIQHandler;
+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.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
+import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+
+/**
+ */
+public abstract class AbstractMUCOccupantDiscoTestCase extends AbstractMUCHandlerTestCase {
+
+    private Stanza sendDisco(Stanza stanza) throws ProtocolException {
+        ResponseStanzaContainer container = handler.execute(stanza,
+                sessionContext.getServerRuntimeContext(), true, sessionContext,
+                null);
+        if (container != null) {
+            return container.getResponseStanza();
+        } else {
+            return null;
+        }
+    }
+    
+    
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        ServiceCollector serviceCollector = new ServiceCollector();
+        MUCModule module = new MUCModule(MODULE_JID, conference);
+        module.initialize(sessionContext.getServerRuntimeContext());
+        serviceCollector.addInfoRequestListener(module);
+        serviceCollector.addItemRequestListener(module);
+
+        sessionContext.getServerRuntimeContext().registerServerRuntimeContextService(serviceCollector);
+    }
+
+    protected abstract String getNamespace();
+    
+    public void testDisco() throws Exception {
+        // add occupants to the room
+        Room room = conference.findOrCreateRoom(ROOM1_JID, "Room 1");
+        room.addOccupant(OCCUPANT1_JID, "nick");
+        room.addOccupant(OCCUPANT2_JID, "Nick 2");
+
+        StanzaBuilder request = StanzaBuilder.createIQStanza(OCCUPANT1_JID, new EntityImpl(ROOM1_JID, "Nick 2"), IQStanzaType.GET, "1");
+        request.startInnerElement("query", getNamespace()).endInnerElement();
+
+        // send message to room
+        sendDisco(request.getFinalStanza());
+
+        assertNull(occupant1Queue.getNext());
+        Stanza stanza = occupant2Queue.getNext(); 
+        assertNotNull(stanza);
+        assertEquals(OCCUPANT1_JID, stanza.getFrom());
+        assertEquals(OCCUPANT2_JID, stanza.getTo());
+        assertEquals("get", stanza.getAttributeValue("type"));
+        XMLElement query = stanza.getFirstInnerElement();
+        assertNotNull(query);
+        assertEquals(getNamespace(), query.getNamespaceURI());
+    }
+}

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantDiscoItemsTestCase.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/MUCOccupantDiscoItemsTestCase.java?rev=806334&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantDiscoItemsTestCase.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantDiscoItemsTestCase.java Thu Aug 20 20:04:44 2009
@@ -0,0 +1,19 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
+
+import org.apache.vysper.xmpp.modules.servicediscovery.handler.DiscoItemIQHandler;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+
+/**
+ */
+public class MUCOccupantDiscoItemsTestCase extends AbstractMUCOccupantDiscoTestCase {
+
+    protected String getNamespace() {
+        return NamespaceURIs.XEP0030_SERVICE_DISCOVERY_ITEMS;
+    }
+    
+    @Override
+    protected StanzaHandler createHandler() {
+        return new DiscoItemIQHandler();
+    }
+}

Added: mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantInfoDiscoTestCase.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/MUCOccupantInfoDiscoTestCase.java?rev=806334&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantInfoDiscoTestCase.java (added)
+++ mina/sandbox/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCOccupantInfoDiscoTestCase.java Thu Aug 20 20:04:44 2009
@@ -0,0 +1,19 @@
+package org.apache.vysper.xmpp.modules.extension.xep0045_muc;
+
+import org.apache.vysper.xmpp.modules.servicediscovery.handler.DiscoInfoIQHandler;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+
+/**
+ */
+public class MUCOccupantInfoDiscoTestCase extends AbstractMUCOccupantDiscoTestCase {
+
+    protected String getNamespace() {
+        return NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO;
+    }
+    
+    @Override
+    protected StanzaHandler createHandler() {
+        return new DiscoInfoIQHandler();
+    }
+}