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 61db14365..0b3e35eb5 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -694,10 +694,10 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } /** - * We use an extra object for {@link #notifyWaitingThreads()} and {@link #waitForConditionOrConnectionException(Supplier)}, because all state + * We use an extra object for {@link #notifyWaitingThreads()} and {@link #waitFor(Supplier)}, because all state * changing methods of the connection are synchronized using the connection instance as monitor. If we now would * also use the connection instance for the internal process to wait for a condition, the {@link Object#wait()} - * would leave the monitor when it waites, which would allow for another potential call to a state changing function + * would leave the monitor when it waits, which would allow for another potential call to a state changing function * to proceed. */ private final Object internalMonitor = new Object(); @@ -722,22 +722,18 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { return true; } - protected final boolean waitForConditionOrConnectionException(Supplier condition) throws InterruptedException { - return waitFor(() -> condition.get().booleanValue() || hasCurrentConnectionException()); - } - - protected final void waitForConditionOrConnectionException(Supplier condition, String waitFor) throws InterruptedException, NoResponseException { - boolean success = waitForConditionOrConnectionException(condition); - if (!success) { - throw NoResponseException.newWith(this, waitFor); - } - } - protected final void waitForConditionOrThrowConnectionException(Supplier condition, String waitFor) throws InterruptedException, SmackException, XMPPException { - waitForConditionOrConnectionException(condition, waitFor); + boolean success = waitFor(() -> condition.get().booleanValue() || hasCurrentConnectionException()); if (hasCurrentConnectionException()) { throwCurrentConnectionException(); } + + // If there was no connection exception and we still did not successfully wait for the condition to hold, then + // we ran into a no-response timeout. + if (!success) { + throw NoResponseException.newWith(this, waitFor); + } + // Otherwise we successfully awaited the condition. } protected Resourcepart bindResourceAndEstablishSession(Resourcepart resource) diff --git a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java index 1403a78df..561978bb4 100644 --- a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java +++ b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java @@ -396,7 +396,7 @@ public class XMPPTCPConnection extends AbstractXMPPConnection { if (isSmResumptionPossible()) { smResumedSyncPoint = SyncPointState.request_sent; sendNonza(new Resume(clientHandledStanzasCount, smSessionId)); - waitForConditionOrConnectionException(() -> smResumedSyncPoint == SyncPointState.successful || smResumptionFailed != null, "resume previous stream"); + waitForConditionOrThrowConnectionException(() -> smResumedSyncPoint == SyncPointState.successful || smResumptionFailed != null, "resume previous stream"); if (smResumedSyncPoint == SyncPointState.successful) { // We successfully resumed the stream, be done here afterSuccessfulLogin(true);