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