Avoid collection lookups in StompCommand

Issue: SPR-14636
master
Juergen Hoeller 8 years ago
parent 728a548199
commit 899ebd8ee2
  1. 83
      spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompCommand.java
  2. 100
      spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompCommandTests.java

@ -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;
}
}

@ -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<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());
}
}
}
Loading…
Cancel
Save