Skip to content

Commit 70dbaf9

Browse files
vpavicjhoeller
authored andcommitted
Publish binding event for replaced attributes in MockHttpSession
Issue: SPR-17109
1 parent 0001f87 commit 70dbaf9

File tree

3 files changed

+91
-8
lines changed

3 files changed

+91
-8
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockHttpSession.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
* @author Rod Johnson
4343
* @author Mark Fisher
4444
* @author Sam Brannen
45+
* @author Vedran Pavic
4546
* @since 1.0.2
4647
*/
4748
@SuppressWarnings("deprecation")
@@ -180,9 +181,14 @@ public void setAttribute(String name, @Nullable Object value) {
180181
assertIsValid();
181182
Assert.notNull(name, "Attribute name must not be null");
182183
if (value != null) {
183-
this.attributes.put(name, value);
184-
if (value instanceof HttpSessionBindingListener) {
185-
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value));
184+
Object oldValue = this.attributes.put(name, value);
185+
if (value != oldValue) {
186+
if (oldValue instanceof HttpSessionBindingListener) {
187+
((HttpSessionBindingListener) oldValue).valueUnbound(new HttpSessionBindingEvent(this, name, oldValue));
188+
}
189+
if (value instanceof HttpSessionBindingListener) {
190+
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value));
191+
}
186192
}
187193
}
188194
else {

spring-test/src/test/java/org/springframework/mock/web/MockHttpSessionTests.java

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2018 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.
@@ -16,6 +16,10 @@
1616

1717
package org.springframework.mock.web;
1818

19+
import java.util.concurrent.atomic.AtomicInteger;
20+
import javax.servlet.http.HttpSessionBindingEvent;
21+
import javax.servlet.http.HttpSessionBindingListener;
22+
1923
import org.junit.Test;
2024

2125
import static org.junit.Assert.*;
@@ -24,11 +28,12 @@
2428
* Unit tests for {@link MockHttpSession}.
2529
*
2630
* @author Sam Brannen
31+
* @author Vedran Pavic
2732
* @since 3.2
2833
*/
2934
public class MockHttpSessionTests {
3035

31-
private final MockHttpSession session = new MockHttpSession();
36+
private MockHttpSession session = new MockHttpSession();
3237

3338

3439
@Test
@@ -143,4 +148,70 @@ public void isNewOnInvalidatedSession() {
143148
session.isNew();
144149
}
145150

151+
@Test
152+
public void bindingListenerBindListener() {
153+
String bindingListenerName = "bindingListener";
154+
CountingHttpSessionBindingListener bindingListener = new CountingHttpSessionBindingListener();
155+
156+
session.setAttribute(bindingListenerName, bindingListener);
157+
158+
assertEquals(bindingListener.getCounter(), 1);
159+
}
160+
161+
@Test
162+
public void bindingListenerBindListenerThenUnbind() {
163+
String bindingListenerName = "bindingListener";
164+
CountingHttpSessionBindingListener bindingListener = new CountingHttpSessionBindingListener();
165+
166+
session.setAttribute(bindingListenerName, bindingListener);
167+
session.removeAttribute(bindingListenerName);
168+
169+
assertEquals(bindingListener.getCounter(), 0);
170+
}
171+
172+
@Test
173+
public void bindingListenerBindSameListenerTwice() {
174+
String bindingListenerName = "bindingListener";
175+
CountingHttpSessionBindingListener bindingListener = new CountingHttpSessionBindingListener();
176+
177+
session.setAttribute(bindingListenerName, bindingListener);
178+
session.setAttribute(bindingListenerName, bindingListener);
179+
180+
assertEquals(bindingListener.getCounter(), 1);
181+
}
182+
183+
@Test
184+
public void bindingListenerBindListenerOverwrite() {
185+
String bindingListenerName = "bindingListener";
186+
CountingHttpSessionBindingListener bindingListener1 = new CountingHttpSessionBindingListener();
187+
CountingHttpSessionBindingListener bindingListener2 = new CountingHttpSessionBindingListener();
188+
189+
session.setAttribute(bindingListenerName, bindingListener1);
190+
session.setAttribute(bindingListenerName, bindingListener2);
191+
192+
assertEquals(bindingListener1.getCounter(), 0);
193+
assertEquals(bindingListener2.getCounter(), 1);
194+
}
195+
196+
private static class CountingHttpSessionBindingListener
197+
implements HttpSessionBindingListener {
198+
199+
private final AtomicInteger counter = new AtomicInteger(0);
200+
201+
@Override
202+
public void valueBound(HttpSessionBindingEvent event) {
203+
this.counter.incrementAndGet();
204+
}
205+
206+
@Override
207+
public void valueUnbound(HttpSessionBindingEvent event) {
208+
this.counter.decrementAndGet();
209+
}
210+
211+
int getCounter() {
212+
return this.counter.get();
213+
}
214+
215+
}
216+
146217
}

spring-web/src/test/java/org/springframework/mock/web/test/MockHttpSession.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
* @author Rod Johnson
4242
* @author Mark Fisher
4343
* @author Sam Brannen
44+
* @author Vedran Pavic
4445
* @since 1.0.2
4546
*/
4647
@SuppressWarnings("deprecation")
@@ -176,9 +177,14 @@ public void setAttribute(String name, Object value) {
176177
assertIsValid();
177178
Assert.notNull(name, "Attribute name must not be null");
178179
if (value != null) {
179-
this.attributes.put(name, value);
180-
if (value instanceof HttpSessionBindingListener) {
181-
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value));
180+
Object oldValue = this.attributes.put(name, value);
181+
if (value != oldValue) {
182+
if (oldValue instanceof HttpSessionBindingListener) {
183+
((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, oldValue));
184+
}
185+
if (value instanceof HttpSessionBindingListener) {
186+
((HttpSessionBindingListener) value).valueBound(new HttpSessionBindingEvent(this, name, value));
187+
}
182188
}
183189
}
184190
else {

0 commit comments

Comments
 (0)