diff options
author | Leif Åstrand <leif@vaadin.com> | 2012-09-05 17:10:31 +0300 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2012-09-05 17:10:31 +0300 |
commit | 5ab35cc6080653a7e9b25712f637db6c95c183ce (patch) | |
tree | d6fd4f845e96b5dd9c0e697aa9ff7683ec5742c8 /server/src | |
parent | 3ddaf280d61642742dff3f4a63376d0eedca5abf (diff) | |
download | vaadin-framework-5ab35cc6080653a7e9b25712f637db6c95c183ce.tar.gz vaadin-framework-5ab35cc6080653a7e9b25712f637db6c95c183ce.zip |
Combine ApplicationContext into Application (#9402)
Diffstat (limited to 'server/src')
18 files changed, 247 insertions, 490 deletions
diff --git a/server/src/com/vaadin/Application.java b/server/src/com/vaadin/Application.java index 2baf252a62..6d37fbd5ae 100644 --- a/server/src/com/vaadin/Application.java +++ b/server/src/com/vaadin/Application.java @@ -31,17 +31,19 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionBindingListener; + import com.vaadin.data.util.converter.Converter; import com.vaadin.data.util.converter.ConverterFactory; import com.vaadin.data.util.converter.DefaultConverterFactory; import com.vaadin.event.EventRouter; +import com.vaadin.server.AbstractCommunicationManager; import com.vaadin.server.AbstractErrorMessage; import com.vaadin.server.ApplicationConfiguration; -import com.vaadin.server.ApplicationContext; import com.vaadin.server.BootstrapFragmentResponse; import com.vaadin.server.BootstrapListener; import com.vaadin.server.BootstrapPageResponse; @@ -52,14 +54,15 @@ import com.vaadin.server.CombinedRequest; import com.vaadin.server.DeploymentConfiguration; import com.vaadin.server.GlobalResourceHandler; import com.vaadin.server.RequestHandler; -import com.vaadin.server.ServletApplicationContext; import com.vaadin.server.Terminal; import com.vaadin.server.UIProvider; import com.vaadin.server.VaadinServlet; import com.vaadin.server.VariableOwner; +import com.vaadin.server.WebBrowser; import com.vaadin.server.WrappedRequest; import com.vaadin.server.WrappedRequest.BrowserDetails; import com.vaadin.server.WrappedResponse; +import com.vaadin.server.WrappedSession; import com.vaadin.shared.ui.ui.UIConstants; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractField; @@ -121,7 +124,8 @@ import com.vaadin.util.ReflectTools; * @since 3.0 */ @SuppressWarnings("serial") -public class Application implements Terminal.ErrorListener, Serializable { +public class Application implements Terminal.ErrorListener, + HttpSessionBindingListener, Serializable { /** * The name of the parameter that is by default used in e.g. web.xml to @@ -147,22 +151,22 @@ public class Application implements Terminal.ErrorListener, Serializable { private final ApplicationConfiguration configuration; - private final ApplicationContext context; + private final AbstractCommunicationManager communicationManager; /** * @param applicationUrl * the URL the application should respond to. * @param configuration * the application configuration for the application. - * @param context - * the context application will be running in. + * @param communicationManager + * the communication manager for the application. */ public ApplicationStartEvent(URL applicationUrl, ApplicationConfiguration configuration, - ApplicationContext context) { + AbstractCommunicationManager communicationManager) { this.applicationUrl = applicationUrl; this.configuration = configuration; - this.context = context; + this.communicationManager = communicationManager; } /** @@ -187,14 +191,14 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Gets the context application will be running in. + * Gets the communication manager for this application. * - * @return the context application will be running in. + * @return the communication manager for this application. * - * @see Application#getContext() + * @see Application#getCommunicationManager */ - public ApplicationContext getContext() { - return context; + public AbstractCommunicationManager getCommunicationManager() { + return communicationManager; } } @@ -202,11 +206,6 @@ public class Application implements Terminal.ErrorListener, Serializable { .getName()); /** - * Application context the application is running in. - */ - private ApplicationContext context; - - /** * Configuration for the application. */ private ApplicationConfiguration configuration; @@ -257,6 +256,87 @@ public class Application implements Terminal.ErrorListener, Serializable { private GlobalResourceHandler globalResourceHandler; + protected WebBrowser browser = new WebBrowser(); + + private AbstractCommunicationManager communicationManager; + + private long totalSessionTime = 0; + + private long lastRequestTime = -1; + + private transient WrappedSession session; + + /** + * @see javax.servlet.http.HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) + */ + @Override + public void valueBound(HttpSessionBindingEvent arg0) { + // We are not interested in bindings + } + + /** + * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent) + */ + @Override + public void valueUnbound(HttpSessionBindingEvent event) { + // If we are going to be unbound from the session, the session must be + // closing + close(); + } + + /** + * Get the web browser associated with this application context. + * + * Because application context is related to the http session and server + * maintains one session per browser-instance, each context has exactly one + * web browser associated with it. + * + * @return + */ + public WebBrowser getBrowser() { + return browser; + } + + /** + * @return The total time spent servicing requests in this session. + */ + public long getTotalSessionTime() { + return totalSessionTime; + } + + /** + * Sets the time spent servicing the last request in the session and updates + * the total time spent servicing requests in this session. + * + * @param time + * the time spent in the last request. + */ + public void setLastRequestTime(long time) { + lastRequestTime = time; + totalSessionTime += time; + } + + /** + * @return the time spent servicing the last request in this session. + */ + public long getLastRequestTime() { + return lastRequestTime; + } + + /** + * Gets the session to which this application context is currently + * associated. + * + * @return the wrapped session for this context + */ + public WrappedSession getSession() { + return session; + } + + public AbstractCommunicationManager getApplicationManager() { + return communicationManager; + } + /** * Gets the URL of the application. * @@ -291,6 +371,28 @@ public class Application implements Terminal.ErrorListener, Serializable { } } + public static Application getForSession(WrappedSession session) { + Object attribute = session.getAttribute(Application.class.getName()); + if (attribute instanceof Application) { + Application application = (Application) attribute; + application.session = session; + return application; + } + + return null; + } + + public void removeFromSession() { + assert (getForSession(session) == this); + + session.setAttribute(Application.class.getName(), null); + } + + public void storeInSession(WrappedSession session) { + session.setAttribute(Application.class.getName(), this); + this.session = session; + } + /** * Starts the application on the given URL. * @@ -316,8 +418,7 @@ public class Application implements Terminal.ErrorListener, Serializable { public void start(ApplicationStartEvent event) { applicationUrl = event.getApplicationUrl(); configuration = event.getConfiguration(); - context = event.getContext(); - init(); + communicationManager = event.getCommunicationManager(); applicationIsRunning = true; } @@ -325,9 +426,8 @@ public class Application implements Terminal.ErrorListener, Serializable { * Tests if the application is running or if it has been finished. * * <p> - * Application starts running when its - * {@link #start(URL, Properties, ApplicationContext)} method has been - * called and stops when the {@link #close()} is called. + * Application starts running when its {@link #start(ApplicationStartEvent)} + * method has been called and stops when the {@link #close()} is called. * </p> * * @return <code>true</code> if the application is running, @@ -338,17 +438,6 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * <p> - * Main initializer of the application. The <code>init</code> method is - * called by the framework when the application is started, and it should - * perform whatever initialization operations the application needs. - * </p> - */ - public void init() { - // Default implementation does nothing - } - - /** * Gets the configuration for this application * * @return the application configuration @@ -575,28 +664,6 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Gets the application context. - * <p> - * The application context is the environment where the application is - * running in. The actual implementation class of may contains quite a lot - * more functionality than defined in the {@link ApplicationContext} - * interface. - * </p> - * <p> - * By default, when you are deploying your application to a servlet - * container, the implementation class is {@link ServletApplicationContext} - * - you can safely cast to this class and use the methods from there. When - * you are deploying your application as a portlet, context implementation - * is {@link PortletApplicationContext}. - * </p> - * - * @return the application context. - */ - public ApplicationContext getContext() { - return context; - } - - /** * Gets the application error handler. * * The default error handler is the application itself. @@ -1871,8 +1938,8 @@ public class Application implements Terminal.ErrorListener, Serializable { * timeout never occurs. */ protected int getUidlRequestTimeout() { - return configuration.isIdleUICleanupEnabled() ? getContext() - .getSession().getMaxInactiveInterval() : -1; + return configuration.isIdleUICleanupEnabled() ? getSession() + .getMaxInactiveInterval() : -1; } /** diff --git a/server/src/com/vaadin/LegacyApplication.java b/server/src/com/vaadin/LegacyApplication.java index 5bfc466fa4..b884136767 100644 --- a/server/src/com/vaadin/LegacyApplication.java +++ b/server/src/com/vaadin/LegacyApplication.java @@ -26,27 +26,25 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.vaadin.server.AbstractUIProvider; -import com.vaadin.server.ApplicationContext; -import com.vaadin.server.WrappedRequest; import com.vaadin.server.Terminal.ErrorEvent; import com.vaadin.server.Terminal.ErrorListener; +import com.vaadin.server.WrappedRequest; import com.vaadin.ui.UI; -import com.vaadin.ui.UI.LegacyWindow; /** - * A special application designed to help migrating applications from Vaadin - * 6 to Vaadin 7. The legacy application supports setting a main window, - * adding additional browser level windows and defining the theme for the - * entire application. + * A special application designed to help migrating applications from Vaadin 6 + * to Vaadin 7. The legacy application supports setting a main window, adding + * additional browser level windows and defining the theme for the entire + * application. * - * @deprecated This class is only intended to ease migration and should not - * be used for new projects. + * @deprecated This class is only intended to ease migration and should not be + * used for new projects. * * @since 7.0 */ @Deprecated -public abstract class LegacyApplication extends AbstractUIProvider - implements ErrorListener { +public abstract class LegacyApplication extends AbstractUIProvider implements + ErrorListener { /** * Ignore initial / and then get everything up to the next / */ @@ -59,16 +57,15 @@ public abstract class LegacyApplication extends AbstractUIProvider private Map<String, UI.LegacyWindow> legacyUINames = new HashMap<String, UI.LegacyWindow>(); /** - * Sets the main window of this application. Setting window as a main - * window of this application also adds the window to this application. + * Sets the main window of this application. Setting window as a main window + * of this application also adds the window to this application. * * @param mainWindow * the UI to set as the default window */ public void setMainWindow(UI.LegacyWindow mainWindow) { if (this.mainWindow != null) { - throw new IllegalStateException( - "mainWindow has already been set"); + throw new IllegalStateException("mainWindow has already been set"); } if (mainWindow.getApplication() == null) { mainWindow.setApplication(Application.getCurrent()); @@ -102,8 +99,8 @@ public abstract class LegacyApplication extends AbstractUIProvider } @Override - public UI createInstance(Application application, - Class<? extends UI> type, WrappedRequest request) { + public UI createInstance(Application application, Class<? extends UI> type, + WrappedRequest request) { return getUIInstance(request); } @@ -159,9 +156,9 @@ public abstract class LegacyApplication extends AbstractUIProvider } /** - * This implementation simulates the way of finding a window for a - * request by extracting a window name from the requested path and - * passes that name to {@link #getWindow(String)}. + * This implementation simulates the way of finding a window for a request + * by extracting a window name from the requested path and passes that name + * to {@link #getWindow(String)}. * <p> * {@inheritDoc} */ @@ -196,9 +193,9 @@ public abstract class LegacyApplication extends AbstractUIProvider /** * Gets the application's theme. The application's theme is the default - * theme used by all the uIs for which a theme is not explicitly - * defined. If the application theme is not explicitly set, - * <code>null</code> is returned. + * theme used by all the uIs for which a theme is not explicitly defined. If + * the application theme is not explicitly set, <code>null</code> is + * returned. * * @return the name of the application's theme. */ @@ -208,15 +205,14 @@ public abstract class LegacyApplication extends AbstractUIProvider /** * <p> - * Gets a UI by name. Returns <code>null</code> if the application is - * not running or it does not contain a window corresponding to the - * name. + * Gets a UI by name. Returns <code>null</code> if the application is not + * running or it does not contain a window corresponding to the name. * </p> * * @param name * the name of the requested window - * @return a UI corresponding to the name, or <code>null</code> to use - * the default window + * @return a UI corresponding to the name, or <code>null</code> to use the + * default window */ public UI.LegacyWindow getWindow(String name) { return legacyUINames.get(name); @@ -228,9 +224,9 @@ public abstract class LegacyApplication extends AbstractUIProvider private int namelessUIIndex = 0; /** - * Adds a new browser level window to this application. Please note that - * UI doesn't have a name that is used in the URL - to add a named - * window you should instead use {@link #addWindow(UI, String)} + * Adds a new browser level window to this application. Please note that UI + * doesn't have a name that is used in the URL - to add a named window you + * should instead use {@link #addWindow(UI, String)} * * @param uI * the UI window to add to the application @@ -249,21 +245,20 @@ public abstract class LegacyApplication extends AbstractUIProvider } /** - * Removes the specified window from the application. This also removes - * all name mappings for the window (see {@link #addWindow(UI, String) - * and #getWindowName(UI)}. + * Removes the specified window from the application. This also removes all + * name mappings for the window (see {@link #addWindow(UI, String) and + * #getWindowName(UI)}. * * <p> - * Note that removing window from the application does not close the - * browser window - the window is only removed from the server-side. + * Note that removing window from the application does not close the browser + * window - the window is only removed from the server-side. * </p> * * @param uI * the UI to remove */ public void removeWindow(UI.LegacyWindow uI) { - for (Entry<String, UI.LegacyWindow> entry : legacyUINames - .entrySet()) { + for (Entry<String, UI.LegacyWindow> entry : legacyUINames.entrySet()) { if (entry.getValue() == uI) { legacyUINames.remove(entry.getKey()); } @@ -288,8 +283,8 @@ public abstract class LegacyApplication extends AbstractUIProvider Application.getCurrent().terminalError(event); } - public ApplicationContext getContext() { - return Application.getCurrent().getContext(); + public Application getContext() { + return Application.getCurrent(); } protected void close() { diff --git a/server/src/com/vaadin/server/AbstractCommunicationManager.java b/server/src/com/vaadin/server/AbstractCommunicationManager.java index 3d27dd18b9..47bf652a3a 100644 --- a/server/src/com/vaadin/server/AbstractCommunicationManager.java +++ b/server/src/com/vaadin/server/AbstractCommunicationManager.java @@ -1313,9 +1313,9 @@ public abstract class AbstractCommunicationManager implements Serializable { * response. */ private void writePerformanceData(final PrintWriter outWriter) { - ApplicationContext ctx = application.getContext(); outWriter.write(String.format(", \"timings\":[%d, %d]", - ctx.getTotalSessionTime(), ctx.getLastRequestTime())); + application.getTotalSessionTime(), + application.getLastRequestTime())); } private void legacyPaint(PaintTarget paintTarget, diff --git a/server/src/com/vaadin/server/ApplicationContext.java b/server/src/com/vaadin/server/ApplicationContext.java deleted file mode 100644 index 0b317486e4..0000000000 --- a/server/src/com/vaadin/server/ApplicationContext.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2011 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.vaadin.server; - -import java.io.Serializable; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.servlet.http.HttpSessionBindingEvent; -import javax.servlet.http.HttpSessionBindingListener; - -import com.vaadin.Application; - -/** - * <code>ApplicationContext</code> provides information about the running - * context of the application. Each context is shared by all applications that - * are open for one user. In a web-environment this corresponds to a - * HttpSession. - * <p> - * Base class for web application contexts (including portlet contexts) that - * handles the common tasks. - * - * @author Vaadin Ltd. - * @since 3.1 - */ -public abstract class ApplicationContext implements HttpSessionBindingListener, - Serializable { - - private Application application; - - protected WebBrowser browser = new WebBrowser(); - - private AbstractCommunicationManager communicationManager; - - private long totalSessionTime = 0; - - private long lastRequestTime = -1; - - private transient WrappedSession session; - - /** - * @see javax.servlet.http.HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) - */ - @Override - public void valueBound(HttpSessionBindingEvent arg0) { - // We are not interested in bindings - } - - /** - * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent) - */ - @Override - public void valueUnbound(HttpSessionBindingEvent event) { - // If we are going to be unbound from the session, the session must be - // closing - removeApplication(); - } - - /** - * Get the web browser associated with this application context. - * - * Because application context is related to the http session and server - * maintains one session per browser-instance, each context has exactly one - * web browser associated with it. - * - * @return - */ - public WebBrowser getBrowser() { - return browser; - } - - /** - * Returns the applications in this context. - * - * Each application context contains the application for one user. - * - * @return The application of this context, or <code>null</code> if there is - * no application - */ - public Application getApplication() { - return application; - } - - public void removeApplication() { - if (application == null) { - return; - } - try { - application.close(); - } catch (Exception e) { - // This should never happen but is possible with rare - // configurations (e.g. robustness tests). If you have one - // thread doing HTTP socket write and another thread trying to - // remove same application here. Possible if you got e.g. session - // lifetime 1 min but socket write may take longer than 1 min. - // FIXME: Handle exception - getLogger().log(Level.SEVERE, - "Could not close application, leaking memory.", e); - } finally { - application = null; - communicationManager = null; - } - } - - /** - * @return The total time spent servicing requests in this session. - */ - public long getTotalSessionTime() { - return totalSessionTime; - } - - /** - * Sets the time spent servicing the last request in the session and updates - * the total time spent servicing requests in this session. - * - * @param time - * the time spent in the last request. - */ - public void setLastRequestTime(long time) { - lastRequestTime = time; - totalSessionTime += time; - } - - /** - * @return the time spent servicing the last request in this session. - */ - public long getLastRequestTime() { - return lastRequestTime; - } - - private Logger getLogger() { - return Logger.getLogger(ApplicationContext.class.getName()); - } - - /** - * Gets the session to which this application context is currently - * associated. - * - * @return the wrapped session for this context - */ - public WrappedSession getSession() { - return session; - } - - /** - * Sets the session to which this application context is currently - * associated. - * - * @param session - * the wrapped session for this context - */ - public void setSession(WrappedSession session) { - this.session = session; - } - - public AbstractCommunicationManager getApplicationManager() { - return communicationManager; - } - - public void setApplication(Application application, - AbstractCommunicationManager communicationManager) { - if (this.application != null) { - removeApplication(); - } - this.application = application; - this.communicationManager = communicationManager; - } - -}
\ No newline at end of file diff --git a/server/src/com/vaadin/server/CombinedRequest.java b/server/src/com/vaadin/server/CombinedRequest.java index 3432cda942..9176754d93 100644 --- a/server/src/com/vaadin/server/CombinedRequest.java +++ b/server/src/com/vaadin/server/CombinedRequest.java @@ -143,9 +143,7 @@ public class CombinedRequest implements WrappedRequest { @Override public WebBrowser getWebBrowser() { - ApplicationContext context = Application.getCurrent() - .getContext(); - return context.getBrowser(); + return Application.getCurrent().getBrowser(); } }; } diff --git a/server/src/com/vaadin/server/CommunicationManager.java b/server/src/com/vaadin/server/CommunicationManager.java index cc92023919..beea884aae 100644 --- a/server/src/com/vaadin/server/CommunicationManager.java +++ b/server/src/com/vaadin/server/CommunicationManager.java @@ -113,7 +113,7 @@ public class CommunicationManager extends AbstractCommunicationManager { protected InputStream getThemeResourceAsStream(UI uI, String themeName, String resource) { ServletApplicationContext context = (ServletApplicationContext) uI - .getApplication().getContext(); + .getApplication(); ServletContext servletContext = context.getHttpSession() .getServletContext(); return servletContext.getResourceAsStream("/" diff --git a/server/src/com/vaadin/server/GAEVaadinServlet.java b/server/src/com/vaadin/server/GAEVaadinServlet.java index 642737f73b..1175d6a960 100644 --- a/server/src/com/vaadin/server/GAEVaadinServlet.java +++ b/server/src/com/vaadin/server/GAEVaadinServlet.java @@ -47,6 +47,7 @@ import com.google.appengine.api.memcache.Expiration; import com.google.appengine.api.memcache.MemcacheService; import com.google.appengine.api.memcache.MemcacheServiceFactory; import com.google.apphosting.api.DeadlineExceededException; +import com.vaadin.Application; /** * ApplicationServlet to be used when deploying to Google App Engine, in @@ -241,7 +242,7 @@ public class GAEVaadinServlet extends VaadinServlet { } // de-serialize or create application context, store in session - ApplicationContext ctx = getApplicationContext(request, memcache); + Application ctx = getApplicationContext(request, memcache); super.service(request, response); @@ -291,8 +292,8 @@ public class GAEVaadinServlet extends VaadinServlet { } } - protected ApplicationContext getApplicationContext( - HttpServletRequest request, MemcacheService memcache) { + protected Application getApplicationContext(HttpServletRequest request, + MemcacheService memcache) { HttpSession session = request.getSession(); String id = AC_BASE + session.getId(); byte[] serializedAC = (byte[]) memcache.get(id); @@ -320,10 +321,9 @@ public class GAEVaadinServlet extends VaadinServlet { ObjectInputStream ois; try { ois = new ObjectInputStream(bais); - ApplicationContext applicationContext = (ApplicationContext) ois - .readObject(); - session.setAttribute(ServletApplicationContext.class.getName(), - applicationContext); + Application applicationContext = (Application) ois.readObject(); + applicationContext.storeInSession(new WrappedHttpSession( + session)); } catch (IOException e) { getLogger().log( Level.WARNING, diff --git a/server/src/com/vaadin/server/LegacyVaadinPortlet.java b/server/src/com/vaadin/server/LegacyVaadinPortlet.java index 7de38eaf94..77a94e4d0a 100644 --- a/server/src/com/vaadin/server/LegacyVaadinPortlet.java +++ b/server/src/com/vaadin/server/LegacyVaadinPortlet.java @@ -46,9 +46,10 @@ public class LegacyVaadinPortlet extends VaadinPortlet { } @Override - protected Application createApplication(PortletRequest request) - throws PortletException { - Application application = super.createApplication(request); + protected PortletApplicationContext2 createApplication( + PortletRequest request) throws PortletException { + PortletApplicationContext2 application = super + .createApplication(request); // Must set current before running init() Application.setCurrent(application); diff --git a/server/src/com/vaadin/server/LegacyVaadinServlet.java b/server/src/com/vaadin/server/LegacyVaadinServlet.java index 21419a2e33..aa78c401f5 100644 --- a/server/src/com/vaadin/server/LegacyVaadinServlet.java +++ b/server/src/com/vaadin/server/LegacyVaadinServlet.java @@ -46,9 +46,10 @@ public class LegacyVaadinServlet extends VaadinServlet { } @Override - protected Application createApplication(HttpServletRequest request) - throws ServletException { - Application application = super.createApplication(request); + protected ServletApplicationContext createApplication( + HttpServletRequest request) throws ServletException { + ServletApplicationContext application = super + .createApplication(request); // Must set current before running init() Application.setCurrent(application); diff --git a/server/src/com/vaadin/server/Page.java b/server/src/com/vaadin/server/Page.java index 015c6c907f..a1c181dcb9 100644 --- a/server/src/com/vaadin/server/Page.java +++ b/server/src/com/vaadin/server/Page.java @@ -391,7 +391,7 @@ public class Page implements Serializable { } public WebBrowser getWebBrowser() { - return uI.getApplication().getContext().getBrowser(); + return uI.getApplication().getBrowser(); } public void setBrowserWindowSize(int width, int height) { diff --git a/server/src/com/vaadin/server/PortletApplicationContext2.java b/server/src/com/vaadin/server/PortletApplicationContext2.java index a7b6d5b40a..ff23d12f4c 100644 --- a/server/src/com/vaadin/server/PortletApplicationContext2.java +++ b/server/src/com/vaadin/server/PortletApplicationContext2.java @@ -41,6 +41,7 @@ import javax.portlet.StateAwareResponse; import javax.servlet.http.HttpSessionBindingListener; import javax.xml.namespace.QName; +import com.vaadin.Application; import com.vaadin.ui.UI; import com.vaadin.util.CurrentInstance; @@ -53,7 +54,7 @@ import com.vaadin.util.CurrentInstance; * @author peholmst */ @SuppressWarnings("serial") -public class PortletApplicationContext2 extends ApplicationContext { +public class PortletApplicationContext2 extends Application { private final Set<PortletListener> portletListeners = new LinkedHashSet<PortletListener>(); @@ -63,26 +64,6 @@ public class PortletApplicationContext2 extends ApplicationContext { private final Map<String, String> sharedParameterActionNameMap = new HashMap<String, String>(); private final Map<String, String> sharedParameterActionValueMap = new HashMap<String, String>(); - public static PortletApplicationContext2 getApplicationContext( - PortletSession session) { - Object cxattr = session.getAttribute(PortletApplicationContext2.class - .getName()); - PortletApplicationContext2 cx = null; - // can be false also e.g. if old context comes from another - // classloader when using - // <private-session-attributes>false</private-session-attributes> - // and redeploying the portlet - see #7461 - if (cxattr instanceof PortletApplicationContext2) { - cx = (PortletApplicationContext2) cxattr; - } - if (cx == null) { - cx = new PortletApplicationContext2(); - session.setAttribute(PortletApplicationContext2.class.getName(), cx); - } - cx.setSession(new WrappedPortletSession(session)); - return cx; - } - public PortletSession getPortletSession() { WrappedSession wrappedSession = getSession(); PortletSession session = ((WrappedPortletSession) wrappedSession) diff --git a/server/src/com/vaadin/server/PortletCommunicationManager.java b/server/src/com/vaadin/server/PortletCommunicationManager.java index f7214f108c..ada42140c6 100644 --- a/server/src/com/vaadin/server/PortletCommunicationManager.java +++ b/server/src/com/vaadin/server/PortletCommunicationManager.java @@ -158,7 +158,7 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { protected InputStream getThemeResourceAsStream(UI uI, String themeName, String resource) { PortletApplicationContext2 context = (PortletApplicationContext2) uI - .getApplication().getContext(); + .getApplication(); PortletContext portletContext = context.getPortletSession() .getPortletContext(); return portletContext.getResourceAsStream("/" diff --git a/server/src/com/vaadin/server/RequestTimer.java b/server/src/com/vaadin/server/RequestTimer.java index 470677e331..afff901d2f 100644 --- a/server/src/com/vaadin/server/RequestTimer.java +++ b/server/src/com/vaadin/server/RequestTimer.java @@ -18,6 +18,7 @@ package com.vaadin.server; import java.io.Serializable; +import com.vaadin.Application; /** * Times the handling of requests and stores the information as an attribute in @@ -44,7 +45,7 @@ public class RequestTimer implements Serializable { * * @param context */ - public void stop(ApplicationContext context) { + public void stop(Application context) { // Measure and store the total handling time. This data can be // used in TestBench 3 tests. long time = (System.nanoTime() - requestStartTime) / 1000000; diff --git a/server/src/com/vaadin/server/ServletApplicationContext.java b/server/src/com/vaadin/server/ServletApplicationContext.java index a1f5a81624..0945de6cb5 100644 --- a/server/src/com/vaadin/server/ServletApplicationContext.java +++ b/server/src/com/vaadin/server/ServletApplicationContext.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; +import com.vaadin.Application; import com.vaadin.util.CurrentInstance; /** @@ -35,18 +36,10 @@ import com.vaadin.util.CurrentInstance; * @since 3.1 */ @SuppressWarnings("serial") -public class ServletApplicationContext extends ApplicationContext { +public class ServletApplicationContext extends Application { private transient boolean reinitializingSession = false; - /** - * Creates a new Web Application Context. - * - */ - protected ServletApplicationContext() { - - } - @Override public void valueUnbound(HttpSessionBindingEvent event) { if (!reinitializingSession) { @@ -62,7 +55,6 @@ public class ServletApplicationContext extends ApplicationContext { * contents. The purpose of this is to introduce a new session key in order * to avoid session fixation attacks. */ - @SuppressWarnings("unchecked") public void reinitializeSession() { HttpSession oldSession = getHttpSession(); @@ -93,7 +85,7 @@ public class ServletApplicationContext extends ApplicationContext { } // Update the "current session" variable - setSession(new WrappedHttpSession(newSession)); + storeInSession(new WrappedHttpSession(newSession)); } /** @@ -106,22 +98,4 @@ public class ServletApplicationContext extends ApplicationContext { return ((WrappedHttpSession) session).getHttpSession(); } - /** - * Gets the application context for an HttpSession. - * - * @param session - * the HTTP session. - * @return the application context for HttpSession. - */ - static public ServletApplicationContext getApplicationContext( - HttpSession session) { - ServletApplicationContext cx = (ServletApplicationContext) session - .getAttribute(ServletApplicationContext.class.getName()); - if (cx == null) { - cx = new ServletApplicationContext(); - session.setAttribute(ServletApplicationContext.class.getName(), cx); - } - cx.setSession(new WrappedHttpSession(session)); - return cx; - } } diff --git a/server/src/com/vaadin/server/VaadinPortlet.java b/server/src/com/vaadin/server/VaadinPortlet.java index eae01e9369..e69a635b76 100644 --- a/server/src/com/vaadin/server/VaadinPortlet.java +++ b/server/src/com/vaadin/server/VaadinPortlet.java @@ -474,8 +474,7 @@ public class VaadinPortlet extends GenericPortlet implements Constants { * Get or create an application context and an application * manager for the session */ - PortletApplicationContext2 applicationContext = getApplicationContext(request - .getPortletSession()); + PortletApplicationContext2 applicationContext = (PortletApplicationContext2) application; PortletCommunicationManager applicationManager = (PortletCommunicationManager) applicationContext .getApplicationManager(); @@ -494,8 +493,6 @@ public class VaadinPortlet extends GenericPortlet implements Constants { applicationContext.getBrowser().updateRequestDetails( wrappedRequest); - /* Start the newly created application */ - startApplication(request, application, applicationContext); applicationRunning = true; /* Notify listeners */ @@ -596,9 +593,8 @@ public class VaadinPortlet extends GenericPortlet implements Constants { CurrentInstance.clearAll(); - PortletSession session = request.getPortletSession(false); - if (session != null) { - requestTimer.stop(getApplicationContext(session)); + if (application != null) { + requestTimer.stop(application); } } } @@ -764,27 +760,10 @@ public class VaadinPortlet extends GenericPortlet implements Constants { && (request.getParameter(URL_PARAMETER_REPAINT_ALL).equals("1")); } - private void startApplication(PortletRequest request, - Application application, PortletApplicationContext2 context) - throws PortletException, MalformedURLException { - if (!application.isRunning()) { - Locale locale = request.getLocale(); - application.setLocale(locale); - // No application URL when running inside a portlet - application.start(new ApplicationStartEvent(null, - getDeploymentConfiguration().getApplicationConfiguration(), - context)); - addonContext.fireApplicationStarted(application); - } - } - private void endApplication(PortletRequest request, PortletResponse response, Application application) throws IOException { - final PortletSession session = request.getPortletSession(); - if (session != null) { - getApplicationContext(session).removeApplication(); - } + application.removeFromSession(); // Do not send any redirects when running inside a portlet. } @@ -839,10 +818,7 @@ public class VaadinPortlet extends GenericPortlet implements Constants { } application.close(); - if (session != null) { - PortletApplicationContext2 context = getApplicationContext(session); - context.removeApplication(); - } + application.removeFromSession(); } private Application createAndRegisterApplication(PortletRequest request) @@ -855,16 +831,23 @@ public class VaadinPortlet extends GenericPortlet implements Constants { throw new PortletException(e); } - final PortletApplicationContext2 context = getApplicationContext(request - .getPortletSession()); - context.setApplication(newApplication, new PortletCommunicationManager( - newApplication)); + newApplication.storeInSession(new WrappedPortletSession(request + .getPortletSession())); + + Locale locale = request.getLocale(); + newApplication.setLocale(locale); + // No application URL when running inside a portlet + newApplication.start(new ApplicationStartEvent(null, + getDeploymentConfiguration().getApplicationConfiguration(), + new PortletCommunicationManager(newApplication))); + addonContext.fireApplicationStarted(newApplication); + return newApplication; } - protected Application createApplication(PortletRequest request) - throws PortletException { - Application application = new Application(); + protected PortletApplicationContext2 createApplication( + PortletRequest request) throws PortletException { + PortletApplicationContext2 application = new PortletApplicationContext2(); try { ServletPortletHelper.initDefaultUIProvider(application, @@ -887,18 +870,17 @@ public class VaadinPortlet extends GenericPortlet implements Constants { throw new SessionExpiredException(); } - PortletApplicationContext2 context = getApplicationContext(session); - Application application = context.getApplication(); + Application application = Application + .getForSession(new WrappedPortletSession(session)); if (application == null) { return null; } - if (application.isRunning()) { - return application; + if (!application.isRunning()) { + application.removeFromSession(); + return null; } - // application found but not running - context.removeApplication(); - return null; + return application; } private void handleServiceException(WrappedPortletRequest request, @@ -1003,21 +985,6 @@ public class VaadinPortlet extends GenericPortlet implements Constants { outWriter.close(); } - /** - * - * Gets the application context for a PortletSession. If no context is - * currently stored in a session a new context is created and stored in the - * session. - * - * @param portletSession - * the portlet session. - * @return the application context for the session. - */ - protected PortletApplicationContext2 getApplicationContext( - PortletSession portletSession) { - return PortletApplicationContext2.getApplicationContext(portletSession); - } - private static final Logger getLogger() { return Logger.getLogger(VaadinPortlet.class.getName()); } diff --git a/server/src/com/vaadin/server/VaadinServlet.java b/server/src/com/vaadin/server/VaadinServlet.java index 8f33382110..eb21096c9b 100644 --- a/server/src/com/vaadin/server/VaadinServlet.java +++ b/server/src/com/vaadin/server/VaadinServlet.java @@ -318,8 +318,7 @@ public class VaadinServlet extends HttpServlet implements Constants { * Get or create a WebApplicationContext and an ApplicationManager * for the session */ - ServletApplicationContext webApplicationContext = getApplicationContext(request - .getSession()); + ServletApplicationContext webApplicationContext = (ServletApplicationContext) application; CommunicationManager applicationManager = (CommunicationManager) webApplicationContext .getApplicationManager(); @@ -335,8 +334,6 @@ public class VaadinServlet extends HttpServlet implements Constants { /* Update browser information from the request */ webApplicationContext.getBrowser().updateRequestDetails(request); - // Start the application if it's newly created - startApplication(request, application, webApplicationContext); applicationRunning = true; /* Handle the request */ @@ -388,9 +385,8 @@ public class VaadinServlet extends HttpServlet implements Constants { CurrentInstance.clearAll(); - HttpSession session = request.getSession(false); - if (session != null) { - requestTimer.stop(getApplicationContext(session)); + if (application != null) { + requestTimer.stop(application); } } } @@ -631,7 +627,7 @@ public class VaadinServlet extends HttpServlet implements Constants { } private Application createAndRegisterApplication(HttpServletRequest request) - throws ServletException { + throws ServletException, MalformedURLException { Application newApplication = createApplication(request); try { @@ -640,10 +636,19 @@ public class VaadinServlet extends HttpServlet implements Constants { throw new ServletException(e); } - final ServletApplicationContext context = getApplicationContext(request - .getSession()); - context.setApplication(newApplication, - createCommunicationManager(newApplication)); + newApplication.storeInSession(new WrappedHttpSession(request + .getSession())); + + final URL applicationUrl = getApplicationUrl(request); + + // Initial locale comes from the request + Locale locale = request.getLocale(); + newApplication.setLocale(locale); + newApplication.start(new ApplicationStartEvent(applicationUrl, + getDeploymentConfiguration().getApplicationConfiguration(), + createCommunicationManager(newApplication))); + + addonContext.fireApplicationStarted(newApplication); return newApplication; } @@ -717,9 +722,9 @@ public class VaadinServlet extends HttpServlet implements Constants { * @throws ServletException * @throws MalformedURLException */ - protected Application createApplication(HttpServletRequest request) - throws ServletException { - Application newApplication = new Application(); + protected ServletApplicationContext createApplication( + HttpServletRequest request) throws ServletException { + ServletApplicationContext newApplication = new ServletApplicationContext(); try { ServletPortletHelper.initDefaultUIProvider(newApplication, @@ -869,34 +874,6 @@ public class VaadinServlet extends HttpServlet implements Constants { } /** - * Starts the application if it is not already running. - * - * @param request - * @param application - * @param webApplicationContext - * @throws ServletException - * @throws MalformedURLException - */ - private void startApplication(HttpServletRequest request, - Application application, - ServletApplicationContext webApplicationContext) - throws ServletException, MalformedURLException { - - if (!application.isRunning()) { - // Create application - final URL applicationUrl = getApplicationUrl(request); - - // Initial locale comes from the request - Locale locale = request.getLocale(); - application.setLocale(locale); - application.start(new ApplicationStartEvent(applicationUrl, - getDeploymentConfiguration().getApplicationConfiguration(), - webApplicationContext)); - addonContext.fireApplicationStarted(application); - } - } - - /** * Check if this is a request for a static resource and, if it is, serve the * resource to the client. * @@ -1303,24 +1280,18 @@ public class VaadinServlet extends HttpServlet implements Constants { throw new SessionExpiredException(); } - ServletApplicationContext context = getApplicationContext(session); - - Application sessionApplication = context.getApplication(); + Application sessionApplication = getApplicationContext(session); if (sessionApplication == null) { return null; } - if (sessionApplication.isRunning()) { - // Found a running application - return sessionApplication; + if (!sessionApplication.isRunning()) { + sessionApplication.removeFromSession(); + return null; } - // Application has stopped, so remove it before creating a new - // application - getApplicationContext(session).removeApplication(); - // Existing application not found - return null; + return sessionApplication; } /** @@ -1346,7 +1317,7 @@ public class VaadinServlet extends HttpServlet implements Constants { final HttpSession session = request.getSession(); if (session != null) { - getApplicationContext(session).removeApplication(); + application.removeFromSession(); } response.sendRedirect(response.encodeRedirectURL(logoutUrl)); @@ -1398,29 +1369,14 @@ public class VaadinServlet extends HttpServlet implements Constants { application.close(); if (session != null) { - ServletApplicationContext context = getApplicationContext(session); - context.removeApplication(); + application.removeFromSession(); } } - /** - * - * Gets the application context from an HttpSession. If no context is - * currently stored in a session a new context is created and stored in the - * session. - * - * @param session - * the HTTP session. - * @return the application context for HttpSession. - */ - protected ServletApplicationContext getApplicationContext( - HttpSession session) { - /* - * TODO the ApplicationContext.getApplicationContext() should be removed - * and logic moved here. Now overriding context type is possible, but - * the whole creation logic should be here. MT 1101 - */ - return ServletApplicationContext.getApplicationContext(session); + protected Application getApplicationContext(final HttpSession session) { + Application sessionApplication = Application + .getForSession(new WrappedHttpSession(session)); + return sessionApplication; } public class RequestError implements Terminal.ErrorEvent, Serializable { diff --git a/server/src/com/vaadin/server/WrappedHttpServletRequest.java b/server/src/com/vaadin/server/WrappedHttpServletRequest.java index 9285f92035..05d9b13736 100644 --- a/server/src/com/vaadin/server/WrappedHttpServletRequest.java +++ b/server/src/com/vaadin/server/WrappedHttpServletRequest.java @@ -89,9 +89,7 @@ public class WrappedHttpServletRequest extends HttpServletRequestWrapper @Override public WebBrowser getWebBrowser() { - ApplicationContext context = Application.getCurrent() - .getContext(); - return context.getBrowser(); + return Application.getCurrent().getBrowser(); } }; } diff --git a/server/src/com/vaadin/server/WrappedPortletRequest.java b/server/src/com/vaadin/server/WrappedPortletRequest.java index 2d444d86ca..dffbebb379 100644 --- a/server/src/com/vaadin/server/WrappedPortletRequest.java +++ b/server/src/com/vaadin/server/WrappedPortletRequest.java @@ -152,7 +152,7 @@ public class WrappedPortletRequest implements WrappedRequest { @Override public WebBrowser getWebBrowser() { PortletApplicationContext2 context = (PortletApplicationContext2) Application - .getCurrent().getContext(); + .getCurrent(); return context.getBrowser(); } }; |