@ -20,6 +20,7 @@ import java.net.URI;
@@ -20,6 +20,7 @@ import java.net.URI;
import java.util.ArrayList ;
import java.util.List ;
import java.util.function.Consumer ;
import java.util.stream.Stream ;
import io.rsocket.RSocketFactory ;
import io.rsocket.transport.ClientTransport ;
@ -28,6 +29,7 @@ import io.rsocket.transport.netty.client.WebsocketClientTransport;
@@ -28,6 +29,7 @@ import io.rsocket.transport.netty.client.WebsocketClientTransport;
import reactor.core.publisher.Mono ;
import org.springframework.lang.Nullable ;
import org.springframework.util.Assert ;
import org.springframework.util.MimeType ;
/ * *
@ -39,6 +41,9 @@ import org.springframework.util.MimeType;
@@ -39,6 +41,9 @@ import org.springframework.util.MimeType;
* /
final class DefaultRSocketRequesterBuilder implements RSocketRequester . Builder {
@Nullable
private MimeType dataMimeType ;
private List < Consumer < RSocketFactory . ClientRSocketFactory > > factoryConfigurers = new ArrayList < > ( ) ;
@Nullable
@ -47,6 +52,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
@@ -47,6 +52,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
private List < Consumer < RSocketStrategies . Builder > > strategiesConfigurers = new ArrayList < > ( ) ;
@Override
public RSocketRequester . Builder dataMimeType ( MimeType mimeType ) {
this . dataMimeType = mimeType ;
return this ;
}
@Override
public RSocketRequester . Builder rsocketFactory ( Consumer < RSocketFactory . ClientRSocketFactory > configurer ) {
this . factoryConfigurers . add ( configurer ) ;
@ -81,17 +92,15 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
@@ -81,17 +92,15 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
}
private Mono < RSocketRequester > doConnect ( ClientTransport transport ) {
RSocketStrategies rsocketStrategies = getRSocketStrategies ( ) ;
RSocketFactory . ClientRSocketFactory rsocketFactory = RSocketFactory . connect ( ) ;
// 1. Apply default settings
MimeType dataMimeType = getDefaultDataMimeType ( rsocketStrategies ) ;
if ( dataMimeType ! = null ) {
rsocketFactory . dataMimeType ( dataMimeType . toString ( ) ) ;
}
RSocketStrategies rsocketStrategies = getRSocketStrategies ( ) ;
Assert . isTrue ( ! rsocketStrategies . encoders ( ) . isEmpty ( ) , "No encoders" ) ;
Assert . isTrue ( ! rsocketStrategies . decoders ( ) . isEmpty ( ) , "No decoders" ) ;
// 2. Application customizations
this . factoryConfigurers . forEach ( c - > c . accept ( rsocketFactory ) ) ;
RSocketFactory . ClientRSocketFactory rsocketFactory = RSocketFactory . connect ( ) ;
MimeType dataMimeType = getDataMimeType ( rsocketStrategies ) ;
rsocketFactory . dataMimeType ( dataMimeType . toString ( ) ) ;
this . factoryConfigurers . forEach ( consumer - > consumer . accept ( rsocketFactory ) ) ;
return rsocketFactory . transport ( transport ) . start ( )
. map ( rsocket - > new DefaultRSocketRequester ( rsocket , dataMimeType , rsocketStrategies ) ) ;
@ -109,18 +118,20 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
@@ -109,18 +118,20 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
}
}
@Nullable
private MimeType getDefaultDataMimeType ( RSocketStrategies strategies ) {
return strategies . encoders ( ) . stream ( )
. flatMap ( encoder - > encoder . getEncodableMimeTypes ( ) . stream ( ) )
. filter ( MimeType : : isConcrete )
. findFirst ( )
. orElseGet ( ( ) - >
private MimeType getDataMimeType ( RSocketStrategies strategies ) {
if ( this . dataMimeType ! = null ) {
return this . dataMimeType ;
}
return Stream
. concat (
strategies . encoders ( ) . stream ( )
. flatMap ( encoder - > encoder . getEncodableMimeTypes ( ) . stream ( ) ) ,
strategies . decoders ( ) . stream ( )
. flatMap ( encoder - > encoder . getDecodableMimeTypes ( ) . stream ( ) )
. filter ( MimeType : : isConcrete )
. findFirst ( )
. orElse ( null ) ) ;
)
. filter ( MimeType : : isConcrete )
. findFirst ( )
. orElseThrow ( ( ) - > new IllegalArgumentException ( "Failed to select data MimeType to use." ) ) ;
}
}