提交 899ebd8e 编写于 作者: J Juergen Hoeller

Avoid collection lookups in StompCommand

Issue: SPR-14636
上级 728a5481
......@@ -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<StompCommand, SimpMessageType> 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<StompCommand> destinationRequired = Arrays.asList(SEND, SUBSCRIBE, MESSAGE);
private static Collection<StompCommand> subscriptionIdRequired = Arrays.asList(SUBSCRIBE, UNSUBSCRIBE, MESSAGE);
private static Collection<StompCommand> contentLengthRequired = Arrays.asList(SEND, MESSAGE, ERROR);
private static Collection<StompCommand> 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;
}
}
/*
* 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<StompCommand> destinationRequired =
Arrays.asList(StompCommand.SEND, StompCommand.SUBSCRIBE, StompCommand.MESSAGE);
private static final Collection<StompCommand> subscriptionIdRequired =
Arrays.asList(StompCommand.SUBSCRIBE, StompCommand.UNSUBSCRIBE, StompCommand.MESSAGE);
private static final Collection<StompCommand> contentLengthRequired =
Arrays.asList(StompCommand.SEND, StompCommand.MESSAGE, StompCommand.ERROR);
private static final Collection<StompCommand> bodyAllowed =
Arrays.asList(StompCommand.SEND, StompCommand.MESSAGE, StompCommand.ERROR);
private static final Map<StompCommand, SimpMessageType> 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());
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册