aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorDenis Anisimov <denis@vaadin.com>2014-03-13 22:49:43 +0200
committerLeif Åstrand <leif@vaadin.com>2014-03-27 09:48:24 +0000
commit880bdbd52b1f92057a680928f2ca8898b6fc5145 (patch)
tree40f9f14d59f592163f7903de63aade0341b95a47 /server
parentcb8c7f91a603b1a347762f246b66b9575b9c622f (diff)
downloadvaadin-framework-880bdbd52b1f92057a680928f2ca8898b6fc5145.tar.gz
vaadin-framework-880bdbd52b1f92057a680928f2ca8898b6fc5145.zip
Always call close() method for session valueUnbound() method (#12843).
Change-Id: I1500b4b50d1f7ae9ee5fd2252a7b682b93cce720
Diffstat (limited to 'server')
-rw-r--r--server/src/com/vaadin/server/VaadinService.java3
-rw-r--r--server/tests/src/com/vaadin/server/MockVaadinSession.java49
-rw-r--r--server/tests/src/com/vaadin/server/VaadinServiceTest.java53
-rw-r--r--server/tests/src/com/vaadin/server/VaadinSessionTest.java19
4 files changed, 124 insertions, 0 deletions
diff --git a/server/src/com/vaadin/server/VaadinService.java b/server/src/com/vaadin/server/VaadinService.java
index 86cd9701c0..6fd0b23f7b 100644
--- a/server/src/com/vaadin/server/VaadinService.java
+++ b/server/src/com/vaadin/server/VaadinService.java
@@ -446,6 +446,9 @@ public abstract class VaadinService implements Serializable {
session.accessSynchronously(new Runnable() {
@Override
public void run() {
+ if (!session.isClosing()) {
+ closeSession(session);
+ }
ArrayList<UI> uis = new ArrayList<UI>(session.getUIs());
for (final UI ui : uis) {
ui.accessSynchronously(new Runnable() {
diff --git a/server/tests/src/com/vaadin/server/MockVaadinSession.java b/server/tests/src/com/vaadin/server/MockVaadinSession.java
new file mode 100644
index 0000000000..1fb53cd368
--- /dev/null
+++ b/server/tests/src/com/vaadin/server/MockVaadinSession.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * 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 com.vaadin.server;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ *
+ * @author Vaadin Ltd
+ */
+public class MockVaadinSession extends VaadinSession {
+
+ public MockVaadinSession(VaadinService service) {
+ super(service);
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ closeCount++;
+ }
+
+ public int getCloseCount() {
+ return closeCount;
+ }
+
+ @Override
+ public Lock getLockInstance() {
+ return lock;
+ }
+
+ private int closeCount;
+
+ private ReentrantLock lock = new ReentrantLock();
+}
diff --git a/server/tests/src/com/vaadin/server/VaadinServiceTest.java b/server/tests/src/com/vaadin/server/VaadinServiceTest.java
new file mode 100644
index 0000000000..cead5df79c
--- /dev/null
+++ b/server/tests/src/com/vaadin/server/VaadinServiceTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * 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 com.vaadin.server;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpSessionBindingEvent;
+
+import org.easymock.EasyMock;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ * @author Vaadin Ltd
+ */
+public class VaadinServiceTest {
+
+ @Test
+ public void testFireSessionDestroy() throws ServletException {
+ ServletConfig servletConfig = new MockServletConfig();
+ VaadinServlet servlet = new VaadinServlet();
+ servlet.init(servletConfig);
+ VaadinService service = servlet.getService();
+
+ MockVaadinSession vaadinSession = new MockVaadinSession(service);
+ service.fireSessionDestroy(vaadinSession);
+ Assert.assertEquals(
+ "'fireSessionDestroy' method doesn't call 'close' for the session",
+ 1, vaadinSession.getCloseCount());
+
+ vaadinSession.valueUnbound(EasyMock
+ .createMock(HttpSessionBindingEvent.class));
+
+ org.junit.Assert.assertEquals(
+ "'fireSessionDestroy' method may not call 'close' "
+ + "method for closing session", 1,
+ vaadinSession.getCloseCount());
+ }
+}
diff --git a/server/tests/src/com/vaadin/server/VaadinSessionTest.java b/server/tests/src/com/vaadin/server/VaadinSessionTest.java
index 51ae2a2d13..edc78ba8d7 100644
--- a/server/tests/src/com/vaadin/server/VaadinSessionTest.java
+++ b/server/tests/src/com/vaadin/server/VaadinSessionTest.java
@@ -146,4 +146,23 @@ public class VaadinSessionTest {
mockService.cleanupSession(session);
Assert.assertTrue(detachCalled.get());
}
+
+ @Test
+ public void testValueUnbound() {
+ MockVaadinSession vaadinSession = new MockVaadinSession(mockService);
+
+ vaadinSession.valueUnbound(EasyMock
+ .createMock(HttpSessionBindingEvent.class));
+ org.junit.Assert.assertEquals(
+ "'valueUnbound' method doesn't call 'close' for the session",
+ 1, vaadinSession.getCloseCount());
+
+ vaadinSession.valueUnbound(EasyMock
+ .createMock(HttpSessionBindingEvent.class));
+
+ org.junit.Assert.assertEquals(
+ "'valueUnbound' method may not call 'close' "
+ + "method for closing session", 1,
+ vaadinSession.getCloseCount());
+ }
}