This is an automated email from the ASF dual-hosted git repository. ralaoui pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-vysper.git
The following commit(s) were added to refs/heads/master by this push: new ab05956 Message archive management: per user archive support discovery ab05956 is described below commit ab05956e1daa1718c3a1fc89b8f5e42f831fcc72 Author: Réda Housni Alaoui <reda.housniala...@gmail.com> AuthorDate: Sat Sep 7 23:30:38 2019 +0200 Message archive management: per user archive support discovery --- .../modules/extension/xep0313_mam/MAMModule.java | 25 +++++----- .../xep0313_mam/user/UserInfoRequestListener.java | 56 ++++++++++++++++++++++ .../xep0313_mam/user/UserArchiveTest.java | 16 +++++++ 3 files changed, 86 insertions(+), 11 deletions(-) diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/MAMModule.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/MAMModule.java index ae1f46f..71833c8 100644 --- a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/MAMModule.java +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/MAMModule.java @@ -25,15 +25,16 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.commons.lang.StringUtils; import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.interceptor.MAMStanzaHandlerInterceptor; -import org.apache.vysper.xmpp.modules.extension.xep0313_mam.user.MAMIQPreferenceHandler; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.query.MAMIQQueryHandler; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.MessageArchives; +import org.apache.vysper.xmpp.modules.extension.xep0313_mam.user.MAMIQPreferenceHandler; +import org.apache.vysper.xmpp.modules.extension.xep0313_mam.user.UserInfoRequestListener; import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature; import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement; import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest; +import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequestListener; import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener; import org.apache.vysper.xmpp.protocol.HandlerDictionary; import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary; @@ -53,12 +54,13 @@ public class MAMModule extends DefaultDiscoAwareModule implements ServerInfoRequ private static final String NAMESPACE_V2 = "urn:xmpp:mam:2"; + private MessageArchives messageArchives; + @Override public void initialize(ServerRuntimeContext serverRuntimeContext) { - super.initialize(serverRuntimeContext); - - requireNonNull(serverRuntimeContext.getStorageProvider(MessageArchives.class), + messageArchives = requireNonNull(serverRuntimeContext.getStorageProvider(MessageArchives.class), "Could not find an instance of " + MessageArchives.class); + super.initialize(serverRuntimeContext); } @Override @@ -77,14 +79,14 @@ public class MAMModule extends DefaultDiscoAwareModule implements ServerInfoRequ } @Override - public List<InfoElement> getServerInfosFor(InfoRequest request) { - if (StringUtils.isNotEmpty(request.getNode())) { - return Collections.emptyList(); - } + protected void addInfoRequestListeners(List<InfoRequestListener> infoRequestListeners) { + infoRequestListeners.add(new UserInfoRequestListener(messageArchives, NAMESPACE_V1)); + infoRequestListeners.add(new UserInfoRequestListener(messageArchives, NAMESPACE_V2)); + } + @Override + public List<InfoElement> getServerInfosFor(InfoRequest request) { List<InfoElement> infoElements = new ArrayList<>(); - infoElements.add(new Feature(NAMESPACE_V1)); - infoElements.add(new Feature(NAMESPACE_V2)); infoElements.add(new Feature(NamespaceURIs.XEP0359_STANZA_IDS)); infoElements.add(new Feature(NamespaceURIs.JABBER_X_DATA)); return infoElements; @@ -102,4 +104,5 @@ public class MAMModule extends DefaultDiscoAwareModule implements ServerInfoRequ public List<StanzaHandlerInterceptor> getStanzaHandlerInterceptors() { return Collections.singletonList(new MAMStanzaHandlerInterceptor()); } + } diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserInfoRequestListener.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserInfoRequestListener.java new file mode 100644 index 0000000..a423954 --- /dev/null +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserInfoRequestListener.java @@ -0,0 +1,56 @@ +/* + * 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.xep0313_mam.user; + +import static java.util.Objects.requireNonNull; + +import java.util.Collections; +import java.util.List; + +import org.apache.vysper.xmpp.addressing.Entity; +import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.MessageArchives; +import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature; +import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement; +import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest; +import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequestListener; + +/** + * @author Réda Housni Alaoui + */ +public class UserInfoRequestListener implements InfoRequestListener { + + private final MessageArchives messageArchives; + + private final String namespace; + + public UserInfoRequestListener(MessageArchives messageArchives, String namespace) { + this.messageArchives = requireNonNull(messageArchives); + this.namespace = requireNonNull(namespace); + } + + @Override + public List<InfoElement> getInfosFor(InfoRequest request) { + Entity archiveId = request.getTo().getBareJID(); + if (!messageArchives.retrieveUserMessageArchive(archiveId).isPresent()) { + return Collections.emptyList(); + } + return Collections.singletonList(new Feature(namespace)); + } +} diff --git a/server/extensions/xep0313-mam/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserArchiveTest.java b/server/extensions/xep0313-mam/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserArchiveTest.java index eb0572c..a8cf981 100644 --- a/server/extensions/xep0313-mam/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserArchiveTest.java +++ b/server/extensions/xep0313-mam/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserArchiveTest.java @@ -41,6 +41,8 @@ import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; +import org.jivesoftware.smackx.disco.packet.DiscoverInfo; import org.jivesoftware.smackx.forward.packet.Forwarded; import org.jivesoftware.smackx.mam.MamManager; import org.jivesoftware.smackx.mam.element.MamPrefsIQ; @@ -260,6 +262,20 @@ public class UserArchiveTest extends IntegrationTest { assertEquals(JidCreate.bareFrom("ne...@foo.com"), neverJids.get(0)); } + @Test + public void discoverInfo() throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, + InterruptedException, SmackException.NoResponseException { + ServiceDiscoveryManager discoveryManager = ServiceDiscoveryManager.getInstanceFor(alice()); + DiscoverInfo discoverInfo = discoveryManager.discoverInfo(alice().getUser().asBareJid()); + List<DiscoverInfo.Feature> features = discoverInfo.getFeatures(); + + boolean mamV1Enabled = features.stream().map(DiscoverInfo.Feature::getVar).anyMatch("urn:xmpp:mam:1"::equals); + assertTrue(mamV1Enabled); + + boolean mamV2Enabled = features.stream().map(DiscoverInfo.Feature::getVar).anyMatch("urn:xmpp:mam:2"::equals); + assertTrue(mamV2Enabled); + } + private Message fetchUniqueArchivedMessage(AbstractXMPPConnection connection) throws XMPPException.XMPPErrorException, InterruptedException, SmackException.NotConnectedException, SmackException.NotLoggedInException, SmackException.NoResponseException {