15
15
*/
16
16
package com .hivemq .bootstrap ;
17
17
18
- import com .google .common .annotations .VisibleForTesting ;
19
18
import com .google .common .util .concurrent .SettableFuture ;
20
19
import com .hivemq .configuration .service .entity .Listener ;
21
- import org .jetbrains .annotations .NotNull ;
22
- import org .jetbrains .annotations .Nullable ;
23
20
import com .hivemq .extension .sdk .api .client .parameter .ClientInformation ;
24
21
import com .hivemq .extension .sdk .api .client .parameter .ConnectionInformation ;
25
22
import com .hivemq .extension .sdk .api .packets .auth .ModifiableDefaultPermissions ;
37
34
import com .hivemq .security .auth .SslClientCertificate ;
38
35
import io .netty .channel .Channel ;
39
36
import io .netty .util .AttributeKey ;
37
+ import org .jetbrains .annotations .NotNull ;
38
+ import org .jetbrains .annotations .Nullable ;
40
39
41
40
import java .net .InetAddress ;
42
41
import java .net .InetSocketAddress ;
47
46
import java .util .Optional ;
48
47
import java .util .concurrent .ScheduledFuture ;
49
48
import java .util .concurrent .atomic .AtomicInteger ;
49
+ import java .util .concurrent .atomic .AtomicReference ;
50
50
51
51
public class ClientConnection {
52
52
53
53
/**
54
54
* The name of the {@link Channel} attribute which the client connection information is stored in.
55
55
*/
56
- public static final AttributeKey <ClientConnection > CHANNEL_ATTRIBUTE_NAME =
56
+ public static final @ NotNull AttributeKey <ClientConnection > CHANNEL_ATTRIBUTE_NAME =
57
57
AttributeKey .valueOf ("Client.Connection" );
58
58
59
59
private final @ NotNull Channel channel ;
60
60
private final @ NotNull PublishFlushHandler publishFlushHandler ;
61
- private volatile @ NotNull ClientState clientState = ClientState .CONNECTING ;
61
+ private final @ NotNull FreePacketIdRanges messageIDPool ;
62
+ private final @ NotNull AtomicReference <ClientState > clientState ;
63
+ private final @ NotNull HashMap <String , Object > additionalInformation ;
62
64
private @ Nullable ProtocolVersion protocolVersion ;
63
65
private @ Nullable String clientId ;
64
- private boolean cleanStart ;
65
66
private @ Nullable ModifiableDefaultPermissions authPermissions ;
66
67
private @ Nullable Listener connectedListener ;
67
68
private @ Nullable MqttWillPublish willPublish ;
@@ -72,22 +73,19 @@ public class ClientConnection {
72
73
private @ Nullable Long clientSessionExpiryInterval ;
73
74
private @ Nullable Long connectReceivedTimestamp ;
74
75
private @ Nullable Long maxPacketSizeSend ;
75
- private @ Nullable String [] topicAliasMapping ;
76
+ private @ Nullable String @ Nullable [] topicAliasMapping ;
77
+ private @ Nullable Boolean requestProblemInformation ;
78
+ private @ Nullable SettableFuture <Void > disconnectFuture ;
79
+ private @ Nullable ConnectionAttributes connectionAttributes ;
76
80
private boolean noSharedSubscription ;
77
81
private boolean clientIdAssigned ;
78
82
private boolean incomingPublishesSkipRest ;
79
83
private boolean incomingPublishesDefaultFailedSkipRest ;
80
84
private boolean requestResponseInformation ;
81
- private @ Nullable Boolean requestProblemInformation ;
82
- private @ Nullable SettableFuture <Void > disconnectFuture ;
83
- private final @ NotNull FreePacketIdRanges messageIDPool ;
84
-
85
- private @ Nullable ConnectionAttributes connectionAttributes ;
86
-
87
- private boolean sendWill = true ;
85
+ private boolean cleanStart ;
86
+ private boolean sendWill ;
88
87
private boolean preventLwt ;
89
88
private boolean inFlightMessagesSent ;
90
-
91
89
private @ Nullable SslClientCertificate authCertificate ;
92
90
private @ Nullable String authSniHostname ;
93
91
private @ Nullable String authCipherSuite ;
@@ -100,20 +98,24 @@ public class ClientConnection {
100
98
private @ Nullable Mqtt5UserProperties authUserProperties ;
101
99
private @ Nullable ScheduledFuture <?> authFuture ;
102
100
private @ Nullable Boolean clearPasswordAfterAuth ;
103
-
104
101
private @ Nullable ClientContextImpl extensionClientContext ;
105
102
private @ Nullable ClientEventListeners extensionClientEventListeners ;
106
103
private @ Nullable ClientAuthenticators extensionClientAuthenticators ;
107
104
private @ Nullable ClientAuthorizers extensionClientAuthorizers ;
108
105
private @ Nullable ClientInformation extensionClientInformation ;
109
106
private @ Nullable ConnectionInformation extensionConnectionInformation ;
110
- private @ NotNull HashMap <String , Object > additionalInformation ;
111
107
112
108
public ClientConnection (final @ NotNull Channel channel , final @ NotNull PublishFlushHandler publishFlushHandler ) {
113
109
this .channel = channel ;
114
110
this .publishFlushHandler = publishFlushHandler ;
115
- messageIDPool = new FreePacketIdRanges ();
111
+ this . messageIDPool = new FreePacketIdRanges ();
116
112
this .additionalInformation = new HashMap <>();
113
+ this .clientState = new AtomicReference <>(ClientState .CONNECTING );
114
+ this .sendWill = true ;
115
+ }
116
+
117
+ public static @ NotNull ClientConnection fromChannel (final @ NotNull Channel channel ) {
118
+ return channel .attr (ClientConnection .CHANNEL_ATTRIBUTE_NAME ).get ();
117
119
}
118
120
119
121
public @ NotNull Channel getChannel () {
@@ -125,20 +127,11 @@ public ClientConnection(final @NotNull Channel channel, final @NotNull PublishFl
125
127
}
126
128
127
129
public @ NotNull ClientState getClientState () {
128
- return clientState ;
130
+ return clientState . get () ;
129
131
}
130
132
131
- public void proposeClientState (final @ NotNull ClientState clientState ) {
132
- if (!this .clientState .disconnected ()) {
133
- this .clientState = clientState ;
134
- }
135
- }
136
-
137
- // ONLY VISIBLE FOR TESTING !!!
138
- // DO NOT USE IN PROD !!!
139
- @ VisibleForTesting ()
140
- public void setClientStateUnsafe (final @ NotNull ClientState clientState ) {
141
- this .clientState = clientState ;
133
+ public void proposeClientState (final @ NotNull ClientState proposed ) {
134
+ clientState .updateAndGet (current -> current .disconnected () ? current : proposed );
142
135
}
143
136
144
137
public @ Nullable ProtocolVersion getProtocolVersion () {
@@ -255,7 +248,7 @@ public int incrementInFlightCount() {
255
248
return inFlightMessageCount .incrementAndGet ();
256
249
}
257
250
258
- public int incrementInFlightCount (int count ) {
251
+ public int incrementInFlightCount (final int count ) {
259
252
if (inFlightMessageCount == null ) {
260
253
inFlightMessageCount = new AtomicInteger (0 );
261
254
}
@@ -292,11 +285,11 @@ public void setMaxPacketSizeSend(final @Nullable Long maxPacketSizeSend) {
292
285
this .maxPacketSizeSend = maxPacketSizeSend ;
293
286
}
294
287
295
- public @ Nullable String [] getTopicAliasMapping () {
288
+ public @ Nullable String @ Nullable [] getTopicAliasMapping () {
296
289
return topicAliasMapping ;
297
290
}
298
291
299
- public void setTopicAliasMapping (final @ Nullable String [] topicAliasMapping ) {
292
+ public void setTopicAliasMapping (final @ Nullable String @ Nullable [] topicAliasMapping ) {
300
293
this .topicAliasMapping = topicAliasMapping ;
301
294
}
302
295
@@ -592,8 +585,8 @@ public void setClearPasswordAfterAuth(final @Nullable Boolean clearPasswordAfter
592
585
return Optional .ofNullable (clearPasswordAfterAuth );
593
586
}
594
587
595
- public void clearPassword (){
596
- if (authPassword == null ) {
588
+ public void clearPassword () {
589
+ if (authPassword == null ) {
597
590
return ;
598
591
}
599
592
Arrays .fill (authPassword , (byte ) 0 );
@@ -603,8 +596,4 @@ public void clearPassword(){
603
596
public @ NotNull HashMap <String , Object > getAdditionalInformation () {
604
597
return additionalInformation ;
605
598
}
606
-
607
- public static @ NotNull ClientConnection fromChannel (Channel channel ) {
608
- return channel .attr (ClientConnection .CHANNEL_ATTRIBUTE_NAME ).get ();
609
- }
610
599
}
0 commit comments