Skip to content

Commit 6aeb8ef

Browse files
dreis2211rstoyanchev
authored andcommitted
Optimize DefaultUserDestinationResolver.resolveDestination()
Issue: SPR-15602
1 parent 04a96ff commit 6aeb8ef

File tree

1 file changed

+78
-49
lines changed

1 file changed

+78
-49
lines changed

spring-messaging/src/main/java/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.java

Lines changed: 78 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2017 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.
@@ -120,16 +120,17 @@ public void setPathMatcher(PathMatcher pathMatcher) {
120120

121121
@Override
122122
public UserDestinationResult resolveDestination(Message<?> message) {
123-
String sourceDestination = SimpMessageHeaderAccessor.getDestination(message.getHeaders());
124123
ParseResult parseResult = parse(message);
125124
if (parseResult == null) {
126125
return null;
127126
}
128127
String user = parseResult.getUser();
128+
String sourceDestination = parseResult.getSourceDestination();
129129
Set<String> targetSet = new HashSet<String>();
130130
for (String sessionId : parseResult.getSessionIds()) {
131131
String actualDestination = parseResult.getActualDestination();
132-
String targetDestination = getTargetDestination(sourceDestination, actualDestination, sessionId, user);
132+
String targetDestination = getTargetDestination(
133+
sourceDestination, actualDestination, sessionId, user);
133134
if (targetDestination != null) {
134135
targetSet.add(targetDestination);
135136
}
@@ -140,65 +141,84 @@ public UserDestinationResult resolveDestination(Message<?> message) {
140141

141142
private ParseResult parse(Message<?> message) {
142143
MessageHeaders headers = message.getHeaders();
143-
String destination = SimpMessageHeaderAccessor.getDestination(headers);
144-
if (destination == null || !checkDestination(destination, this.prefix)) {
144+
String sourceDestination = SimpMessageHeaderAccessor.getDestination(headers);
145+
if (sourceDestination == null || !checkDestination(sourceDestination, this.prefix)) {
145146
return null;
146147
}
147148
SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers);
149+
switch (messageType) {
150+
case SUBSCRIBE:
151+
case UNSUBSCRIBE:
152+
return parseSubscriptionMessage(message, sourceDestination);
153+
case MESSAGE:
154+
return parseMessage(headers, sourceDestination);
155+
default:
156+
return null;
157+
}
158+
}
159+
160+
private ParseResult parseSubscriptionMessage(Message<?> message, String sourceDestination) {
161+
MessageHeaders headers = message.getHeaders();
162+
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
163+
if (sessionId == null) {
164+
logger.error("No session id. Ignoring " + message);
165+
return null;
166+
}
167+
int prefixEnd = this.prefix.length() - 1;
168+
String actualDestination = sourceDestination.substring(prefixEnd);
169+
if (!this.keepLeadingSlash) {
170+
actualDestination = actualDestination.substring(1);
171+
}
148172
Principal principal = SimpMessageHeaderAccessor.getUser(headers);
173+
String user = (principal != null ? principal.getName() : null);
174+
Set<String> sessionIds = Collections.singleton(sessionId);
175+
return new ParseResult(sourceDestination, actualDestination, sourceDestination,
176+
sessionIds, user);
177+
}
178+
179+
private ParseResult parseMessage(MessageHeaders headers, String sourceDestination) {
180+
int prefixEnd = this.prefix.length();
181+
int userEnd = sourceDestination.indexOf('/', prefixEnd);
182+
Assert.isTrue(userEnd > 0, "Expected destination pattern \"/user/{userId}/**\"");
183+
String actualDestination = sourceDestination.substring(userEnd);
184+
String subscribeDestination = this.prefix.substring(0, prefixEnd - 1) + actualDestination;
185+
String userName = sourceDestination.substring(prefixEnd, userEnd);
186+
userName = StringUtils.replace(userName, "%2F", "/");
149187
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
150-
if (SimpMessageType.SUBSCRIBE.equals(messageType) || SimpMessageType.UNSUBSCRIBE.equals(messageType)) {
151-
if (sessionId == null) {
152-
logger.error("No session id. Ignoring " + message);
153-
return null;
154-
}
155-
int prefixEnd = this.prefix.length() - 1;
156-
String actualDestination = destination.substring(prefixEnd);
157-
if (!this.keepLeadingSlash) {
158-
actualDestination = actualDestination.substring(1);
159-
}
160-
String user = (principal != null ? principal.getName() : null);
161-
return new ParseResult(actualDestination, destination, Collections.singleton(sessionId), user);
188+
Set<String> sessionIds;
189+
if (userName.equals(sessionId)) {
190+
userName = null;
191+
sessionIds = Collections.singleton(sessionId);
192+
}
193+
else {
194+
sessionIds = getSessionIdsByUser(userName, sessionId);
195+
}
196+
if (!this.keepLeadingSlash) {
197+
actualDestination = actualDestination.substring(1);
162198
}
163-
else if (SimpMessageType.MESSAGE.equals(messageType)) {
164-
int prefixEnd = this.prefix.length();
165-
int userEnd = destination.indexOf('/', prefixEnd);
166-
Assert.isTrue(userEnd > 0, "Expected destination pattern \"/user/{userId}/**\"");
167-
String actualDestination = destination.substring(userEnd);
168-
String subscribeDestination = this.prefix.substring(0, prefixEnd - 1) + actualDestination;
169-
String userName = destination.substring(prefixEnd, userEnd);
170-
userName = StringUtils.replace(userName, "%2F", "/");
171-
Set<String> sessionIds;
172-
if (userName.equals(sessionId)) {
173-
userName = null;
199+
return new ParseResult(sourceDestination, actualDestination, subscribeDestination,
200+
sessionIds, userName);
201+
}
202+
203+
private Set<String> getSessionIdsByUser(String userName, String sessionId) {
204+
Set<String> sessionIds;
205+
SimpUser user = this.userRegistry.getUser(userName);
206+
if (user != null) {
207+
if (user.getSession(sessionId) != null) {
174208
sessionIds = Collections.singleton(sessionId);
175209
}
176210
else {
177-
SimpUser user = this.userRegistry.getUser(userName);
178-
if (user != null) {
179-
if (user.getSession(sessionId) != null) {
180-
sessionIds = Collections.singleton(sessionId);
181-
}
182-
else {
183-
Set<SimpSession> sessions = user.getSessions();
184-
sessionIds = new HashSet<String>(sessions.size());
185-
for (SimpSession session : sessions) {
186-
sessionIds.add(session.getId());
187-
}
188-
}
189-
}
190-
else {
191-
sessionIds = Collections.<String>emptySet();
211+
Set<SimpSession> sessions = user.getSessions();
212+
sessionIds = new HashSet<String>(sessions.size());
213+
for (SimpSession session : sessions) {
214+
sessionIds.add(session.getId());
192215
}
193216
}
194-
if (!this.keepLeadingSlash) {
195-
actualDestination = actualDestination.substring(1);
196-
}
197-
return new ParseResult(actualDestination, subscribeDestination, sessionIds, userName);
198217
}
199218
else {
200-
return null;
219+
sessionIds = Collections.emptySet();
201220
}
221+
return sessionIds;
202222
}
203223

204224
protected boolean checkDestination(String destination, String requiredPrefix) {
@@ -232,6 +252,8 @@ public String toString() {
232252
*/
233253
private static class ParseResult {
234254

255+
private final String sourceDestination;
256+
235257
private final String actualDestination;
236258

237259
private final String subscribeDestination;
@@ -241,14 +263,21 @@ private static class ParseResult {
241263
private final String user;
242264

243265

244-
public ParseResult(String actualDest, String subscribeDest, Set<String> sessionIds, String user) {
266+
public ParseResult(String sourceDest, String actualDest, String subscribeDest,
267+
Set<String> sessionIds, String user) {
268+
269+
this.sourceDestination = sourceDest;
245270
this.actualDestination = actualDest;
246271
this.subscribeDestination = subscribeDest;
247272
this.sessionIds = sessionIds;
248273
this.user = user;
249274
}
250275

251276

277+
public String getSourceDestination() {
278+
return this.sourceDestination;
279+
}
280+
252281
public String getActualDestination() {
253282
return this.actualDestination;
254283
}

0 commit comments

Comments
 (0)