From 145e9d18593fa1f2c95a9da03e9ff9b58c3a15c9 Mon Sep 17 00:00:00 2001 From: Silvio Giebl Date: Mon, 29 Jul 2019 09:12:59 +0200 Subject: [PATCH 1/4] Nested Mqtt5Exceptions are now mapped to Mqtt3Exceptions --- .../mqtt/mqtt3/Mqtt3BlockingClientView.java | 6 +++--- .../exceptions/Mqtt3ExceptionFactory.java | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java index c6c604bbe..9058d9f1f 100644 --- a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java +++ b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java @@ -145,7 +145,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { public @NotNull Mqtt3Publish receive() throws InterruptedException { try { return Mqtt3PublishView.of(delegate.receive()); - } catch (final Mqtt5MessageException e) { + } catch (final RuntimeException e) { throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); } } @@ -161,7 +161,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { try { return delegate.receive(timeout, timeUnit).map(Mqtt3PublishView.JAVA_MAPPER); - } catch (final Mqtt5MessageException e) { + } catch (final RuntimeException e) { throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); } } @@ -170,7 +170,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { public @NotNull Optional receiveNow() { try { return delegate.receiveNow().map(Mqtt3PublishView.JAVA_MAPPER); - } catch (final Mqtt5MessageException e) { + } catch (final RuntimeException e) { throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); } } diff --git a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java index 2e0d8a7c1..c8423f124 100644 --- a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java +++ b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java @@ -20,6 +20,7 @@ import com.hivemq.client.internal.mqtt.message.connect.connack.mqtt3.Mqtt3ConnAckView; import com.hivemq.client.internal.mqtt.message.subscribe.suback.MqttSubAck; import com.hivemq.client.internal.mqtt.message.subscribe.suback.mqtt3.Mqtt3SubAckView; +import com.hivemq.client.mqtt.exceptions.MqttSessionExpiredException; import com.hivemq.client.mqtt.mqtt3.exceptions.*; import com.hivemq.client.mqtt.mqtt5.exceptions.Mqtt5MessageException; import com.hivemq.client.mqtt.mqtt5.message.Mqtt5Message; @@ -37,12 +38,25 @@ public final class Mqtt3ExceptionFactory { Mqtt3ExceptionFactory::map; public static @NotNull Throwable map(final @NotNull Throwable throwable) { - if (throwable instanceof Mqtt5MessageException) { - return map((Mqtt5MessageException) throwable); + if (throwable instanceof RuntimeException) { + return map((RuntimeException) throwable); } return throwable; } + public static @NotNull RuntimeException map(final @NotNull RuntimeException e) { + if (e instanceof Mqtt5MessageException) { + return map((Mqtt5MessageException) e); + } + if (e instanceof MqttSessionExpiredException) { + final Throwable cause = e.getCause(); + if (cause instanceof Mqtt5MessageException) { + return new MqttSessionExpiredException(e.getMessage(), map((Mqtt5MessageException) cause)); + } + } + return e; + } + public static @NotNull Mqtt3MessageException map(final @NotNull Mqtt5MessageException mqtt5MessageException) { final Mqtt5Message mqttMessage = mqtt5MessageException.getMqttMessage(); final String message = mqtt5MessageException.getMessage(); From 3b003557ed52658420ba08e6595b2a576c4a03e9 Mon Sep 17 00:00:00 2001 From: Silvio Giebl Date: Mon, 29 Jul 2019 11:56:59 +0200 Subject: [PATCH 2/4] Fixed MqttPublish.receive(Now) not throwing exception if called after client was disconnected. --- .../internal/mqtt/MqttBlockingClient.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hivemq/client/internal/mqtt/MqttBlockingClient.java b/src/main/java/com/hivemq/client/internal/mqtt/MqttBlockingClient.java index dcce1bfdc..d573e10b0 100644 --- a/src/main/java/com/hivemq/client/internal/mqtt/MqttBlockingClient.java +++ b/src/main/java/com/hivemq/client/internal/mqtt/MqttBlockingClient.java @@ -168,7 +168,7 @@ private static class MqttPublishes implements Mqtt5Publishes, FlowableSubscriber private final @NotNull AtomicReference<@Nullable Subscription> subscription = new AtomicReference<>(); private final @NotNull LinkedList entries = new LinkedList<>(); private @Nullable Mqtt5Publish queuedPublish; - private boolean cancelled; + private @Nullable Throwable error; MqttPublishes(final @NotNull Flowable publishes) { publishes.subscribe(this); @@ -192,7 +192,7 @@ private void request() { @Override public void onNext(final @NotNull Mqtt5Publish publish) { synchronized (entries) { - if (cancelled) { + if (error != null) { return; } Entry entry; @@ -216,9 +216,10 @@ public void onComplete() { @Override public void onError(final @NotNull Throwable t) { synchronized (entries) { - if (cancelled) { + if (error != null) { return; } + error = t; Entry entry; while ((entry = entries.poll()) != null) { entry.result.set(t); @@ -231,8 +232,8 @@ public void onError(final @NotNull Throwable t) { public @NotNull Mqtt5Publish receive() throws InterruptedException { final Entry entry; synchronized (entries) { - if (cancelled) { - throw new CancellationException(); + if (error != null) { + throw handleError(error); } final Mqtt5Publish publish = receiveNowUnsafe(); if (publish != null) { @@ -253,10 +254,7 @@ public void onError(final @NotNull Throwable t) { return (Mqtt5Publish) result; } if (result instanceof Throwable) { - if (result instanceof RuntimeException) { - throw AsyncRuntimeException.fillInStackTrace((RuntimeException) result); - } - throw new RuntimeException((Throwable) result); + throw handleError((Throwable) result); } if (interruptedException != null) { throw interruptedException; @@ -275,8 +273,8 @@ public void onError(final @NotNull Throwable t) { final Entry entry; synchronized (entries) { - if (cancelled) { - throw new CancellationException(); + if (error != null) { + throw handleError(error); } final Mqtt5Publish publish = receiveNowUnsafe(); if (publish != null) { @@ -297,10 +295,7 @@ public void onError(final @NotNull Throwable t) { return Optional.of((Mqtt5Publish) result); } if (result instanceof Throwable) { - if (result instanceof RuntimeException) { - throw AsyncRuntimeException.fillInStackTrace((RuntimeException) result); - } - throw new RuntimeException((Throwable) result); + throw handleError((Throwable) result); } if (interruptedException != null) { throw interruptedException; @@ -312,8 +307,8 @@ public void onError(final @NotNull Throwable t) { public @NotNull Optional receiveNow() { final Mqtt5Publish publish; synchronized (entries) { - if (cancelled) { - throw new CancellationException(); + if (error != null) { + throw handleError(error); } publish = receiveNowUnsafe(); } @@ -337,18 +332,25 @@ public void close() { subscription.cancel(); } synchronized (entries) { - if (cancelled) { + if (error != null) { return; } - cancelled = true; + error = new CancellationException(); Entry entry; while ((entry = entries.poll()) != null) { - entry.result.set(new CancellationException()); + entry.result.set(error); entry.latch.countDown(); } } } + private @NotNull RuntimeException handleError(final @NotNull Throwable t) { + if (t instanceof RuntimeException) { + return AsyncRuntimeException.fillInStackTrace((RuntimeException) t); + } + throw new RuntimeException(t); + } + private static class Entry { static final @NotNull Object CANCELLED = new Object(); From 6d8cfcb7b40f9b76ab91a7050c7dc2b5578ef698 Mon Sep 17 00:00:00 2001 From: Silvio Giebl Date: Tue, 30 Jul 2019 10:42:05 +0200 Subject: [PATCH 3/4] Fixed AsyncRuntimeException fillInStackTrace, exception is now copied --- .../mqtt/mqtt3/Mqtt3BlockingClientView.java | 17 ++++++----- .../exceptions/Mqtt3ExceptionFactory.java | 8 ++++++ .../internal/util/AsyncRuntimeException.java | 28 +++++++++---------- .../exceptions/ConnectionClosedException.java | 10 +++++++ .../exceptions/ConnectionFailedException.java | 10 +++++++ .../exceptions/MqttClientStateException.java | 5 ++++ .../mqtt/exceptions/MqttDecodeException.java | 5 ++++ .../mqtt/exceptions/MqttEncodeException.java | 5 ++++ .../MqttSessionExpiredException.java | 5 ++++ .../exceptions/Mqtt3ConnAckException.java | 5 ++++ .../exceptions/Mqtt3DisconnectException.java | 5 ++++ .../exceptions/Mqtt3PubAckException.java | 5 ++++ .../exceptions/Mqtt3PubRecException.java | 5 ++++ .../exceptions/Mqtt3SubAckException.java | 5 ++++ .../exceptions/Mqtt3UnsubAckException.java | 5 ++++ .../mqtt5/exceptions/Mqtt5AuthException.java | 13 +++++++++ .../exceptions/Mqtt5ConnAckException.java | 13 +++++++++ .../exceptions/Mqtt5DisconnectException.java | 14 ++++++++++ .../exceptions/Mqtt5MessageException.java | 5 ++++ .../exceptions/Mqtt5PubAckException.java | 13 +++++++++ .../exceptions/Mqtt5PubRecException.java | 13 +++++++++ .../exceptions/Mqtt5SubAckException.java | 13 +++++++++ .../exceptions/Mqtt5UnsubAckException.java | 13 +++++++++ 23 files changed, 197 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java index 9058d9f1f..4da63fc78 100644 --- a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java +++ b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/Mqtt3BlockingClientView.java @@ -28,7 +28,6 @@ import com.hivemq.client.internal.mqtt.message.unsubscribe.MqttUnsubscribe; import com.hivemq.client.internal.mqtt.mqtt3.exceptions.Mqtt3ExceptionFactory; import com.hivemq.client.internal.mqtt.util.MqttChecks; -import com.hivemq.client.internal.util.AsyncRuntimeException; import com.hivemq.client.internal.util.Checks; import com.hivemq.client.mqtt.MqttGlobalPublishFilter; import com.hivemq.client.mqtt.mqtt3.Mqtt3AsyncClient; @@ -68,7 +67,7 @@ public class Mqtt3BlockingClientView implements Mqtt3BlockingClient { try { return Mqtt3ConnAckView.of(delegate.connect(mqttConnect)); } catch (final Mqtt5MessageException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -78,7 +77,7 @@ public class Mqtt3BlockingClientView implements Mqtt3BlockingClient { try { return Mqtt3SubAckView.of(delegate.subscribe(mqttSubscribe)); } catch (final Mqtt5MessageException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -95,7 +94,7 @@ public void unsubscribe(final @Nullable Mqtt3Unsubscribe unsubscribe) { try { delegate.unsubscribe(mqttUnsubscribe); } catch (final Mqtt5MessageException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -105,7 +104,7 @@ public void publish(final @Nullable Mqtt3Publish publish) { try { delegate.publish(mqttPublish); } catch (final Mqtt5MessageException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -114,7 +113,7 @@ public void disconnect() { try { delegate.disconnect(Mqtt3DisconnectView.DELEGATE); } catch (final Mqtt5MessageException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -146,7 +145,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { try { return Mqtt3PublishView.of(delegate.receive()); } catch (final RuntimeException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -162,7 +161,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { try { return delegate.receive(timeout, timeUnit).map(Mqtt3PublishView.JAVA_MAPPER); } catch (final RuntimeException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } @@ -171,7 +170,7 @@ private static class Mqtt3PublishesView implements Mqtt3Publishes { try { return delegate.receiveNow().map(Mqtt3PublishView.JAVA_MAPPER); } catch (final RuntimeException e) { - throw AsyncRuntimeException.fillInStackTrace(Mqtt3ExceptionFactory.map(e)); + throw Mqtt3ExceptionFactory.mapWithStackTrace(e); } } diff --git a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java index c8423f124..7353a1d9c 100644 --- a/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java +++ b/src/main/java/com/hivemq/client/internal/mqtt/mqtt3/exceptions/Mqtt3ExceptionFactory.java @@ -57,6 +57,14 @@ public final class Mqtt3ExceptionFactory { return e; } + public static @NotNull RuntimeException mapWithStackTrace(final @NotNull RuntimeException e) { + final RuntimeException mapped = map(e); + if (mapped != e) { + mapped.setStackTrace(e.getStackTrace()); + } + return mapped; + } + public static @NotNull Mqtt3MessageException map(final @NotNull Mqtt5MessageException mqtt5MessageException) { final Mqtt5Message mqttMessage = mqtt5MessageException.getMqttMessage(); final String message = mqtt5MessageException.getMessage(); diff --git a/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java b/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java index 479373e75..acb6cafd9 100644 --- a/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java +++ b/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java @@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; + /** * @author Silvio Giebl */ @@ -27,38 +29,36 @@ public abstract class AsyncRuntimeException extends RuntimeException { public static @NotNull RuntimeException fillInStackTrace(final @NotNull RuntimeException e) { if (e instanceof AsyncRuntimeException) { - e.fillInStackTrace(); + final AsyncRuntimeException copy = ((AsyncRuntimeException) e).copy().superFillInStackTrace(); + final StackTraceElement[] stackTrace = copy.getStackTrace(); + // remove the sync and superFillInStackTrace method calls from the trace + copy.setStackTrace(Arrays.copyOfRange(stackTrace, 2, stackTrace.length)); + return copy; } return e; } - private final boolean afterSuper; - - protected AsyncRuntimeException() { - super(); - afterSuper = true; - } - protected AsyncRuntimeException(final @Nullable String message) { super(message, null); - afterSuper = true; } protected AsyncRuntimeException(final @Nullable String message, final @Nullable Throwable cause) { super(message, cause); - afterSuper = true; } protected AsyncRuntimeException(final @Nullable Throwable cause) { super(cause); - afterSuper = true; } @Override public synchronized @NotNull Throwable fillInStackTrace() { - if (afterSuper) { - return super.fillInStackTrace(); - } return this; } + + private @NotNull AsyncRuntimeException superFillInStackTrace() { + super.fillInStackTrace(); + return this; + } + + protected abstract @NotNull AsyncRuntimeException copy(); } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java index e95048972..03e1ea7bc 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java @@ -19,6 +19,7 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Exception that is used if a MQTT connection is closed without a Disconnect message. @@ -35,4 +36,13 @@ public ConnectionClosedException(final @NotNull String message) { public ConnectionClosedException(final @NotNull Throwable cause) { super(cause); } + + private ConnectionClosedException(final @Nullable String message, final @Nullable Throwable cause) { + super(message, cause); + } + + @Override + protected @NotNull ConnectionClosedException copy() { + return new ConnectionClosedException(getMessage(), getCause()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java index e9b425630..1284bffd6 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java @@ -19,6 +19,7 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Exception that is used if a MQTT connection could not be established. @@ -35,4 +36,13 @@ public ConnectionFailedException(final @NotNull String message) { public ConnectionFailedException(final @NotNull Throwable cause) { super(cause); } + + private ConnectionFailedException(final @Nullable String message, final @Nullable Throwable cause) { + super(message, cause); + } + + @Override + protected @NotNull ConnectionFailedException copy() { + return new ConnectionFailedException(getMessage(), getCause()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java index a9bf2e0cb..bb12c2ed3 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java @@ -32,4 +32,9 @@ public class MqttClientStateException extends AsyncRuntimeException { public MqttClientStateException(final @NotNull String message) { super(message); } + + @Override + protected @NotNull MqttClientStateException copy() { + return new MqttClientStateException(getMessage()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java index aa8609d32..edda0bf5d 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java @@ -31,4 +31,9 @@ public class MqttDecodeException extends AsyncRuntimeException { public MqttDecodeException(final @NotNull String message) { super(message); } + + @Override + protected @NotNull MqttDecodeException copy() { + return new MqttDecodeException(getMessage()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java index 866db6418..9a7a747ce 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java @@ -31,4 +31,9 @@ public class MqttEncodeException extends AsyncRuntimeException { public MqttEncodeException(final @NotNull String message) { super(message); } + + @Override + protected @NotNull MqttEncodeException copy() { + return new MqttEncodeException(getMessage()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java index 6cabbfbb2..ffd97bfba 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java @@ -31,4 +31,9 @@ public class MqttSessionExpiredException extends AsyncRuntimeException { public MqttSessionExpiredException(final @NotNull String message, final @NotNull Throwable cause) { super(message, cause); } + + @Override + protected @NotNull MqttSessionExpiredException copy() { + return new MqttSessionExpiredException(getMessage(), getCause()); + } } diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java index 86df2d119..386814071 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java @@ -36,6 +36,11 @@ public Mqtt3ConnAckException( this.connAck = connAck; } + @Override + protected @NotNull Mqtt3ConnAckException copy() { + return new Mqtt3ConnAckException(connAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt3ConnAck getMqttMessage() { return connAck; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java index d6b1e0ff7..bae4dd9fc 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java @@ -32,6 +32,11 @@ public Mqtt3DisconnectException(final @Nullable String message, final @Nullable super(message, cause); } + @Override + protected @NotNull Mqtt3DisconnectException copy() { + return new Mqtt3DisconnectException(getMessage(), getCause()); + } + @Override public @NotNull Mqtt3Disconnect getMqttMessage() { return Mqtt3DisconnectView.INSTANCE; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java index 5a8dbfd05..5c6c4ff3c 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java @@ -32,6 +32,11 @@ public Mqtt3PubAckException(final @Nullable String message, final @Nullable Thro super(message, cause); } + @Override + protected @NotNull Mqtt3PubAckException copy() { + return new Mqtt3PubAckException(getMessage(), getCause()); + } + @Override public @NotNull Mqtt3PubAck getMqttMessage() { return Mqtt3PubAckView.INSTANCE; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java index 25e103825..d24b2082c 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java @@ -32,6 +32,11 @@ public Mqtt3PubRecException(final @Nullable String message, final @Nullable Thro super(message, cause); } + @Override + protected @NotNull Mqtt3PubRecException copy() { + return new Mqtt3PubRecException(getMessage(), getCause()); + } + @Override public @NotNull Mqtt3PubRec getMqttMessage() { return Mqtt3PubRecView.INSTANCE; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java index af5a9cefb..4a0abed62 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java @@ -36,6 +36,11 @@ public Mqtt3SubAckException( this.subAck = subAck; } + @Override + protected @NotNull Mqtt3SubAckException copy() { + return new Mqtt3SubAckException(subAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt3SubAck getMqttMessage() { return subAck; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java index b2f2f6e3a..4c3a89a64 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java @@ -32,6 +32,11 @@ public Mqtt3UnsubAckException(final @Nullable String message, final @Nullable Th super(message, cause); } + @Override + protected @NotNull Mqtt3UnsubAckException copy() { + return new Mqtt3UnsubAckException(getMessage(), getCause()); + } + @Override public @NotNull Mqtt3UnsubAck getMqttMessage() { return Mqtt3UnsubAckView.INSTANCE; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java index fdfaf4603..78df0f28e 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.auth.Mqtt5Auth; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5AuthException(final @NotNull Mqtt5Auth auth, final @NotNull String m this.auth = auth; } + private Mqtt5AuthException( + final @NotNull Mqtt5Auth auth, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.auth = auth; + } + + @Override + protected @NotNull Mqtt5AuthException copy() { + return new Mqtt5AuthException(auth, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5Auth getMqttMessage() { return auth; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java index 09d8ba2ec..8b45f468a 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.connect.connack.Mqtt5ConnAck; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5ConnAckException(final @NotNull Mqtt5ConnAck connAck, final @NotNull this.connAck = connAck; } + private Mqtt5ConnAckException( + final @NotNull Mqtt5ConnAck connAck, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.connAck = connAck; + } + + @Override + protected @NotNull Mqtt5ConnAckException copy() { + return new Mqtt5ConnAckException(connAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5ConnAck getMqttMessage() { return connAck; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java index 793434863..d8b0cfd19 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.disconnect.Mqtt5Disconnect; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -38,6 +39,19 @@ public Mqtt5DisconnectException(final @NotNull Mqtt5Disconnect disconnect, final this.disconnect = disconnect; } + private Mqtt5DisconnectException( + final @NotNull Mqtt5Disconnect disconnect, final @Nullable String message, + final @Nullable Throwable cause) { + + super(message, cause); + this.disconnect = disconnect; + } + + @Override + protected @NotNull Mqtt5DisconnectException copy() { + return new Mqtt5DisconnectException(disconnect, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5Disconnect getMqttMessage() { return disconnect; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java index 926bef9be..ddae01055 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java @@ -20,6 +20,7 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import com.hivemq.client.mqtt.mqtt5.message.Mqtt5Message; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -35,5 +36,9 @@ public abstract class Mqtt5MessageException extends AsyncRuntimeException { super(cause.getMessage(), cause); } + Mqtt5MessageException(final @Nullable String message, final @Nullable Throwable cause) { + super(message, cause); + } + public abstract @NotNull Mqtt5Message getMqttMessage(); } diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java index 005f6bf34..f44844f8c 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.publish.puback.Mqtt5PubAck; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5PubAckException(final @NotNull Mqtt5PubAck pubAck, final @NotNull St this.pubAck = pubAck; } + private Mqtt5PubAckException( + final @NotNull Mqtt5PubAck pubAck, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.pubAck = pubAck; + } + + @Override + protected @NotNull Mqtt5PubAckException copy() { + return new Mqtt5PubAckException(pubAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5PubAck getMqttMessage() { return pubAck; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java index 287bc1a6e..e319c385f 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.publish.pubrec.Mqtt5PubRec; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5PubRecException(final @NotNull Mqtt5PubRec pubRec, final @NotNull St this.pubRec = pubRec; } + private Mqtt5PubRecException( + final @NotNull Mqtt5PubRec pubRec, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.pubRec = pubRec; + } + + @Override + protected @NotNull Mqtt5PubRecException copy() { + return new Mqtt5PubRecException(pubRec, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5PubRec getMqttMessage() { return pubRec; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java index ddc4d2265..9ba2f2c0d 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.subscribe.suback.Mqtt5SubAck; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5SubAckException(final @NotNull Mqtt5SubAck subAck, final @NotNull St this.subAck = subAck; } + private Mqtt5SubAckException( + final @NotNull Mqtt5SubAck subAck, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.subAck = subAck; + } + + @Override + protected @NotNull Mqtt5SubAckException copy() { + return new Mqtt5SubAckException(subAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5SubAck getMqttMessage() { return subAck; diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java index 83f4934c9..e44c66bc0 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java @@ -19,6 +19,7 @@ import com.hivemq.client.mqtt.mqtt5.message.unsubscribe.unsuback.Mqtt5UnsubAck; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -33,6 +34,18 @@ public Mqtt5UnsubAckException(final @NotNull Mqtt5UnsubAck unsubAck, final @NotN this.unsubAck = unsubAck; } + private Mqtt5UnsubAckException( + final @NotNull Mqtt5UnsubAck unsubAck, final @Nullable String message, final @Nullable Throwable cause) { + + super(message, cause); + this.unsubAck = unsubAck; + } + + @Override + protected @NotNull Mqtt5UnsubAckException copy() { + return new Mqtt5UnsubAckException(unsubAck, getMessage(), getCause()); + } + @Override public @NotNull Mqtt5UnsubAck getMqttMessage() { return unsubAck; From 3a7a0cea190663f526b7c47172c0112cb414053a Mon Sep 17 00:00:00 2001 From: Silvio Giebl Date: Mon, 5 Aug 2019 11:11:51 +0200 Subject: [PATCH 4/4] Improved AsyncRuntimeException.fillInStackTrace --- .../internal/util/AsyncRuntimeException.java | 25 +++++++++++++------ .../exceptions/ConnectionClosedException.java | 7 +++--- .../exceptions/ConnectionFailedException.java | 7 +++--- .../exceptions/MqttClientStateException.java | 6 ++++- .../mqtt/exceptions/MqttDecodeException.java | 6 ++++- .../mqtt/exceptions/MqttEncodeException.java | 6 ++++- .../MqttSessionExpiredException.java | 6 ++++- .../exceptions/Mqtt3ConnAckException.java | 7 +++++- .../exceptions/Mqtt3DisconnectException.java | 6 ++++- .../exceptions/Mqtt3MessageException.java | 4 +++ .../exceptions/Mqtt3PubAckException.java | 6 ++++- .../exceptions/Mqtt3PubRecException.java | 6 ++++- .../exceptions/Mqtt3SubAckException.java | 7 +++++- .../exceptions/Mqtt3UnsubAckException.java | 6 ++++- .../mqtt5/exceptions/Mqtt5AuthException.java | 11 +++----- .../exceptions/Mqtt5ConnAckException.java | 11 +++----- .../exceptions/Mqtt5DisconnectException.java | 12 +++------ .../exceptions/Mqtt5MessageException.java | 5 ++-- .../exceptions/Mqtt5PubAckException.java | 11 +++----- .../exceptions/Mqtt5PubRecException.java | 11 +++----- .../exceptions/Mqtt5SubAckException.java | 11 +++----- .../exceptions/Mqtt5UnsubAckException.java | 11 +++----- 22 files changed, 109 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java b/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java index acb6cafd9..8684652d7 100644 --- a/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java +++ b/src/main/java/com/hivemq/client/internal/util/AsyncRuntimeException.java @@ -29,10 +29,19 @@ public abstract class AsyncRuntimeException extends RuntimeException { public static @NotNull RuntimeException fillInStackTrace(final @NotNull RuntimeException e) { if (e instanceof AsyncRuntimeException) { - final AsyncRuntimeException copy = ((AsyncRuntimeException) e).copy().superFillInStackTrace(); + final AsyncRuntimeException copy = ((AsyncRuntimeException) e).copy(); final StackTraceElement[] stackTrace = copy.getStackTrace(); - // remove the sync and superFillInStackTrace method calls from the trace - copy.setStackTrace(Arrays.copyOfRange(stackTrace, 2, stackTrace.length)); + // remove the copy and fillInStackTrace method calls from the trace + int remove = 0; + while (remove < stackTrace.length) { + final StackTraceElement stackTraceElement = stackTrace[remove]; + remove++; + if (stackTraceElement.getClassName().equals(AsyncRuntimeException.class.getCanonicalName()) && + stackTraceElement.getMethodName().equals("fillInStackTrace")) { + break; + } + } + copy.setStackTrace(Arrays.copyOfRange(stackTrace, remove, stackTrace.length)); return copy; } return e; @@ -50,13 +59,13 @@ protected AsyncRuntimeException(final @Nullable Throwable cause) { super(cause); } - @Override - public synchronized @NotNull Throwable fillInStackTrace() { - return this; + protected AsyncRuntimeException(final @NotNull AsyncRuntimeException e) { + super(e.getMessage(), e.getCause()); + super.fillInStackTrace(); } - private @NotNull AsyncRuntimeException superFillInStackTrace() { - super.fillInStackTrace(); + @Override + public synchronized @NotNull Throwable fillInStackTrace() { return this; } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java index 03e1ea7bc..da8223376 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionClosedException.java @@ -19,7 +19,6 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Exception that is used if a MQTT connection is closed without a Disconnect message. @@ -37,12 +36,12 @@ public ConnectionClosedException(final @NotNull Throwable cause) { super(cause); } - private ConnectionClosedException(final @Nullable String message, final @Nullable Throwable cause) { - super(message, cause); + private ConnectionClosedException(final @NotNull ConnectionClosedException e) { + super(e); } @Override protected @NotNull ConnectionClosedException copy() { - return new ConnectionClosedException(getMessage(), getCause()); + return new ConnectionClosedException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java index 1284bffd6..488b27555 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/ConnectionFailedException.java @@ -19,7 +19,6 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Exception that is used if a MQTT connection could not be established. @@ -37,12 +36,12 @@ public ConnectionFailedException(final @NotNull Throwable cause) { super(cause); } - private ConnectionFailedException(final @Nullable String message, final @Nullable Throwable cause) { - super(message, cause); + private ConnectionFailedException(final @NotNull ConnectionFailedException e) { + super(e); } @Override protected @NotNull ConnectionFailedException copy() { - return new ConnectionFailedException(getMessage(), getCause()); + return new ConnectionFailedException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java index bb12c2ed3..b7f347693 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttClientStateException.java @@ -33,8 +33,12 @@ public MqttClientStateException(final @NotNull String message) { super(message); } + private MqttClientStateException(final @NotNull MqttClientStateException e) { + super(e); + } + @Override protected @NotNull MqttClientStateException copy() { - return new MqttClientStateException(getMessage()); + return new MqttClientStateException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java index edda0bf5d..48d534f0e 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttDecodeException.java @@ -32,8 +32,12 @@ public MqttDecodeException(final @NotNull String message) { super(message); } + private MqttDecodeException(final @NotNull MqttDecodeException e) { + super(e); + } + @Override protected @NotNull MqttDecodeException copy() { - return new MqttDecodeException(getMessage()); + return new MqttDecodeException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java index 9a7a747ce..af219d548 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttEncodeException.java @@ -32,8 +32,12 @@ public MqttEncodeException(final @NotNull String message) { super(message); } + private MqttEncodeException(final @NotNull MqttEncodeException e) { + super(e); + } + @Override protected @NotNull MqttEncodeException copy() { - return new MqttEncodeException(getMessage()); + return new MqttEncodeException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java index ffd97bfba..aa4afcc52 100644 --- a/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java +++ b/src/main/java/com/hivemq/client/mqtt/exceptions/MqttSessionExpiredException.java @@ -32,8 +32,12 @@ public MqttSessionExpiredException(final @NotNull String message, final @NotNull super(message, cause); } + private MqttSessionExpiredException(final @NotNull MqttSessionExpiredException e) { + super(e); + } + @Override protected @NotNull MqttSessionExpiredException copy() { - return new MqttSessionExpiredException(getMessage(), getCause()); + return new MqttSessionExpiredException(this); } } diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java index 386814071..d2c699220 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3ConnAckException.java @@ -36,9 +36,14 @@ public Mqtt3ConnAckException( this.connAck = connAck; } + private Mqtt3ConnAckException(final @NotNull Mqtt3ConnAckException e) { + super(e); + connAck = e.connAck; + } + @Override protected @NotNull Mqtt3ConnAckException copy() { - return new Mqtt3ConnAckException(connAck, getMessage(), getCause()); + return new Mqtt3ConnAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java index bae4dd9fc..ede1de705 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3DisconnectException.java @@ -32,9 +32,13 @@ public Mqtt3DisconnectException(final @Nullable String message, final @Nullable super(message, cause); } + private Mqtt3DisconnectException(final @NotNull Mqtt3DisconnectException e) { + super(e); + } + @Override protected @NotNull Mqtt3DisconnectException copy() { - return new Mqtt3DisconnectException(getMessage(), getCause()); + return new Mqtt3DisconnectException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3MessageException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3MessageException.java index 7ed6980d9..0e1712803 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3MessageException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3MessageException.java @@ -33,5 +33,9 @@ public abstract class Mqtt3MessageException extends AsyncRuntimeException { super(message, cause); } + Mqtt3MessageException(final @NotNull Mqtt3MessageException e) { + super(e); + } + public abstract @NotNull Mqtt3Message getMqttMessage(); } diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java index 5c6c4ff3c..f339d54cd 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubAckException.java @@ -32,9 +32,13 @@ public Mqtt3PubAckException(final @Nullable String message, final @Nullable Thro super(message, cause); } + private Mqtt3PubAckException(final @NotNull Mqtt3PubAckException e) { + super(e); + } + @Override protected @NotNull Mqtt3PubAckException copy() { - return new Mqtt3PubAckException(getMessage(), getCause()); + return new Mqtt3PubAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java index d24b2082c..0e5db560d 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3PubRecException.java @@ -32,9 +32,13 @@ public Mqtt3PubRecException(final @Nullable String message, final @Nullable Thro super(message, cause); } + private Mqtt3PubRecException(final @NotNull Mqtt3PubRecException e) { + super(e); + } + @Override protected @NotNull Mqtt3PubRecException copy() { - return new Mqtt3PubRecException(getMessage(), getCause()); + return new Mqtt3PubRecException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java index 4a0abed62..7a5af0f66 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3SubAckException.java @@ -36,9 +36,14 @@ public Mqtt3SubAckException( this.subAck = subAck; } + private Mqtt3SubAckException(final @NotNull Mqtt3SubAckException e) { + super(e); + subAck = e.subAck; + } + @Override protected @NotNull Mqtt3SubAckException copy() { - return new Mqtt3SubAckException(subAck, getMessage(), getCause()); + return new Mqtt3SubAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java index 4c3a89a64..3ddf1431a 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt3/exceptions/Mqtt3UnsubAckException.java @@ -32,9 +32,13 @@ public Mqtt3UnsubAckException(final @Nullable String message, final @Nullable Th super(message, cause); } + private Mqtt3UnsubAckException(final @NotNull Mqtt3UnsubAckException e) { + super(e); + } + @Override protected @NotNull Mqtt3UnsubAckException copy() { - return new Mqtt3UnsubAckException(getMessage(), getCause()); + return new Mqtt3UnsubAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java index 78df0f28e..0ac1ada78 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5AuthException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.auth.Mqtt5Auth; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5AuthException(final @NotNull Mqtt5Auth auth, final @NotNull String m this.auth = auth; } - private Mqtt5AuthException( - final @NotNull Mqtt5Auth auth, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.auth = auth; + private Mqtt5AuthException(final @NotNull Mqtt5AuthException e) { + super(e); + auth = e.auth; } @Override protected @NotNull Mqtt5AuthException copy() { - return new Mqtt5AuthException(auth, getMessage(), getCause()); + return new Mqtt5AuthException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java index 8b45f468a..574aa5182 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5ConnAckException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.connect.connack.Mqtt5ConnAck; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5ConnAckException(final @NotNull Mqtt5ConnAck connAck, final @NotNull this.connAck = connAck; } - private Mqtt5ConnAckException( - final @NotNull Mqtt5ConnAck connAck, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.connAck = connAck; + private Mqtt5ConnAckException(final @NotNull Mqtt5ConnAckException e) { + super(e); + connAck = e.connAck; } @Override protected @NotNull Mqtt5ConnAckException copy() { - return new Mqtt5ConnAckException(connAck, getMessage(), getCause()); + return new Mqtt5ConnAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java index d8b0cfd19..65ae38cba 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5DisconnectException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.disconnect.Mqtt5Disconnect; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -39,17 +38,14 @@ public Mqtt5DisconnectException(final @NotNull Mqtt5Disconnect disconnect, final this.disconnect = disconnect; } - private Mqtt5DisconnectException( - final @NotNull Mqtt5Disconnect disconnect, final @Nullable String message, - final @Nullable Throwable cause) { - - super(message, cause); - this.disconnect = disconnect; + private Mqtt5DisconnectException(final @NotNull Mqtt5DisconnectException e) { + super(e); + disconnect = e.disconnect; } @Override protected @NotNull Mqtt5DisconnectException copy() { - return new Mqtt5DisconnectException(disconnect, getMessage(), getCause()); + return new Mqtt5DisconnectException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java index ddae01055..f14795335 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5MessageException.java @@ -20,7 +20,6 @@ import com.hivemq.client.internal.util.AsyncRuntimeException; import com.hivemq.client.mqtt.mqtt5.message.Mqtt5Message; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -36,8 +35,8 @@ public abstract class Mqtt5MessageException extends AsyncRuntimeException { super(cause.getMessage(), cause); } - Mqtt5MessageException(final @Nullable String message, final @Nullable Throwable cause) { - super(message, cause); + Mqtt5MessageException(final @NotNull Mqtt5MessageException e) { + super(e); } public abstract @NotNull Mqtt5Message getMqttMessage(); diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java index f44844f8c..878ee2d61 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubAckException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.publish.puback.Mqtt5PubAck; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5PubAckException(final @NotNull Mqtt5PubAck pubAck, final @NotNull St this.pubAck = pubAck; } - private Mqtt5PubAckException( - final @NotNull Mqtt5PubAck pubAck, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.pubAck = pubAck; + private Mqtt5PubAckException(final @NotNull Mqtt5PubAckException e) { + super(e); + pubAck = e.pubAck; } @Override protected @NotNull Mqtt5PubAckException copy() { - return new Mqtt5PubAckException(pubAck, getMessage(), getCause()); + return new Mqtt5PubAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java index e319c385f..bb959220c 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5PubRecException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.publish.pubrec.Mqtt5PubRec; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5PubRecException(final @NotNull Mqtt5PubRec pubRec, final @NotNull St this.pubRec = pubRec; } - private Mqtt5PubRecException( - final @NotNull Mqtt5PubRec pubRec, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.pubRec = pubRec; + private Mqtt5PubRecException(final @NotNull Mqtt5PubRecException e) { + super(e); + pubRec = e.pubRec; } @Override protected @NotNull Mqtt5PubRecException copy() { - return new Mqtt5PubRecException(pubRec, getMessage(), getCause()); + return new Mqtt5PubRecException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java index 9ba2f2c0d..b6ecf7ff3 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5SubAckException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.subscribe.suback.Mqtt5SubAck; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5SubAckException(final @NotNull Mqtt5SubAck subAck, final @NotNull St this.subAck = subAck; } - private Mqtt5SubAckException( - final @NotNull Mqtt5SubAck subAck, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.subAck = subAck; + private Mqtt5SubAckException(final @NotNull Mqtt5SubAckException e) { + super(e); + subAck = e.subAck; } @Override protected @NotNull Mqtt5SubAckException copy() { - return new Mqtt5SubAckException(subAck, getMessage(), getCause()); + return new Mqtt5SubAckException(this); } @Override diff --git a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java index e44c66bc0..f731d9c1b 100644 --- a/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java +++ b/src/main/java/com/hivemq/client/mqtt/mqtt5/exceptions/Mqtt5UnsubAckException.java @@ -19,7 +19,6 @@ import com.hivemq.client.mqtt.mqtt5.message.unsubscribe.unsuback.Mqtt5UnsubAck; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Silvio Giebl @@ -34,16 +33,14 @@ public Mqtt5UnsubAckException(final @NotNull Mqtt5UnsubAck unsubAck, final @NotN this.unsubAck = unsubAck; } - private Mqtt5UnsubAckException( - final @NotNull Mqtt5UnsubAck unsubAck, final @Nullable String message, final @Nullable Throwable cause) { - - super(message, cause); - this.unsubAck = unsubAck; + private Mqtt5UnsubAckException(final @NotNull Mqtt5UnsubAckException e) { + super(e); + unsubAck = e.unsubAck; } @Override protected @NotNull Mqtt5UnsubAckException copy() { - return new Mqtt5UnsubAckException(unsubAck, getMessage(), getCause()); + return new Mqtt5UnsubAckException(this); } @Override