]> source.dussan.org Git - vaadin-framework.git/commitdiff
Don't lock session for checking request details (#12265)
authorLeif Åstrand <leif@vaadin.com>
Tue, 23 Jul 2013 11:20:17 +0000 (14:20 +0300)
committerVaadin Code Review <review@vaadin.com>
Mon, 29 Jul 2013 13:22:48 +0000 (13:22 +0000)
Change-Id: Id3e2b250b6aea66859274e2a5d6046c4f80172c3

server/src/com/vaadin/server/BootstrapHandler.java
server/src/com/vaadin/server/SynchronizedRequestHandler.java
server/src/com/vaadin/server/communication/HeartbeatHandler.java
server/src/com/vaadin/server/communication/UIInitHandler.java
server/src/com/vaadin/server/communication/UidlRequestHandler.java

index b21fdb0b744fb9d919a852b0fc71af4ebf297c0f..f237d9edd4243075c3ca6cbca4ac5a3d0246bb99 100644 (file)
@@ -145,15 +145,16 @@ public abstract class BootstrapHandler extends SynchronizedRequestHandler {
 
     }
 
+    @Override
+    protected boolean canHandleRequest(VaadinRequest request) {
+        // We do not want to handle /APP requests here, instead let it fall
+        // through and produce a 404
+        return !ServletPortletHelper.isAppRequest(request);
+    }
+
     @Override
     public boolean synchronizedHandleRequest(VaadinSession session,
             VaadinRequest request, VaadinResponse response) throws IOException {
-        if (ServletPortletHelper.isAppRequest(request)) {
-            // We do not want to handle /APP requests here, instead let it fall
-            // through and produce a 404
-            return false;
-        }
-
         try {
             // Update WebBrowser here only to make WebBrowser information
             // available in init for LegacyApplications
index ac730dcecbfe922ca76bc72e122de794bd2fe6ef..c695855d7df663b4c9ae53fa62039cf5446c82b3 100644 (file)
@@ -32,6 +32,10 @@ public abstract class SynchronizedRequestHandler implements RequestHandler {
     @Override
     public boolean handleRequest(VaadinSession session, VaadinRequest request,
             VaadinResponse response) throws IOException {
+        if (!canHandleRequest(request)) {
+            return false;
+        }
+
         session.lock();
         try {
             return synchronizedHandleRequest(session, request, response);
@@ -62,4 +66,25 @@ public abstract class SynchronizedRequestHandler implements RequestHandler {
     public abstract boolean synchronizedHandleRequest(VaadinSession session,
             VaadinRequest request, VaadinResponse response) throws IOException;
 
+    /**
+     * Check whether a request may be handled by this handler. This can be used
+     * as an optimization to avoid locking the session just to investigate some
+     * method property. The default implementation just returns
+     * <code>true</code> which means that all requests will be handled by
+     * calling
+     * {@link #synchronizedHandleRequest(VaadinSession, VaadinRequest, VaadinResponse)}
+     * with the session locked.
+     * 
+     * @since 7.2
+     * @param request
+     *            the request to handle
+     * @return <code>true</code> if the request handling should continue once
+     *         the session has been locked; <code>false</code> if there's no
+     *         need to lock the session since the request would still not be
+     *         handled.
+     */
+    protected boolean canHandleRequest(VaadinRequest request) {
+        return true;
+    }
+
 }
index 4c9585920341f0bb5bd8237e217da34113ff0146..04cb1b5a258beff175ff5ffd7b563bb0dcc3db03 100644 (file)
@@ -43,6 +43,11 @@ import com.vaadin.ui.UI;
 public class HeartbeatHandler extends SynchronizedRequestHandler implements
         SessionExpiredHandler {
 
+    @Override
+    protected boolean canHandleRequest(VaadinRequest request) {
+        return ServletPortletHelper.isHeartbeatRequest(request);
+    }
+
     /**
      * Handles a heartbeat request for the given session. Reads the GET
      * parameter named {@link UIConstants#UI_ID_PARAMETER} to identify the UI.
@@ -53,10 +58,6 @@ public class HeartbeatHandler extends SynchronizedRequestHandler implements
     @Override
     public boolean synchronizedHandleRequest(VaadinSession session,
             VaadinRequest request, VaadinResponse response) throws IOException {
-        if (!ServletPortletHelper.isHeartbeatRequest(request)) {
-            return false;
-        }
-
         UI ui = session.getService().findUI(request);
         if (ui != null) {
             ui.setLastHeartbeatTimestamp(System.currentTimeMillis());
index d4b0bc709ffd14ee3b9fa84294f8f8976c547712..e16e4f6cdd8fd3c7d73d9f593195a50accd08111 100644 (file)
@@ -55,13 +55,14 @@ public abstract class UIInitHandler extends SynchronizedRequestHandler {
 
     protected abstract boolean isInitRequest(VaadinRequest request);
 
+    @Override
+    protected boolean canHandleRequest(VaadinRequest request) {
+        return isInitRequest(request);
+    }
+
     @Override
     public boolean synchronizedHandleRequest(VaadinSession session,
             VaadinRequest request, VaadinResponse response) throws IOException {
-        if (!isInitRequest(request)) {
-            return false;
-        }
-
         StringWriter stringWriter = new StringWriter();
 
         try {
index d52c5e9fe060cbb97f9a5d375f0b41a0ebd2bb90..cf25910fa40c1828e57d1b3a4564a6ab91c72298 100644 (file)
@@ -59,12 +59,14 @@ public class UidlRequestHandler extends SynchronizedRequestHandler implements
     public UidlRequestHandler() {
     }
 
+    @Override
+    protected boolean canHandleRequest(VaadinRequest request) {
+        return ServletPortletHelper.isUIDLRequest(request);
+    }
+
     @Override
     public boolean synchronizedHandleRequest(VaadinSession session,
             VaadinRequest request, VaadinResponse response) throws IOException {
-        if (!ServletPortletHelper.isUIDLRequest(request)) {
-            return false;
-        }
         UI uI = session.getService().findUI(request);
         if (uI == null) {
             // This should not happen but it will if the UI has been closed. We