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 3b58965 XEP-0313 MAM: offline messages are stored twice 3b58965 is described below commit 3b589654326231cfc98ba9352e13dd842f5487b8 Author: Réda Housni Alaoui <reda.housniala...@gmail.com> AuthorDate: Sun Sep 8 18:01:59 2019 +0200 XEP-0313 MAM: offline messages are stored twice --- .../inbound/DeliveringInternalInboundStanzaRelay.java | 5 +---- .../core/im/handler/PresenceAvailabilityHandler.java | 2 +- .../protocol/worker/AbstractStateAwareProtocolWorker.java | 2 +- .../xep0313_mam/in_memory/InMemoryMessageArchive.java | 15 +++++++++++++++ .../xep0313_mam/in_memory/InMemoryMessageArchives.java | 2 +- .../xep0313_mam/in_memory/InMemoryUserMessageArchive.java | 5 +++-- .../xep0313_mam/user/UserMessageStanzaBroker.java | 9 +++++++-- .../extension/xep0313_mam/user/UserArchiveTest.java | 7 ------- 8 files changed, 29 insertions(+), 18 deletions(-) diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java index 7993ea4..6e05961 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java @@ -96,8 +96,6 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage private InboundStanzaProtocolWorker inboundStanzaProtocolWorker; - private UnconnectedProtocolWorker unconnectedProtocolWorker; - private final ComponentRegistry componentRegistry; private static final Integer PRIO_THRESHOLD = 0; @@ -149,7 +147,6 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage public void setStanzaHandlerExecutorFactory(StanzaHandlerExecutorFactory stanzaHandlerExecutorFactory) { this.inboundStanzaProtocolWorker = new InboundStanzaProtocolWorker(stanzaHandlerExecutorFactory); - this.unconnectedProtocolWorker = new UnconnectedProtocolWorker(stanzaHandlerExecutorFactory); } public final void setLogStorageProvider(final LogStorageProvider logStorageProvider) { @@ -385,7 +382,7 @@ public class DeliveringInternalInboundStanzaRelay implements StanzaRelay, Manage LOG.warn("cannot relay to offline receiver {} stanza {}", receiver.getFullQualifiedName(), stanza); return new RelayResult(new LocalRecipientOfflineException()); } - unconnectedProtocolWorker.processStanza(serverRuntimeContext, null, sessionStateHolder, stanza, + inboundStanzaProtocolWorker.processStanza(serverRuntimeContext, null, sessionStateHolder, stanza, stanzaHandler); return new RelayResult().setProcessed(); } diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java index 477e5ff..de8865d 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java @@ -273,7 +273,7 @@ public class PresenceAvailabilityHandler extends AbstractPresenceSpecializedHand Collection<Stanza> offlineStanzas = offlineProvider.getStanzasFor(user); for (Stanza stanza : offlineStanzas) { logger.debug("Sending out delayed offline stanza"); - relayStanza(user, stanza, stanzaBroker); + stanzaBroker.writeToSession(stanza); } } diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java index bebdefc..c4d7551 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AbstractStateAwareProtocolWorker.java @@ -58,7 +58,7 @@ public abstract class AbstractStateAwareProtocolWorker implements StateAwareProt protected boolean checkState(InternalSessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza, StanzaHandler stanzaHandler) { - return sessionContext != null && getHandledState() == sessionContext.getState(); + return getHandledState() == sessionStateHolder.getState(); } private void executeHandler(ServerRuntimeContext serverRuntimeContext, InternalSessionContext sessionContext, diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchive.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchive.java index 208bcae..f928625 100644 --- a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchive.java +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchive.java @@ -19,12 +19,16 @@ */ package org.apache.vysper.xmpp.modules.extension.xep0313_mam.in_memory; +import static java.util.Objects.requireNonNull; + import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; import java.util.UUID; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.apache.vysper.xmpp.addressing.Entity; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.ArchivedMessage; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.ArchivedMessages; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.Message; @@ -38,8 +42,14 @@ import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.SimpleArchivedMe */ public class InMemoryMessageArchive implements MessageArchive { + private final Entity archiveId; + private final List<SimpleArchivedMessage> messages = new ArrayList<>(); + public InMemoryMessageArchive(Entity archiveId) { + this.archiveId = requireNonNull(archiveId); + } + @Override public ArchivedMessage archive(Message message) { SimpleArchivedMessage archivedMessage = new SimpleArchivedMessage(UUID.randomUUID().toString(), message); @@ -63,4 +73,9 @@ public class InMemoryMessageArchive implements MessageArchive { return messages.stream().filter(predicate).collect(Collectors.toList()); } + @Override + public String toString() { + return new StringJoiner(", ", InMemoryMessageArchive.class.getSimpleName() + "[", "]") + .add("archiveId=" + archiveId).toString(); + } } diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchives.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchives.java index a5d4073..ae491e5 100644 --- a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchives.java +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryMessageArchives.java @@ -37,7 +37,7 @@ public class InMemoryMessageArchives implements MessageArchives { @Override public Optional<UserMessageArchive> retrieveUserMessageArchive(Entity userBareJid) { UserMessageArchive messageArchive = userMessageArchiveById.computeIfAbsent(userBareJid, - id -> new InMemoryUserMessageArchive()); + id -> new InMemoryUserMessageArchive(userBareJid)); return Optional.of(messageArchive); } } diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryUserMessageArchive.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryUserMessageArchive.java index 4042530..424dbcc 100644 --- a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryUserMessageArchive.java +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/in_memory/InMemoryUserMessageArchive.java @@ -19,6 +19,7 @@ */ package org.apache.vysper.xmpp.modules.extension.xep0313_mam.in_memory; +import org.apache.vysper.xmpp.addressing.Entity; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.ArchivedMessage; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.ArchivedMessages; import org.apache.vysper.xmpp.modules.extension.xep0313_mam.spi.Message; @@ -38,8 +39,8 @@ public class InMemoryUserMessageArchive implements UserMessageArchive { private UserMessageArchivePreferences preferences; - public InMemoryUserMessageArchive() { - this.delegate = new InMemoryMessageArchive(); + public InMemoryUserMessageArchive(Entity archiveId) { + this.delegate = new InMemoryMessageArchive(archiveId); this.preferences = new SimpleUserMessageArchivePreferences(); } diff --git a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserMessageStanzaBroker.java b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserMessageStanzaBroker.java index 3ef8a6a..b818253 100644 --- a/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserMessageStanzaBroker.java +++ b/server/extensions/xep0313-mam/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0313_mam/user/UserMessageStanzaBroker.java @@ -130,8 +130,13 @@ class UserMessageStanzaBroker extends DelegatingStanzaBroker { // local users MUST expose these archives to the user on the user's bare JID. Entity receiverArchiveId = requireNonNull(messageStanza.getTo(), "No 'to' found in " + messageStanza) .getBareJID(); - return messageArchives().retrieveUserMessageArchive(receiverArchiveId) - .map(messageArchive -> messageArchive.archive(new SimpleMessage(messageStanza))); + Optional<UserMessageArchive> receiverArchive = messageArchives().retrieveUserMessageArchive(receiverArchiveId); + if (!receiverArchive.isPresent()) { + LOG.debug("No archive returned for sender with bare JID '{}'", receiverArchiveId); + return Optional.empty(); + } + + return Optional.ofNullable(receiverArchive.get().archive(new SimpleMessage(messageStanza))); } private MessageArchives messageArchives() { 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 bef02b9..9e1fbb4 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 @@ -219,16 +219,9 @@ public class UserArchiveTest extends IntegrationTest { Thread.sleep(200); - assertNotNull(carolReceivedMessage.get()); - assertEquals("Hello carol", carolReceivedMessage.get().getBody()); - Message archivedMessage = fetchUniqueArchivedMessage(carol()); String storedStanzaId = extractStanzaId(archivedMessage); assertNotNull(storedStanzaId); - - String receivedStanzaId = extractStanzaId(carolReceivedMessage.get()); - - assertEquals(storedStanzaId, receivedStanzaId); } @Test