From e380872a41fd0cae2cc509ef3a13356a4fbed08c Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Wed, 7 Jan 2015 20:19:04 +0100 Subject: [PATCH] Add 'resumed' bool ConnectionListener's authenticated() It's important to know if the stream was resumed. authenticated() is the ideal callback for Managers to reset their state (e.g. cached values of the connection state). But if the stream was resumed, the cached values don't have to be reset. --- .../smack/AbstractConnectionListener.java | 2 +- .../smack/AbstractXMPPConnection.java | 12 +++++++++--- .../jivesoftware/smack/ConnectionListener.java | 2 +- .../jivesoftware/smack/ReconnectionManager.java | 2 +- .../main/java/org/jivesoftware/smack/Roster.java | 6 +++++- .../smack/debugger/AbstractDebugger.java | 8 ++++++-- .../slf4j/SLF4JLoggingConnectionListener.java | 2 +- .../smackx/caps/EntityCapsManager.java | 16 ++++++++-------- .../jivesoftware/smackx/ping/PingManager.java | 2 +- .../smackx/privacy/PrivacyListManager.java | 6 +++++- 10 files changed, 38 insertions(+), 20 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java index bc8b27b8e..074bbe573 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java @@ -31,7 +31,7 @@ public class AbstractConnectionListener implements ConnectionListener { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // do nothing } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index 677994b65..633ebdfb3 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -500,7 +500,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { if (config.isDebuggerEnabled() && debugger != null) { debugger.userHasLogged(user); } - callConnectionAuthenticatedListener(); + callConnectionAuthenticatedListener(resumed); // Set presence to online. It is important that this is done after // callConnectionAuthenticatedListener(), as this call will also @@ -1040,9 +1040,15 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } } - protected void callConnectionAuthenticatedListener() { + protected void callConnectionAuthenticatedListener(boolean resumed) { for (ConnectionListener listener : getConnectionListeners()) { - listener.authenticated(this); + try { + listener.authenticated(this, resumed); + } catch (Exception e) { + // Catch and print any exception so we can recover + // from a faulty listener and finish the shutdown process + LOGGER.log(Level.SEVERE, "Exception in authenticated listener", e); + } } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java index 7df1827be..08da787ff 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java @@ -38,7 +38,7 @@ public interface ConnectionListener { * TODO * @param connection */ - public void authenticated(XMPPConnection connection); + public void authenticated(XMPPConnection connection, boolean resumed); /** * Notification that the connection was closed normally or that the reconnection diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java index b9273a66f..2c7c7e982 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java @@ -264,7 +264,7 @@ public class ReconnectionManager { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { done = false; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/Roster.java b/smack-core/src/main/java/org/jivesoftware/smack/Roster.java index f7049957c..ac1861442 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/Roster.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/Roster.java @@ -138,7 +138,7 @@ public class Roster { connection.addConnectionListener(new AbstractConnectionClosedListener() { @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // Anonymous users can't have a roster, but it is possible that a Roster instance is // retrieved if getRoster() is called *before* connect(). So we have to check here // again if it's an anonymous connection. @@ -146,6 +146,10 @@ public class Roster { return; if (!connection.isRosterLoadedAtLogin()) return; + // We are done here if the connection was resumed + if (resumed) { + return; + } try { Roster.this.reload(); } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java b/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java index 4fce13d04..926fb7547 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java @@ -80,8 +80,12 @@ public abstract class AbstractDebugger implements SmackDebugger { log("XMPPConnection connected (" + connection.getConnectionCounter() + ")"); } - public void authenticated(XMPPConnection connection) { - log("XMPPConnection authenticated (" + connection.getConnectionCounter() + ")"); + public void authenticated(XMPPConnection connection, boolean resumed) { + String logString = "XMPPConnection authenticated (" + connection.getConnectionCounter() + ")"; + if (resumed) { + logString += " and resumed"; + } + log(logString); } public void connectionClosed() { log( diff --git a/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java b/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java index 3a3309cef..ec25f3639 100644 --- a/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java +++ b/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java @@ -36,7 +36,7 @@ class SLF4JLoggingConnectionListener implements ConnectionListener { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { logger.debug("({}) Connection authenticated as {}", connection.hashCode(), connection.getUser()); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java index cf495478d..2c86e2440 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java @@ -16,7 +16,7 @@ */ package org.jivesoftware.smackx.caps; -import org.jivesoftware.smack.AbstractConnectionClosedListener; +import org.jivesoftware.smack.AbstractConnectionListener; import org.jivesoftware.smack.SmackException.NoResponseException; import org.jivesoftware.smack.SmackException.NotConnectedException; import org.jivesoftware.smack.XMPPConnection; @@ -274,7 +274,7 @@ public class EntityCapsManager extends Manager { this.sdm = ServiceDiscoveryManager.getInstanceFor(connection); instances.put(connection, this); - connection.addConnectionListener(new AbstractConnectionClosedListener() { + connection.addConnectionListener(new AbstractConnectionListener() { @Override public void connected(XMPPConnection connection) { // It's not clear when a server would report the caps stream @@ -283,17 +283,17 @@ public class EntityCapsManager extends Manager { processCapsStreamFeatureIfAvailable(connection); } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // It's not clear when a server would report the caps stream // feature, so we try to process it after we are connected and // once after we are authenticated. processCapsStreamFeatureIfAvailable(connection); - } - @Override - public void connectionTerminated() { - presenceSend = false; - } + // Reset presenceSend when the connection was not resumed + if (!resumed) { + presenceSend = false; + } + } private void processCapsStreamFeatureIfAvailable(XMPPConnection connection) { CapsExtension capsExtension = connection.getFeature( CapsExtension.ELEMENT, CapsExtension.NAMESPACE); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java index 1334c50f7..95d8308a8 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java @@ -137,7 +137,7 @@ public class PingManager extends Manager { }, PING_PACKET_FILTER); connection.addConnectionListener(new AbstractConnectionClosedListener() { @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { maybeSchedulePingServerTask(); } @Override diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java index 57631a824..2c529743f 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java @@ -186,7 +186,11 @@ public class PrivacyListManager extends Manager { }, PRIVACY_RESULT); connection.addConnectionListener(new AbstractConnectionListener() { @Override - public void reconnectionSuccessful() { + public void authenticated(XMPPConnection connection, boolean resumed) { + // No need to reset the cache if the connection got resumed. + if (resumed) { + return; + } cachedActiveListName = cachedDefaultListName = null; } });