Skip to content

Commit 3811a59

Browse files
committed
Avoid unnecessary String concatenation in StompSubProtocolHandler
Issue: SPR-14624 (cherry picked from commit 0735e9b)
1 parent 2a9ca66 commit 3811a59

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java

+33-23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -296,8 +296,10 @@ else if (StompCommand.UNSUBSCRIBE.equals(headerAccessor.getCommand())) {
296296
}
297297
}
298298
catch (Throwable ex) {
299-
logger.error("Failed to send client message to application via MessageChannel" +
300-
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
299+
if (logger.isErrorEnabled()) {
300+
logger.error("Failed to send client message to application via MessageChannel" +
301+
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
302+
}
301303
handleError(session, ex, message);
302304
}
303305
}
@@ -316,7 +318,7 @@ private void handleError(WebSocketSession session, Throwable ex, Message<byte[]>
316318
}
317319

318320
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
319-
Assert.notNull(accessor, "Expected STOMP headers");
321+
Assert.state(accessor != null, "Expected STOMP headers");
320322
sendToClient(session, accessor, message.getPayload());
321323
}
322324

@@ -365,7 +367,9 @@ private void publishEvent(ApplicationEvent event) {
365367
this.eventPublisher.publishEvent(event);
366368
}
367369
catch (Throwable ex) {
368-
logger.error("Error publishing " + event, ex);
370+
if (logger.isErrorEnabled()) {
371+
logger.error("Error publishing " + event, ex);
372+
}
369373
}
370374
}
371375

@@ -376,27 +380,29 @@ private void publishEvent(ApplicationEvent event) {
376380
@SuppressWarnings("unchecked")
377381
public void handleMessageToClient(WebSocketSession session, Message<?> message) {
378382
if (!(message.getPayload() instanceof byte[])) {
379-
logger.error("Expected byte[] payload. Ignoring " + message + ".");
383+
if (logger.isErrorEnabled()) {
384+
logger.error("Expected byte[] payload. Ignoring " + message + ".");
385+
}
380386
return;
381387
}
382388

383-
StompHeaderAccessor stompAccessor = getStompHeaderAccessor(message);
384-
StompCommand command = stompAccessor.getCommand();
389+
StompHeaderAccessor accessor = getStompHeaderAccessor(message);
390+
StompCommand command = accessor.getCommand();
385391

386392
if (StompCommand.MESSAGE.equals(command)) {
387-
if (stompAccessor.getSubscriptionId() == null) {
393+
if (accessor.getSubscriptionId() == null && logger.isWarnEnabled()) {
388394
logger.warn("No STOMP \"subscription\" header in " + message);
389395
}
390-
String origDestination = stompAccessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
396+
String origDestination = accessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
391397
if (origDestination != null) {
392-
stompAccessor = toMutableAccessor(stompAccessor, message);
393-
stompAccessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
394-
stompAccessor.setDestination(origDestination);
398+
accessor = toMutableAccessor(accessor, message);
399+
accessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
400+
accessor.setDestination(origDestination);
395401
}
396402
}
397403
else if (StompCommand.CONNECTED.equals(command)) {
398404
this.stats.incrementConnectedCount();
399-
stompAccessor = afterStompSessionConnected(message, stompAccessor, session);
405+
accessor = afterStompSessionConnected(message, accessor, session);
400406
if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
401407
try {
402408
SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
@@ -411,25 +417,21 @@ else if (StompCommand.CONNECTED.equals(command)) {
411417
}
412418

413419
byte[] payload = (byte[]) message.getPayload();
414-
415420
if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) {
416421
Message<byte[]> errorMessage = getErrorHandler().handleErrorMessageToClient((Message<byte[]>) message);
417-
stompAccessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
418-
Assert.notNull(stompAccessor, "Expected STOMP headers");
422+
accessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
423+
Assert.state(accessor != null, "Expected STOMP headers");
419424
payload = errorMessage.getPayload();
420425
}
421-
422-
sendToClient(session, stompAccessor, payload);
426+
sendToClient(session, accessor, payload);
423427
}
424428

425429
private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAccessor, byte[] payload) {
426430
StompCommand command = stompAccessor.getCommand();
427431
try {
428432
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
429-
430433
boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession) &&
431434
MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
432-
433435
if (useBinary) {
434436
session.sendMessage(new BinaryMessage(bytes));
435437
}
@@ -443,7 +445,9 @@ private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAcc
443445
}
444446
catch (Throwable ex) {
445447
// Could be part of normal workflow (e.g. browser tab closed)
446-
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
448+
if (logger.isDebugEnabled()) {
449+
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
450+
}
447451
command = StompCommand.ERROR;
448452
}
449453
finally {
@@ -500,9 +504,13 @@ else if (stompAccessor.getCommand() == null || StompCommand.SEND.equals(stompAcc
500504
private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
501505
String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
502506
Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
503-
Assert.notNull(message, "Original STOMP CONNECT not found in " + connectAckHeaders);
507+
if (message == null) {
508+
throw new IllegalStateException("Original STOMP CONNECT not found in " + connectAckHeaders);
509+
}
510+
504511
StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
505512
StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);
513+
506514
Set<String> acceptVersions = connectHeaders.getAcceptVersion();
507515
if (acceptVersions.contains("1.2")) {
508516
connectedHeaders.setVersion("1.2");
@@ -513,13 +521,15 @@ else if (acceptVersions.contains("1.1")) {
513521
else if (!acceptVersions.isEmpty()) {
514522
throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
515523
}
524+
516525
long[] heartbeat = (long[]) connectAckHeaders.getHeader(SimpMessageHeaderAccessor.HEART_BEAT_HEADER);
517526
if (heartbeat != null) {
518527
connectedHeaders.setHeartbeat(heartbeat[0], heartbeat[1]);
519528
}
520529
else {
521530
connectedHeaders.setHeartbeat(0, 0);
522531
}
532+
523533
return connectedHeaders;
524534
}
525535

0 commit comments

Comments
 (0)