Browse Source

Don't make VaadinSession serialize VaadinService (#10088)

* Refactor ApplicationRunnerServlet UIProvider to avoid indirect
reference through anonymous inner class

Change-Id: Ie4148e633192b1940ba82edbd26fbbc0cc2c4da3
tags/7.0.0.beta10
Leif Åstrand 11 years ago
parent
commit
4457324ff1

+ 16
- 2
server/src/com/vaadin/server/VaadinSession.java View File

@@ -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());
}
}

+ 15
- 7
uitest/src/com/vaadin/launcher/ApplicationRunnerServlet.java View File

@@ -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;

Loading…
Cancel
Save