summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTatu Lund <tatu@vaadin.com>2019-11-13 18:39:36 +0200
committerAnna Koskinen <Ansku@users.noreply.github.com>2019-11-13 18:39:36 +0200
commit2d6982c17576c423978a6a8a56ff9a17e106ff43 (patch)
tree3406bc4216a0d03eefc3ea1097979828f19c53e4
parent4bfdc5c0067780b0732af77ad0805a78832a7816 (diff)
downloadvaadin-framework-2d6982c17576c423978a6a8a56ff9a17e106ff43.tar.gz
vaadin-framework-2d6982c17576c423978a6a8a56ff9a17e106ff43.zip
Use APPLICATION_SCOPE for the session lock (#11804)
* Use APPLICATION_SCOPE for the session lock To be able to do this, relevant methods in VaadinService are made protected so that VaadinPortletService can override them. The Vaadin session itself is also stored in APPLICATION_SCOPE. The default scope is PORTLET_SCOPE, so lock would otherwise not be in sync with the session.
-rw-r--r--server/src/main/java/com/vaadin/server/VaadinPortletService.java38
-rw-r--r--server/src/main/java/com/vaadin/server/VaadinService.java4
-rw-r--r--server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java6
3 files changed, 44 insertions, 4 deletions
diff --git a/server/src/main/java/com/vaadin/server/VaadinPortletService.java b/server/src/main/java/com/vaadin/server/VaadinPortletService.java
index 43441810f2..fd80b25261 100644
--- a/server/src/main/java/com/vaadin/server/VaadinPortletService.java
+++ b/server/src/main/java/com/vaadin/server/VaadinPortletService.java
@@ -22,6 +22,8 @@ import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -371,4 +373,40 @@ public class VaadinPortletService extends VaadinService {
getWrappedPortletSession(wrappedSession).removeAttribute(
getSessionAttributeName(), PortletSession.APPLICATION_SCOPE);
}
+
+ @Override
+ protected void setSessionLock(WrappedSession wrappedSession, Lock lock) {
+ if (wrappedSession == null) {
+ throw new IllegalArgumentException(
+ "Can't set a lock for a null session");
+ }
+ Object currentSessionLock = getWrappedPortletSession(wrappedSession)
+ .getAttribute(getLockAttributeName(),
+ PortletSession.APPLICATION_SCOPE);
+ assert (currentSessionLock == null
+ || currentSessionLock == lock) : "Changing the lock for a session is not allowed";
+
+ getWrappedPortletSession(wrappedSession).setAttribute(
+ getLockAttributeName(), lock,
+ PortletSession.APPLICATION_SCOPE);
+ }
+
+ @Override
+ protected Lock getSessionLock(WrappedSession wrappedSession) {
+ Object lock = getWrappedPortletSession(wrappedSession)
+ .getAttribute(getLockAttributeName(),
+ PortletSession.APPLICATION_SCOPE);
+
+ if (lock instanceof ReentrantLock) {
+ return (ReentrantLock) lock;
+ }
+
+ if (lock == null) {
+ return null;
+ }
+
+ throw new RuntimeException(
+ "Something else than a ReentrantLock was stored in the "
+ + getLockAttributeName() + " in the session");
+ }
}
diff --git a/server/src/main/java/com/vaadin/server/VaadinService.java b/server/src/main/java/com/vaadin/server/VaadinService.java
index 5107ff1501..bed040f9f1 100644
--- a/server/src/main/java/com/vaadin/server/VaadinService.java
+++ b/server/src/main/java/com/vaadin/server/VaadinService.java
@@ -549,7 +549,7 @@ public abstract class VaadinService implements Serializable {
* @param lock
* The lock object
*/
- private void setSessionLock(WrappedSession wrappedSession, Lock lock) {
+ protected void setSessionLock(WrappedSession wrappedSession, Lock lock) {
if (wrappedSession == null) {
throw new IllegalArgumentException(
"Can't set a lock for a null session");
@@ -567,7 +567,7 @@ public abstract class VaadinService implements Serializable {
*
* @return The attribute name for the lock
*/
- private String getLockAttributeName() {
+ protected String getLockAttributeName() {
return getServiceName() + ".lock";
}
diff --git a/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java b/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java
index 124ce76688..a0cb49dd23 100644
--- a/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java
+++ b/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java
@@ -7,6 +7,8 @@ import static org.mockito.Mockito.when;
import java.util.concurrent.locks.ReentrantLock;
+import javax.portlet.PortletSession;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -184,9 +186,9 @@ public class VaadinPortletServiceTest {
ReentrantLock mockLock = Mockito.mock(ReentrantLock.class);
when(mockLock.isHeldByCurrentThread()).thenReturn(true);
- WrappedSession emptyWrappedSession = Mockito
+ WrappedPortletSession emptyWrappedSession = Mockito
.mock(WrappedPortletSession.class);
- when(emptyWrappedSession.getAttribute("null.lock"))
+ when(emptyWrappedSession.getAttribute("null.lock",PortletSession.APPLICATION_SCOPE))
.thenReturn(mockLock);
VaadinRequest requestWithUIIDSet = Mockito
.mock(VaadinRequest.class);