diff options
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 1b804ad18c..0b2d28acc6 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; @@ -366,4 +368,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 1e67db708b..9503db113f 100644 --- a/server/src/main/java/com/vaadin/server/VaadinService.java +++ b/server/src/main/java/com/vaadin/server/VaadinService.java @@ -622,7 +622,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"); @@ -640,7 +640,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 2d7da64d20..2280e7d4f5 100644 --- a/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java +++ b/server/src/test/java/com/vaadin/server/VaadinPortletServiceTest.java @@ -9,6 +9,8 @@ import static org.mockito.Mockito.when; import java.util.concurrent.locks.ReentrantLock; +import javax.portlet.PortletSession; + import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -185,9 +187,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); |