From 8e98177fb33597a21c43077a805375045279cd01 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 29 Aug 2016 11:54:21 +0200 Subject: [PATCH] Avoid collection lookups in StompCommand Issue: SPR-14636 (cherry picked from commit 899ebd8) --- .../messaging/simp/stomp/StompCommand.java | 85 +++++++-------- .../simp/stomp/StompCommandTests.java | 100 ++++++++++++++++++ 2 files changed, 141 insertions(+), 44 deletions(-) create mode 100644 spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCommandTests.java diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompCommand.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompCommand.java index 5e5b29309072..8f0fd34bb352 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompCommand.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompCommand.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,79 +16,76 @@ package org.springframework.messaging.simp.stomp; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - import org.springframework.messaging.simp.SimpMessageType; /** * Represents a STOMP command. * * @author Rossen Stoyanchev + * @author Juergen Hoeller * @since 4.0 */ public enum StompCommand { // client - CONNECT, - STOMP, - DISCONNECT, - SUBSCRIBE, - UNSUBSCRIBE, - SEND, - ACK, - NACK, - BEGIN, - COMMIT, - ABORT, + STOMP(SimpMessageType.CONNECT), + CONNECT(SimpMessageType.CONNECT), + DISCONNECT(SimpMessageType.DISCONNECT), + SUBSCRIBE(SimpMessageType.SUBSCRIBE, true, true, false), + UNSUBSCRIBE(SimpMessageType.UNSUBSCRIBE, false, true, false), + SEND(SimpMessageType.MESSAGE, true, false, true), + ACK(SimpMessageType.OTHER), + NACK(SimpMessageType.OTHER), + BEGIN(SimpMessageType.OTHER), + COMMIT(SimpMessageType.OTHER), + ABORT(SimpMessageType.OTHER), // server - CONNECTED, - MESSAGE, - RECEIPT, - ERROR; - - - private static Map messageTypes = new HashMap(); - static { - messageTypes.put(StompCommand.CONNECT, SimpMessageType.CONNECT); - messageTypes.put(StompCommand.STOMP, SimpMessageType.CONNECT); - messageTypes.put(StompCommand.SEND, SimpMessageType.MESSAGE); - messageTypes.put(StompCommand.MESSAGE, SimpMessageType.MESSAGE); - messageTypes.put(StompCommand.SUBSCRIBE, SimpMessageType.SUBSCRIBE); - messageTypes.put(StompCommand.UNSUBSCRIBE, SimpMessageType.UNSUBSCRIBE); - messageTypes.put(StompCommand.DISCONNECT, SimpMessageType.DISCONNECT); - } + CONNECTED(SimpMessageType.OTHER), + RECEIPT(SimpMessageType.OTHER), + MESSAGE(SimpMessageType.MESSAGE, true, true, true), + ERROR(SimpMessageType.OTHER, false, false, true); + - private static Collection destinationRequired = Arrays.asList(SEND, SUBSCRIBE, MESSAGE); - private static Collection subscriptionIdRequired = Arrays.asList(SUBSCRIBE, UNSUBSCRIBE, MESSAGE); - private static Collection contentLengthRequired = Arrays.asList(SEND, MESSAGE, ERROR); - private static Collection bodyAllowed = Arrays.asList(SEND, MESSAGE, ERROR); + private final SimpMessageType messageType; + private final boolean destination; + + private final boolean subscriptionId; + + private final boolean body; + + + StompCommand(SimpMessageType messageType) { + this(messageType, false, false, false); + } + + StompCommand(SimpMessageType messageType, boolean destination, boolean subscriptionId, boolean body) { + this.messageType = messageType; + this.destination = destination; + this.subscriptionId = subscriptionId; + this.body = body; + } public SimpMessageType getMessageType() { - SimpMessageType type = messageTypes.get(this); - return (type != null) ? type : SimpMessageType.OTHER; + return this.messageType; } public boolean requiresDestination() { - return destinationRequired.contains(this); + return this.destination; } public boolean requiresSubscriptionId() { - return subscriptionIdRequired.contains(this); + return this.subscriptionId; } public boolean requiresContentLength() { - return contentLengthRequired.contains(this); + return this.body; } public boolean isBodyAllowed() { - return bodyAllowed.contains(this); + return this.body; } } - diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCommandTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCommandTests.java new file mode 100644 index 000000000000..7768421ad1a9 --- /dev/null +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCommandTests.java @@ -0,0 +1,100 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.messaging.simp.stomp; + +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumMap; +import java.util.Map; + +import org.junit.Test; + +import org.springframework.messaging.simp.SimpMessageType; + +import static org.junit.Assert.*; + +/** + * @author Juergen Hoeller + */ +public class StompCommandTests { + + private static final Collection destinationRequired = + Arrays.asList(StompCommand.SEND, StompCommand.SUBSCRIBE, StompCommand.MESSAGE); + + private static final Collection subscriptionIdRequired = + Arrays.asList(StompCommand.SUBSCRIBE, StompCommand.UNSUBSCRIBE, StompCommand.MESSAGE); + + private static final Collection contentLengthRequired = + Arrays.asList(StompCommand.SEND, StompCommand.MESSAGE, StompCommand.ERROR); + + private static final Collection bodyAllowed = + Arrays.asList(StompCommand.SEND, StompCommand.MESSAGE, StompCommand.ERROR); + + private static final Map messageTypes = + new EnumMap<>(StompCommand.class); + + static { + messageTypes.put(StompCommand.STOMP, SimpMessageType.CONNECT); + messageTypes.put(StompCommand.CONNECT, SimpMessageType.CONNECT); + messageTypes.put(StompCommand.DISCONNECT, SimpMessageType.DISCONNECT); + messageTypes.put(StompCommand.SUBSCRIBE, SimpMessageType.SUBSCRIBE); + messageTypes.put(StompCommand.UNSUBSCRIBE, SimpMessageType.UNSUBSCRIBE); + messageTypes.put(StompCommand.SEND, SimpMessageType.MESSAGE); + messageTypes.put(StompCommand.MESSAGE, SimpMessageType.MESSAGE); + } + + + @Test + public void getMessageType() throws Exception { + for (StompCommand stompCommand : StompCommand.values()) { + SimpMessageType simp = messageTypes.get(stompCommand); + if (simp == null) { + simp = SimpMessageType.OTHER; + } + assertSame(simp, stompCommand.getMessageType()); + } + } + + @Test + public void requiresDestination() throws Exception { + for (StompCommand stompCommand : StompCommand.values()) { + assertEquals(destinationRequired.contains(stompCommand), stompCommand.requiresDestination()); + } + } + + @Test + public void requiresSubscriptionId() throws Exception { + for (StompCommand stompCommand : StompCommand.values()) { + assertEquals(subscriptionIdRequired.contains(stompCommand), stompCommand.requiresSubscriptionId()); + } + } + + @Test + public void requiresContentLength() throws Exception { + for (StompCommand stompCommand : StompCommand.values()) { + assertEquals(contentLengthRequired.contains(stompCommand), stompCommand.requiresContentLength()); + } + } + + @Test + public void isBodyAllowed() throws Exception { + for (StompCommand stompCommand : StompCommand.values()) { + assertEquals(bodyAllowed.contains(stompCommand), stompCommand.isBodyAllowed()); + } + } + +}