Skip to content

Commit

Permalink
Avoid collection lookups in StompCommand
Browse files Browse the repository at this point in the history
Issue: SPR-14636
(cherry picked from commit 899ebd8)
  • Loading branch information
jhoeller committed Aug 30, 2016
1 parent 815a3ad commit 8e98177
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 44 deletions.
@@ -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.
Expand All @@ -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<StompCommand, SimpMessageType>();
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());
}
}

}

0 comments on commit 8e98177

Please sign in to comment.