Skip to content

Commit

Permalink
Only retrieve the FlashMapManager if a non-empty output FlashMap has …
Browse files Browse the repository at this point in the history
…been found

Issue: SPR-10937
(cherry picked from commit 4ac6801)
  • Loading branch information
jhoeller committed Nov 5, 2013
1 parent 494cc22 commit 70907fd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
Expand All @@ -41,6 +40,7 @@
* Locale, ThemeResolver, Theme, and MultipartResolver.
*
* @author Juergen Hoeller
* @author Rossen Stoyanchev
* @since 03.03.2003
* @see RequestContext
* @see org.springframework.web.servlet.DispatcherServlet
Expand Down Expand Up @@ -160,7 +160,7 @@ public static Theme getTheme(HttpServletRequest request) {
* Return a read-only {@link Map} with "input" flash attributes saved on a
* previous request.
* @param request the current request
* @return a read-only Map, or {@code null}
* @return a read-only Map, or {@code null} if not found
* @see FlashMap
*/
@SuppressWarnings("unchecked")
Expand All @@ -170,8 +170,8 @@ public static Theme getTheme(HttpServletRequest request) {

/**
* Return the "output" FlashMap with attributes to save for a subsequent request.
* @param request current request
* @return a {@link FlashMap} instance, never {@code null}
* @param request the current request
* @return a {@link FlashMap} instance (never {@code null} within a DispatcherServlet request)
* @see FlashMap
*/
public static FlashMap getOutputFlashMap(HttpServletRequest request) {
Expand All @@ -182,6 +182,7 @@ public static FlashMap getOutputFlashMap(HttpServletRequest request) {
* Return the FlashMapManager instance to save flash attributes with
* before a redirect.
* @param request the current request
* @return a {@link FlashMapManager} instance (never {@code null} within a DispatcherServlet request)
*/
public static FlashMapManager getFlashMapManager(HttpServletRequest request) {
return (FlashMapManager) request.getAttribute(DispatcherServlet.FLASH_MAP_MANAGER_ATTRIBUTE);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2013 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 Down Expand Up @@ -33,7 +33,6 @@

import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
Expand Down Expand Up @@ -250,15 +249,15 @@ protected boolean isContextRequired() {
return false;
}


/**
* Convert model to request parameters and redirect to the given URL.
* @see #appendQueryProperties
* @see #sendRedirect
*/
@Override
protected void renderMergedOutputModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws IOException {
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws IOException {

String targetUrl = createTargetUrl(model, request);
targetUrl = updateTargetUrl(targetUrl, model, request, response);
Expand All @@ -268,11 +267,13 @@ protected void renderMergedOutputModel(
UriComponents uriComponents = UriComponentsBuilder.fromUriString(targetUrl).build();
flashMap.setTargetRequestPath(uriComponents.getPath());
flashMap.addTargetRequestParams(uriComponents.getQueryParams());
FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
if (flashMapManager == null) {
throw new IllegalStateException("FlashMapManager not found despite output FlashMap having been set");
}
flashMapManager.saveOutputFlashMap(flashMap, request, response);
}

FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
flashMapManager.saveOutputFlashMap(flashMap, request, response);

sendRedirect(request, response, targetUrl, this.http10Compatible);
}

Expand Down Expand Up @@ -304,7 +305,6 @@ protected final String createTargetUrl(Map<String, Object> model, HttpServletReq
Map<String, String> variables = getCurrentRequestUriVariables(request);
targetUrl = replaceUriTemplateVariables(targetUrl.toString(), model, variables, enc);
}

if (this.exposeModelAttributes) {
appendQueryProperties(targetUrl, model, enc);
}
Expand All @@ -327,15 +327,17 @@ protected StringBuilder replaceUriTemplateVariables(
throws UnsupportedEncodingException {

StringBuilder result = new StringBuilder();
Matcher m = URI_TEMPLATE_VARIABLE_PATTERN.matcher(targetUrl);
Matcher matcher = URI_TEMPLATE_VARIABLE_PATTERN.matcher(targetUrl);
int endLastMatch = 0;
while (m.find()) {
String name = m.group(1);
Object value = model.containsKey(name) ? model.remove(name) : currentUriVariables.get(name);
Assert.notNull(value, "Model has no value for '" + name + "'");
result.append(targetUrl.substring(endLastMatch, m.start()));
while (matcher.find()) {
String name = matcher.group(1);
Object value = (model.containsKey(name) ? model.remove(name) : currentUriVariables.get(name));
if (value == null) {
throw new IllegalArgumentException("Model has no value for key '" + name + "'");
}
result.append(targetUrl.substring(endLastMatch, matcher.start()));
result.append(UriUtils.encodePathSegment(value.toString(), encodingScheme));
endLastMatch = m.end();
endLastMatch = matcher.end();
}
result.append(targetUrl.substring(endLastMatch, targetUrl.length()));
return result;
Expand All @@ -344,7 +346,7 @@ protected StringBuilder replaceUriTemplateVariables(
@SuppressWarnings("unchecked")
private Map<String, String> getCurrentRequestUriVariables(HttpServletRequest request) {
Map<String, String> uriVars =
(Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
(Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
return (uriVars != null) ? uriVars : Collections.<String, String> emptyMap();
}

Expand Down Expand Up @@ -441,7 +443,6 @@ protected boolean isEligibleProperty(String key, Object value) {
if (isEligibleValue(value)) {
return true;
}

if (value.getClass().isArray()) {
int length = Array.getLength(value);
if (length == 0) {
Expand All @@ -455,7 +456,6 @@ protected boolean isEligibleProperty(String key, Object value) {
}
return true;
}

if (value instanceof Collection) {
Collection coll = (Collection) value;
if (coll.isEmpty()) {
Expand All @@ -468,7 +468,6 @@ protected boolean isEligibleProperty(String key, Object value) {
}
return true;
}

return false;
}

Expand Down Expand Up @@ -504,7 +503,7 @@ protected String urlEncode(String input, String encodingScheme) throws Unsupport
* @return the updated URL or the same as URL as the one passed in
*/
protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
HttpServletRequest request, HttpServletResponse response) {

RequestContext requestContext = null;
if (getWebApplicationContext() != null) {
Expand All @@ -516,14 +515,12 @@ protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
requestContext = new RequestContext(request, response, wac.getServletContext(), model);
}
}

if (requestContext != null) {
RequestDataValueProcessor processor = requestContext.getRequestDataValueProcessor();
if (processor != null) {
targetUrl = processor.processUrl(request, targetUrl);
}
}

return targetUrl;
}

Expand All @@ -535,12 +532,10 @@ protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
* @param http10Compatible whether to stay compatible with HTTP 1.0 clients
* @throws IOException if thrown by response methods
*/
protected void sendRedirect(
HttpServletRequest request, HttpServletResponse response, String targetUrl, boolean http10Compatible)
throws IOException {
protected void sendRedirect(HttpServletRequest request, HttpServletResponse response,
String targetUrl, boolean http10Compatible) throws IOException {

String encodedRedirectURL = response.encodeRedirectURL(targetUrl);

if (http10Compatible) {
if (this.statusCode != null) {
response.setStatus(this.statusCode.value());
Expand Down

0 comments on commit 70907fd

Please sign in to comment.