]> source.dussan.org Git - vaadin-framework.git/commitdiff
Don't close an unbound VaadinSession for GAEVaadinServlet (#12209)
authorLeif Åstrand <leif@vaadin.com>
Fri, 12 Jul 2013 07:05:53 +0000 (10:05 +0300)
committerVaadin Code Review <review@vaadin.com>
Wed, 17 Jul 2013 06:30:51 +0000 (06:30 +0000)
Change-Id: If3480eb6e21f5f19a43b8dc0d6279173ff3bec40

server/src/com/vaadin/server/GAEVaadinServlet.java
server/src/com/vaadin/server/VaadinService.java
server/src/com/vaadin/server/VaadinSession.java

index 5a12295d9d5e0417bd38b0ffa5913edfad81fc95..6690da7562199515ba02a47cb2e7e1f7626a0d23 100644 (file)
@@ -401,7 +401,18 @@ public class GAEVaadinServlet extends VaadinServlet {
         if (serviceSession == null) {
             return;
         }
+
+        /*
+         * Inform VaadinSession.valueUnbound that it should not kill the session
+         * even though it gets unbound.
+         */
+        serviceSession.setAttribute(
+                VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, Boolean.TRUE);
         serviceSession.removeFromSession(getService());
+
+        // Remove preservation marker
+        serviceSession.setAttribute(
+                VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, null);
     }
 
     /**
index cfbf2606aec0c30b1477254e3645fd7e68a5a62d..1be5bd5c99c3932cc8c94d77788181df48175a78 100644 (file)
@@ -71,9 +71,25 @@ import com.vaadin.util.ReflectTools;
  * @since 7.0
  */
 public abstract class VaadinService implements Serializable {
-    static final String REINITIALIZING_SESSION_MARKER = VaadinService.class
+    /**
+     * Attribute name for telling
+     * {@link VaadinSession#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)}
+     * that it should not close a {@link VaadinSession} even though it gets
+     * unbound. If a {@code VaadinSession} has an attribute with this name and
+     * the attribute value is {@link Boolean#TRUE}, that session will not be
+     * closed when it is unbound from the underlying session.
+     */
+    // Use the old name.reinitializing value for backwards compatibility
+    static final String PRESERVE_UNBOUND_SESSION_ATTRIBUTE = VaadinService.class
             .getName() + ".reinitializing";
 
+    /**
+     * @deprecated As of 7.1.1, use {@link #PRESERVE_UNBOUND_SESSION_ATTRIBUTE}
+     *             instead
+     */
+    @Deprecated
+    static final String REINITIALIZING_SESSION_MARKER = PRESERVE_UNBOUND_SESSION_ATTRIBUTE;
+
     private static final Method SESSION_INIT_METHOD = ReflectTools.findMethod(
             SessionInitListener.class, "sessionInit", SessionInitEvent.class);
 
@@ -970,7 +986,7 @@ public abstract class VaadinService implements Serializable {
             if (value instanceof VaadinSession) {
                 // set flag to avoid cleanup
                 VaadinSession serviceSession = (VaadinSession) value;
-                serviceSession.setAttribute(REINITIALIZING_SESSION_MARKER,
+                serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
                         Boolean.TRUE);
             }
             attrs.put(name, value);
@@ -997,8 +1013,8 @@ public abstract class VaadinService implements Serializable {
                         serviceSession.getLockInstance());
 
                 serviceSession.storeInSession(service, newSession);
-                serviceSession
-                        .setAttribute(REINITIALIZING_SESSION_MARKER, null);
+                serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
+                        null);
             }
         }
 
index 890b2eba29c31fc72ba9d589ccca7c7184e7ba56..8f272413842187760898b0cfb8cdf6354b1b9179 100644 (file)
@@ -240,9 +240,11 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
         } else if (VaadinService.getCurrentRequest() != null
                 && getCurrent() == this) {
             assert hasLock();
-            // Ignore if the session is being moved to a different backing
-            // session
-            if (getAttribute(VaadinService.REINITIALIZING_SESSION_MARKER) == Boolean.TRUE) {
+            /*
+             * Ignore if the session is being moved to a different backing
+             * session or if GAEVaadinServlet is doing its normal cleanup.
+             */
+            if (getAttribute(VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE) == Boolean.TRUE) {
                 return;
             }