diff options
-rw-r--r-- | server/src/com/vaadin/server/VaadinSession.java | 18 | ||||
-rw-r--r-- | uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java | 22 |
2 files changed, 31 insertions, 9 deletions
diff --git a/server/src/com/vaadin/server/VaadinSession.java b/server/src/com/vaadin/server/VaadinSession.java index 5deb54f57c..205e4dc6cf 100644 --- a/server/src/com/vaadin/server/VaadinSession.java +++ b/server/src/com/vaadin/server/VaadinSession.java @@ -27,6 +27,7 @@ import java.util.Locale; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.logging.Logger; import javax.portlet.PortletSession; import javax.servlet.http.HttpSession; @@ -125,7 +126,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { private LinkedList<UIProvider> uiProviders = new LinkedList<UIProvider>(); - private VaadinService service; + private transient VaadinService service; /** * Create a new service session tied to a Vaadin service @@ -153,7 +154,15 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { // If we are going to be unbound from the session, the session must be // closing // Notify the service - service.fireSessionDestroy(this); + if (service == null) { + getLogger() + .warning( + "A VaadinSession instance not associated to any service is getting unbound. " + + "Session destroy events will not be fired and UIs in the session will not get detached. " + + "This might happen if a session is deserialized but never used before it expires."); + } else { + service.fireSessionDestroy(this); + } session = null; } @@ -257,6 +266,7 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { if (attribute instanceof VaadinSession) { VaadinSession vaadinSession = (VaadinSession) attribute; vaadinSession.session = underlyingSession; + vaadinSession.service = service; return vaadinSession; } @@ -896,4 +906,8 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable { public boolean isClosing() { return closing; } + + private static final Logger getLogger() { + return Logger.getLogger(VaadinSession.class.getName()); + } } diff --git a/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java b/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java index 8e8d94bcbd..6b6044ab5b 100644 --- a/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java +++ b/uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java @@ -139,13 +139,8 @@ public class ApplicationRunnerServlet extends LegacyVaadinServlet { try { final Class<?> classToRun = getClassToRun(); if (UI.class.isAssignableFrom(classToRun)) { - session.addUIProvider(new UIProvider() { - @Override - public Class<? extends UI> getUIClass( - UIClassSelectionEvent event) { - return (Class<? extends UI>) classToRun; - } - }); + session.addUIProvider(new ApplicationRunnerUIProvider( + classToRun)); } else if (LegacyApplication.class.isAssignableFrom(classToRun)) { // Avoid using own UIProvider for legacy Application } else if (UIProvider.class.isAssignableFrom(classToRun)) { @@ -171,6 +166,19 @@ public class ApplicationRunnerServlet extends LegacyVaadinServlet { return getApplicationRunnerURIs(request).applicationClassname; } + private static final class ApplicationRunnerUIProvider extends UIProvider { + private final Class<?> classToRun; + + private ApplicationRunnerUIProvider(Class<?> classToRun) { + this.classToRun = classToRun; + } + + @Override + public Class<? extends UI> getUIClass(UIClassSelectionEvent event) { + return (Class<? extends UI>) classToRun; + } + } + // TODO Don't need to use a data object now that there's only one field private static class URIS { // String staticFilesPath; |