20
20
import java .util .ArrayList ;
21
21
import java .util .List ;
22
22
import java .util .function .Consumer ;
23
+ import java .util .stream .Stream ;
23
24
24
25
import io .rsocket .RSocketFactory ;
25
26
import io .rsocket .transport .ClientTransport ;
28
29
import reactor .core .publisher .Mono ;
29
30
30
31
import org .springframework .lang .Nullable ;
32
+ import org .springframework .util .Assert ;
31
33
import org .springframework .util .MimeType ;
32
34
33
35
/**
39
41
*/
40
42
final class DefaultRSocketRequesterBuilder implements RSocketRequester .Builder {
41
43
44
+ @ Nullable
45
+ private MimeType dataMimeType ;
46
+
42
47
private List <Consumer <RSocketFactory .ClientRSocketFactory >> factoryConfigurers = new ArrayList <>();
43
48
44
49
@ Nullable
@@ -47,6 +52,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
47
52
private List <Consumer <RSocketStrategies .Builder >> strategiesConfigurers = new ArrayList <>();
48
53
49
54
55
+ @ Override
56
+ public RSocketRequester .Builder dataMimeType (MimeType mimeType ) {
57
+ this .dataMimeType = mimeType ;
58
+ return this ;
59
+ }
60
+
50
61
@ Override
51
62
public RSocketRequester .Builder rsocketFactory (Consumer <RSocketFactory .ClientRSocketFactory > configurer ) {
52
63
this .factoryConfigurers .add (configurer );
@@ -81,17 +92,15 @@ public Mono<RSocketRequester> connect(ClientTransport transport) {
81
92
}
82
93
83
94
private Mono <RSocketRequester > doConnect (ClientTransport transport ) {
84
- RSocketStrategies rsocketStrategies = getRSocketStrategies ();
85
- RSocketFactory .ClientRSocketFactory rsocketFactory = RSocketFactory .connect ();
86
95
87
- // 1. Apply default settings
88
- MimeType dataMimeType = getDefaultDataMimeType (rsocketStrategies );
89
- if (dataMimeType != null ) {
90
- rsocketFactory .dataMimeType (dataMimeType .toString ());
91
- }
96
+ RSocketStrategies rsocketStrategies = getRSocketStrategies ();
97
+ Assert .isTrue (!rsocketStrategies .encoders ().isEmpty (), "No encoders" );
98
+ Assert .isTrue (!rsocketStrategies .decoders ().isEmpty (), "No decoders" );
92
99
93
- // 2. Application customizations
94
- this .factoryConfigurers .forEach (c -> c .accept (rsocketFactory ));
100
+ RSocketFactory .ClientRSocketFactory rsocketFactory = RSocketFactory .connect ();
101
+ MimeType dataMimeType = getDataMimeType (rsocketStrategies );
102
+ rsocketFactory .dataMimeType (dataMimeType .toString ());
103
+ this .factoryConfigurers .forEach (consumer -> consumer .accept (rsocketFactory ));
95
104
96
105
return rsocketFactory .transport (transport ).start ()
97
106
.map (rsocket -> new DefaultRSocketRequester (rsocket , dataMimeType , rsocketStrategies ));
@@ -109,18 +118,20 @@ private RSocketStrategies getRSocketStrategies() {
109
118
}
110
119
}
111
120
112
- @ Nullable
113
- private MimeType getDefaultDataMimeType (RSocketStrategies strategies ) {
114
- return strategies .encoders ().stream ()
115
- .flatMap (encoder -> encoder .getEncodableMimeTypes ().stream ())
116
- .filter (MimeType ::isConcrete )
117
- .findFirst ()
118
- .orElseGet (() ->
121
+ private MimeType getDataMimeType (RSocketStrategies strategies ) {
122
+ if (this .dataMimeType != null ) {
123
+ return this .dataMimeType ;
124
+ }
125
+ return Stream
126
+ .concat (
127
+ strategies .encoders ().stream ()
128
+ .flatMap (encoder -> encoder .getEncodableMimeTypes ().stream ()),
119
129
strategies .decoders ().stream ()
120
130
.flatMap (encoder -> encoder .getDecodableMimeTypes ().stream ())
121
- .filter (MimeType ::isConcrete )
122
- .findFirst ()
123
- .orElse (null ));
131
+ )
132
+ .filter (MimeType ::isConcrete )
133
+ .findFirst ()
134
+ .orElseThrow (() -> new IllegalArgumentException ("Failed to select data MimeType to use." ));
124
135
}
125
136
126
137
}
0 commit comments