|
|
|
@ -16,12 +16,14 @@ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.web.servlet.support; |
|
|
|
package org.springframework.web.servlet.support; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
import static org.junit.Assert.assertFalse; |
|
|
|
|
|
|
|
import static org.junit.Assert.assertNotNull; |
|
|
|
import static org.junit.Assert.assertNotNull; |
|
|
|
import static org.junit.Assert.assertNull; |
|
|
|
import static org.junit.Assert.assertNull; |
|
|
|
import static org.junit.Assert.assertSame; |
|
|
|
import static org.junit.Assert.assertSame; |
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
|
|
|
|
|
import static org.springframework.web.servlet.FlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE; |
|
|
|
|
|
|
|
import static org.springframework.web.servlet.FlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
@ -51,55 +53,111 @@ public class DefaultFlashMapManagerTests { |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void requestStarted() { |
|
|
|
public void requestStarted() { |
|
|
|
boolean initialized = this.flashMapManager.requestStarted(this.request); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertNotNull("Current FlashMap not found", flashMap); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assertTrue("Current FlashMap not initialized on first call", initialized); |
|
|
|
@Test |
|
|
|
assertNotNull("Current FlashMap not found", RequestContextUtils.getOutputFlashMap(request)); |
|
|
|
public void requestStartedAlready() { |
|
|
|
|
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
|
|
|
|
this.request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap); |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
initialized = this.flashMapManager.requestStarted(this.request); |
|
|
|
assertSame(flashMap, RequestContextUtils.getOutputFlashMap(request)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void lookupFlashMapByPath() { |
|
|
|
|
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
|
|
|
|
flashMap.put("key", "value"); |
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("/path"); |
|
|
|
|
|
|
|
|
|
|
|
assertFalse("Current FlashMap initialized twice", initialized); |
|
|
|
List<FlashMap> allMaps = createFlashMaps(); |
|
|
|
|
|
|
|
allMaps.add(flashMap); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.request.setRequestURI("/path"); |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request)); |
|
|
|
|
|
|
|
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void lookupInputFlashMap() { |
|
|
|
public void lookupFlashMapByPathWithTrailingSlash() { |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
flashMap.put("key", "value"); |
|
|
|
flashMap.put("key", "value"); |
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("/path"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<FlashMap> allMaps = createFlashMaps(); |
|
|
|
|
|
|
|
allMaps.add(flashMap); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.request.setRequestURI("/path/"); |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request)); |
|
|
|
|
|
|
|
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
List<FlashMap> allMaps = createFlashMapsSessionAttribute(); |
|
|
|
@Test |
|
|
|
|
|
|
|
public void lookupFlashMapWithParams() { |
|
|
|
|
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
|
|
|
|
flashMap.put("key", "value"); |
|
|
|
|
|
|
|
flashMap.addTargetRequestParam("number", "one"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<FlashMap> allMaps = createFlashMaps(); |
|
|
|
allMaps.add(flashMap); |
|
|
|
allMaps.add(flashMap); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.request.setParameter("number", (String) null); |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertNull(RequestContextUtils.getInputFlashMap(this.request)); |
|
|
|
|
|
|
|
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clearRequestAttributes(); |
|
|
|
|
|
|
|
this.request.setParameter("number", "two"); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
assertEquals(flashMap, request.getAttribute(DefaultFlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE)); |
|
|
|
assertNull(RequestContextUtils.getInputFlashMap(this.request)); |
|
|
|
assertEquals("Input FlashMap should have been removed", 0, allMaps.size()); |
|
|
|
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clearRequestAttributes(); |
|
|
|
|
|
|
|
this.request.setParameter("number", "one"); |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request)); |
|
|
|
|
|
|
|
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void lookupInputFlashMapExpectedUrlPath() { |
|
|
|
public void lookupFlashMapSortOrder() { |
|
|
|
FlashMap emptyFlashMap = new FlashMap(); |
|
|
|
FlashMap emptyFlashMap = new FlashMap(); |
|
|
|
|
|
|
|
|
|
|
|
FlashMap oneFlashMap = new FlashMap(); |
|
|
|
FlashMap flashMapOne = new FlashMap(); |
|
|
|
oneFlashMap.setExpectedRequestUri(null, "/one"); |
|
|
|
flashMapOne.put("key1", "value1"); |
|
|
|
|
|
|
|
flashMapOne.setTargetRequestPath("/one"); |
|
|
|
|
|
|
|
|
|
|
|
FlashMap secondFlashMap = new FlashMap(); |
|
|
|
FlashMap flashMapTwo = new FlashMap(); |
|
|
|
secondFlashMap.setExpectedRequestUri(null, "/one/two"); |
|
|
|
flashMapTwo.put("key1", "value1"); |
|
|
|
|
|
|
|
flashMapTwo.put("key2", "value2"); |
|
|
|
|
|
|
|
flashMapTwo.setTargetRequestPath("/one/two"); |
|
|
|
|
|
|
|
|
|
|
|
List<FlashMap> allMaps = createFlashMapsSessionAttribute(); |
|
|
|
List<FlashMap> allMaps = createFlashMaps(); |
|
|
|
allMaps.add(emptyFlashMap); |
|
|
|
allMaps.add(emptyFlashMap); |
|
|
|
allMaps.add(oneFlashMap); |
|
|
|
allMaps.add(flashMapOne); |
|
|
|
allMaps.add(secondFlashMap); |
|
|
|
allMaps.add(flashMapTwo); |
|
|
|
Collections.shuffle(allMaps); |
|
|
|
Collections.shuffle(allMaps); |
|
|
|
|
|
|
|
|
|
|
|
this.request.setRequestURI("/one"); |
|
|
|
this.request.setRequestURI("/one/two"); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
assertEquals(oneFlashMap, request.getAttribute(DefaultFlashMapManager.INPUT_FLASH_MAP_ATTRIBUTE)); |
|
|
|
assertEquals(flashMapTwo, request.getAttribute(INPUT_FLASH_MAP_ATTRIBUTE)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void removeExpiredFlashMaps() throws InterruptedException { |
|
|
|
public void removeExpiredFlashMaps() throws InterruptedException { |
|
|
|
List<FlashMap> allMaps = createFlashMapsSessionAttribute(); |
|
|
|
List<FlashMap> allMaps = createFlashMaps(); |
|
|
|
for (int i=0; i < 5; i++) { |
|
|
|
for (int i=0; i < 5; i++) { |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
allMaps.add(flashMap); |
|
|
|
allMaps.add(flashMap); |
|
|
|
@ -114,17 +172,34 @@ public class DefaultFlashMapManagerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void saveFlashMap() throws InterruptedException { |
|
|
|
public void saveFlashMapWithoutAttributes() throws InterruptedException { |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertNull(getFlashMaps()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void saveFlashMapNotCreatedByThisManager() throws InterruptedException { |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
FlashMap flashMap = new FlashMap(); |
|
|
|
|
|
|
|
this.request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertNull(getFlashMaps()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void saveFlashMapWithAttributes() throws InterruptedException { |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request); |
|
|
|
flashMap.put("name", "value"); |
|
|
|
flashMap.put("name", "value"); |
|
|
|
request.setAttribute(DefaultFlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, flashMap); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.flashMapManager.setFlashMapTimeout(0); |
|
|
|
this.flashMapManager.setFlashMapTimeout(0); |
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
Thread.sleep(1); |
|
|
|
Thread.sleep(1); |
|
|
|
|
|
|
|
|
|
|
|
List<FlashMap> allMaps = getFlashMapsSessionAttribute(); |
|
|
|
List<FlashMap> allMaps = getFlashMaps(); |
|
|
|
|
|
|
|
|
|
|
|
assertNotNull(allMaps); |
|
|
|
assertNotNull(allMaps); |
|
|
|
assertSame(flashMap, allMaps.get(0)); |
|
|
|
assertSame(flashMap, allMaps.get(0)); |
|
|
|
@ -132,22 +207,68 @@ public class DefaultFlashMapManagerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void saveFlashMapIsEmpty() throws InterruptedException { |
|
|
|
public void decodeTargetPath() throws InterruptedException { |
|
|
|
request.setAttribute(DefaultFlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap()); |
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request); |
|
|
|
|
|
|
|
flashMap.put("key", "value"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("/once%20upon%20a%20time"); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals("/once upon a time", flashMap.getTargetRequestPath()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void normalizeTargetPath() throws InterruptedException { |
|
|
|
|
|
|
|
this.flashMapManager.requestStarted(this.request); |
|
|
|
|
|
|
|
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(this.request); |
|
|
|
|
|
|
|
flashMap.put("key", "value"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("."); |
|
|
|
|
|
|
|
this.request.setRequestURI("/once/upon/a/time"); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals("/once/upon/a", flashMap.getTargetRequestPath()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("./"); |
|
|
|
|
|
|
|
this.request.setRequestURI("/once/upon/a/time"); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals("/once/upon/a/", flashMap.getTargetRequestPath()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath(".."); |
|
|
|
|
|
|
|
this.request.setRequestURI("/once/upon/a/time"); |
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
assertNull(getFlashMapsSessionAttribute()); |
|
|
|
assertEquals("/once/upon", flashMap.getTargetRequestPath()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("../"); |
|
|
|
|
|
|
|
this.request.setRequestURI("/once/upon/a/time"); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals("/once/upon/", flashMap.getTargetRequestPath()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
flashMap.setTargetRequestPath("../../only"); |
|
|
|
|
|
|
|
this.request.setRequestURI("/once/upon/a/time"); |
|
|
|
|
|
|
|
this.flashMapManager.requestCompleted(this.request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals("/once/only", flashMap.getTargetRequestPath()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
private List<FlashMap> getFlashMapsSessionAttribute() { |
|
|
|
private List<FlashMap> getFlashMaps() { |
|
|
|
return (List<FlashMap>) this.request.getSession().getAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS"); |
|
|
|
return (List<FlashMap>) this.request.getSession().getAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private List<FlashMap> createFlashMapsSessionAttribute() { |
|
|
|
private List<FlashMap> createFlashMaps() { |
|
|
|
List<FlashMap> allMaps = new CopyOnWriteArrayList<FlashMap>(); |
|
|
|
List<FlashMap> allMaps = new CopyOnWriteArrayList<FlashMap>(); |
|
|
|
this.request.getSession().setAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS", allMaps); |
|
|
|
this.request.getSession().setAttribute(DefaultFlashMapManager.class + ".FLASH_MAPS", allMaps); |
|
|
|
return allMaps; |
|
|
|
return allMaps; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void clearRequestAttributes() { |
|
|
|
|
|
|
|
request.removeAttribute(INPUT_FLASH_MAP_ATTRIBUTE); |
|
|
|
|
|
|
|
request.removeAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|