Skip to content

Commit 1e9ccdd

Browse files
committed
Pass RSocketStrategies to MetadataExtractor
Simplify the creation of MetadataExtractor by not requiring RSocketStrategies up front. The strategies are already configured in higher level places like RSocketMessageHandler that invoke the MetadataExtractor. The strategies are now passed in as an argument to the extract method.
1 parent d33e487 commit 1e9ccdd

File tree

5 files changed

+33
-34
lines changed

5 files changed

+33
-34
lines changed

spring-messaging/src/main/java/org/springframework/messaging/rsocket/DefaultMetadataExtractor.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.springframework.core.io.buffer.DataBufferFactory;
3232
import org.springframework.core.io.buffer.NettyDataBufferFactory;
3333
import org.springframework.lang.Nullable;
34-
import org.springframework.util.Assert;
3534
import org.springframework.util.MimeType;
3635

3736
/**
@@ -48,17 +47,13 @@
4847
*/
4948
public class DefaultMetadataExtractor implements MetadataExtractor {
5049

51-
private final RSocketStrategies rsocketStrategies;
52-
5350
private final Map<String, EntryProcessor<?>> entryProcessors = new HashMap<>();
5451

5552

5653
/**
5754
* Default constructor with {@link RSocketStrategies}.
5855
*/
59-
public DefaultMetadataExtractor(RSocketStrategies strategies) {
60-
Assert.notNull(strategies, "RSocketStrategies is required");
61-
this.rsocketStrategies = strategies;
56+
public DefaultMetadataExtractor() {
6257
// TODO: remove when rsocket-core API available
6358
metadataToExtract(MetadataExtractor.ROUTING, String.class, ROUTE_KEY);
6459
}
@@ -128,24 +123,26 @@ public <T> void metadataToExtract(
128123

129124

130125
@Override
131-
public Map<String, Object> extract(Payload payload, MimeType metadataMimeType) {
126+
public Map<String, Object> extract(Payload payload, MimeType metadataMimeType, RSocketStrategies strategies) {
132127
Map<String, Object> result = new HashMap<>();
133128
if (metadataMimeType.equals(COMPOSITE_METADATA)) {
134129
for (CompositeMetadata.Entry entry : new CompositeMetadata(payload.metadata(), false)) {
135-
processEntry(entry.getContent(), entry.getMimeType(), result);
130+
processEntry(entry.getContent(), entry.getMimeType(), result, strategies);
136131
}
137132
}
138133
else {
139-
processEntry(payload.metadata(), metadataMimeType.toString(), result);
134+
processEntry(payload.metadata(), metadataMimeType.toString(), result, strategies);
140135
}
141136
return result;
142137
}
143138

144-
private void processEntry(ByteBuf content, @Nullable String mimeType, Map<String, Object> result) {
139+
private void processEntry(ByteBuf content,
140+
@Nullable String mimeType, Map<String, Object> result, RSocketStrategies strategies) {
141+
145142
EntryProcessor<?> entryProcessor = this.entryProcessors.get(mimeType);
146143
if (entryProcessor != null) {
147144
content.retain();
148-
entryProcessor.process(content, result);
145+
entryProcessor.process(content, result, strategies);
149146
return;
150147
}
151148
if (MetadataExtractor.ROUTING.toString().equals(mimeType)) {
@@ -166,8 +163,6 @@ private class EntryProcessor<T> {
166163

167164
private final BiConsumer<T, Map<String, Object>> accumulator;
168165

169-
private final Decoder<T> decoder;
170-
171166

172167
public EntryProcessor(
173168
MimeType mimeType, Class<T> targetType,
@@ -190,17 +185,17 @@ private EntryProcessor(
190185
this.mimeType = mimeType;
191186
this.targetType = targetType;
192187
this.accumulator = accumulator;
193-
this.decoder = rsocketStrategies.decoder(targetType, mimeType);
194188
}
195189

196190

197-
public void process(ByteBuf byteBuf, Map<String, Object> result) {
198-
DataBufferFactory factory = rsocketStrategies.dataBufferFactory();
191+
public void process(ByteBuf byteBuf, Map<String, Object> result, RSocketStrategies strategies) {
192+
DataBufferFactory factory = strategies.dataBufferFactory();
199193
DataBuffer buffer = factory instanceof NettyDataBufferFactory ?
200194
((NettyDataBufferFactory) factory).wrap(byteBuf) :
201195
factory.wrap(byteBuf.nioBuffer());
202196

203-
T value = this.decoder.decode(buffer, this.targetType, this.mimeType, Collections.emptyMap());
197+
Decoder<T> decoder = strategies.decoder(this.targetType, this.mimeType);
198+
T value = decoder.decode(buffer, this.targetType, this.mimeType, Collections.emptyMap());
204199
this.accumulator.accept(value, result);
205200
}
206201
}

spring-messaging/src/main/java/org/springframework/messaging/rsocket/MetadataExtractor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ public interface MetadataExtractor {
5858
* @param payload the payload whose metadata should be read
5959
* @param metadataMimeType the mime type of the metadata; this is what was
6060
* specified by the client at the start of the RSocket connection.
61+
* @param strategies for access to codecs and a DataBufferFactory
6162
* @return a map of 0 or more decoded metadata values with assigned names
6263
*/
63-
Map<String, Object> extract(Payload payload, MimeType metadataMimeType);
64+
Map<String, Object> extract(Payload payload, MimeType metadataMimeType, RSocketStrategies strategies);
6465

6566
}

spring-messaging/src/main/java/org/springframework/messaging/rsocket/annotation/support/MessagingRSocket.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import reactor.core.publisher.MonoProcessor;
3232

3333
import org.springframework.core.io.buffer.DataBuffer;
34-
import org.springframework.core.io.buffer.DataBufferFactory;
3534
import org.springframework.core.io.buffer.DataBufferUtils;
3635
import org.springframework.core.io.buffer.NettyDataBuffer;
3736
import org.springframework.lang.Nullable;
@@ -43,6 +42,7 @@
4342
import org.springframework.messaging.rsocket.MetadataExtractor;
4443
import org.springframework.messaging.rsocket.PayloadUtils;
4544
import org.springframework.messaging.rsocket.RSocketRequester;
45+
import org.springframework.messaging.rsocket.RSocketStrategies;
4646
import org.springframework.messaging.support.MessageBuilder;
4747
import org.springframework.messaging.support.MessageHeaderAccessor;
4848
import org.springframework.util.Assert;
@@ -73,28 +73,28 @@ class MessagingRSocket extends AbstractRSocket {
7373

7474
private final RSocketRequester requester;
7575

76-
private final DataBufferFactory bufferFactory;
76+
private final RSocketStrategies strategies;
7777

7878

7979
MessagingRSocket(MimeType dataMimeType, MimeType metadataMimeType, MetadataExtractor metadataExtractor,
8080
RSocketRequester requester, ReactiveMessageHandler messageHandler,
81-
RouteMatcher routeMatcher, DataBufferFactory bufferFactory) {
81+
RouteMatcher routeMatcher, RSocketStrategies strategies) {
8282

8383
Assert.notNull(dataMimeType, "'dataMimeType' is required");
8484
Assert.notNull(metadataMimeType, "'metadataMimeType' is required");
8585
Assert.notNull(metadataExtractor, "'metadataExtractor' is required");
8686
Assert.notNull(requester, "'requester' is required");
8787
Assert.notNull(messageHandler, "'messageHandler' is required");
8888
Assert.notNull(routeMatcher, "'routeMatcher' is required");
89-
Assert.notNull(bufferFactory, "'bufferFactory' is required");
89+
Assert.notNull(strategies, "RSocketStrategies is required");
9090

9191
this.dataMimeType = dataMimeType;
9292
this.metadataMimeType = metadataMimeType;
9393
this.metadataExtractor = metadataExtractor;
9494
this.requester = requester;
9595
this.messageHandler = messageHandler;
9696
this.routeMatcher = routeMatcher;
97-
this.bufferFactory = bufferFactory;
97+
this.strategies = strategies;
9898
}
9999

100100

@@ -183,7 +183,7 @@ private Flux<Payload> handleAndReply(Payload firstPayload, FrameType frameType,
183183
}
184184

185185
private DataBuffer retainDataAndReleasePayload(Payload payload) {
186-
return PayloadUtils.retainDataAndReleasePayload(payload, this.bufferFactory);
186+
return PayloadUtils.retainDataAndReleasePayload(payload, this.strategies.dataBufferFactory());
187187
}
188188

189189
private MessageHeaders createHeaders(Payload payload, FrameType frameType,
@@ -192,7 +192,9 @@ private MessageHeaders createHeaders(Payload payload, FrameType frameType,
192192
MessageHeaderAccessor headers = new MessageHeaderAccessor();
193193
headers.setLeaveMutable(true);
194194

195-
Map<String, Object> metadataValues = this.metadataExtractor.extract(payload, this.metadataMimeType);
195+
Map<String, Object> metadataValues =
196+
this.metadataExtractor.extract(payload, this.metadataMimeType, this.strategies);
197+
196198
metadataValues.putIfAbsent(MetadataExtractor.ROUTE_KEY, "");
197199
for (Map.Entry<String, Object> entry : metadataValues.entrySet()) {
198200
if (entry.getKey().equals(MetadataExtractor.ROUTE_KEY)) {
@@ -210,7 +212,8 @@ private MessageHeaders createHeaders(Payload payload, FrameType frameType,
210212
if (replyMono != null) {
211213
headers.setHeader(RSocketPayloadReturnValueHandler.RESPONSE_HEADER, replyMono);
212214
}
213-
headers.setHeader(HandlerMethodReturnValueHandler.DATA_BUFFER_FACTORY_HEADER, this.bufferFactory);
215+
headers.setHeader(HandlerMethodReturnValueHandler.DATA_BUFFER_FACTORY_HEADER,
216+
this.strategies.dataBufferFactory());
214217

215218
return headers.getMessageHeaders();
216219
}

spring-messaging/src/main/java/org/springframework/messaging/rsocket/annotation/support/RSocketMessageHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public void afterPropertiesSet() {
208208
.build();
209209
}
210210
if (this.metadataExtractor == null) {
211-
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(this.rsocketStrategies);
211+
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor();
212212
extractor.metadataToExtract(MimeTypeUtils.TEXT_PLAIN, String.class, MetadataExtractor.ROUTE_KEY);
213213
this.metadataExtractor = extractor;
214214
}
@@ -318,7 +318,7 @@ private MessagingRSocket createResponder(ConnectionSetupPayload setupPayload, RS
318318
Assert.notNull(this.metadataExtractor, () -> "No MetadataExtractor. Was afterPropertiesSet not called?");
319319

320320
return new MessagingRSocket(dataMimeType, metadataMimeType, this.metadataExtractor, requester,
321-
this, getRouteMatcher(), strategies.dataBufferFactory());
321+
this, getRouteMatcher(), strategies);
322322
}
323323

324324
}

spring-messaging/src/test/java/org/springframework/messaging/rsocket/DefaultMetadataExtractorTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void setUp() {
7070
this.captor = ArgumentCaptor.forClass(Payload.class);
7171
BDDMockito.when(this.rsocket.fireAndForget(captor.capture())).thenReturn(Mono.empty());
7272

73-
this.extractor = new DefaultMetadataExtractor(this.strategies);
73+
this.extractor = new DefaultMetadataExtractor();
7474
}
7575

7676
@After
@@ -91,7 +91,7 @@ public void compositeMetadataWithDefaultSettings() {
9191
.send().block();
9292

9393
Payload payload = this.captor.getValue();
94-
Map<String, Object> result = this.extractor.extract(payload, COMPOSITE_METADATA);
94+
Map<String, Object> result = this.extractor.extract(payload, COMPOSITE_METADATA, this.strategies);
9595
payload.release();
9696

9797
assertThat(result).hasSize(1).containsEntry(ROUTE_KEY, "toA");
@@ -113,7 +113,7 @@ public void compositeMetadataWithMimeTypeRegistrations() {
113113
.block();
114114

115115
Payload payload = this.captor.getValue();
116-
Map<String, Object> result = this.extractor.extract(payload, COMPOSITE_METADATA);
116+
Map<String, Object> result = this.extractor.extract(payload, COMPOSITE_METADATA, this.strategies);
117117
payload.release();
118118

119119
assertThat(result).hasSize(4)
@@ -128,7 +128,7 @@ public void route() {
128128

129129
requester(ROUTING).route("toA").data("data").send().block();
130130
Payload payload = this.captor.getValue();
131-
Map<String, Object> result = this.extractor.extract(payload, ROUTING);
131+
Map<String, Object> result = this.extractor.extract(payload, ROUTING, this.strategies);
132132
payload.release();
133133

134134
assertThat(result).hasSize(1).containsEntry(ROUTE_KEY, "toA");
@@ -141,7 +141,7 @@ public void routeAsText() {
141141

142142
requester(TEXT_PLAIN).route("toA").data("data").send().block();
143143
Payload payload = this.captor.getValue();
144-
Map<String, Object> result = this.extractor.extract(payload, TEXT_PLAIN);
144+
Map<String, Object> result = this.extractor.extract(payload, TEXT_PLAIN, this.strategies);
145145
payload.release();
146146

147147
assertThat(result).hasSize(1).containsEntry(ROUTE_KEY, "toA");
@@ -159,7 +159,7 @@ public void routeWithCustomFormatting() {
159159

160160
requester(TEXT_PLAIN).metadata("toA:text data", null).data("data").send().block();
161161
Payload payload = this.captor.getValue();
162-
Map<String, Object> result = this.extractor.extract(payload, TEXT_PLAIN);
162+
Map<String, Object> result = this.extractor.extract(payload, TEXT_PLAIN, this.strategies);
163163
payload.release();
164164

165165
assertThat(result).hasSize(2)

0 commit comments

Comments
 (0)