]> source.dussan.org Git - vaadin-framework.git/commitdiff
Simplified fix for #8694
authorJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 27 Apr 2012 07:19:56 +0000 (07:19 +0000)
committerJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 27 Apr 2012 07:19:56 +0000 (07:19 +0000)
svn changeset:23647/svn branch:6.8

src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java
src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java
src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java
src/com/vaadin/terminal/gwt/server/RequestTimer.java

index a5923cb47f429b2a51135467d6a3e38ccfa40425..a9364c3cf7e9219d0e12ef5e21ee1d33cc8245c1 100644 (file)
@@ -326,10 +326,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
 
     protected void handleRequest(PortletRequest request,
             PortletResponse response) throws PortletException, IOException {
-        RequestTimer.RequestWrapper wrappedRequest = new RequestTimer.RequestWrapper(
-                request);
-        RequestTimer requestTimer = RequestTimer.get(wrappedRequest);
-        requestTimer.start(wrappedRequest);
+        RequestTimer requestTimer = new RequestTimer();
+        requestTimer.start();
 
         RequestType requestType = getRequestType(request);
 
@@ -496,8 +494,9 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
 
                     }
 
-                    requestTimer.stop();
-                    RequestTimer.set(wrappedRequest, requestTimer);
+                    requestTimer
+                            .stop((AbstractWebApplicationContext) application
+                                    .getContext());
                 }
             }
         }
index 04ea423004783f4ad4a3565db91c05e3ab877a1d..b177cc5629670582c326d391a4bf0cdfc146825e 100644 (file)
@@ -401,10 +401,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
     @Override
     protected void service(HttpServletRequest request,
             HttpServletResponse response) throws ServletException, IOException {
-        RequestTimer.RequestWrapper wrappedRequest = new RequestTimer.RequestWrapper(
-                request);
-        RequestTimer requestTimer = RequestTimer.get(wrappedRequest);
-        requestTimer.start(wrappedRequest);
+        RequestTimer requestTimer = new RequestTimer();
+        requestTimer.start();
 
         RequestType requestType = getRequestType(request);
         if (!ensureCookiesEnabled(requestType, request, response)) {
@@ -553,8 +551,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
                             request, response);
                 }
 
-                requestTimer.stop();
-                RequestTimer.set(wrappedRequest, requestTimer);
+                requestTimer.stop((AbstractWebApplicationContext) application
+                        .getContext());
             }
 
         }
index 9a6bccebb81f14353b1ebad1f692d0a6b8787310..be1b829eb4b75a6a017b95dd972fe601315f132c 100644 (file)
@@ -912,7 +912,7 @@ public abstract class AbstractCommunicationManager implements
                 repaintAll = true;
             }
 
-            writeUidlResponse(request, callback, repaintAll, outWriter, window,
+            writeUidlResponce(callback, repaintAll, outWriter, window,
                     analyzeLayouts);
 
         }
@@ -922,9 +922,9 @@ public abstract class AbstractCommunicationManager implements
 
     }
 
-    public void writeUidlResponse(Request request, Callback callback,
-            boolean repaintAll, final PrintWriter outWriter, Window window,
-            boolean analyzeLayouts) throws PaintException {
+    public void writeUidlResponce(Callback callback, boolean repaintAll,
+            final PrintWriter outWriter, Window window, boolean analyzeLayouts)
+            throws PaintException {
         outWriter.print("\"changes\":[");
 
         ArrayList<Paintable> paintables = null;
@@ -1206,19 +1206,18 @@ public abstract class AbstractCommunicationManager implements
             dragAndDropService.printJSONResponse(outWriter);
         }
 
-        writePerformanceDataForTestBench(request, outWriter);
+        writePerformanceDataForTestBench(outWriter);
     }
 
     /**
      * Adds the performance timing data used by TestBench 3 to the UIDL
      * response.
      */
-    private void writePerformanceDataForTestBench(final Request request,
-            final PrintWriter outWriter) {
-        Long totalTime = (Long) request.getAttribute("TOTAL");
-        Long lastRequestTime = (Long) request.getAttribute("LASTREQUEST");
-        outWriter.write(String.format(", \"tbss\":[%d, %d]", totalTime,
-                lastRequestTime));
+    private void writePerformanceDataForTestBench(final PrintWriter outWriter) {
+        AbstractWebApplicationContext ctx = (AbstractWebApplicationContext) application
+                .getContext();
+        outWriter.write(String.format(", \"tbss\":[%d, %d]",
+                ctx.getTotalSessionTime(), ctx.getLastRequestTime()));
     }
 
     private int getTimeoutInterval() {
index c8335a86070f2f4f1bcdaaf846b067e188ef21a4..c0ae0afc26bdeefe21f94a1f7f6eecb93ba33b49 100644 (file)
@@ -44,6 +44,10 @@ public abstract class AbstractWebApplicationContext implements
 
     protected HashMap<Application, AbstractCommunicationManager> applicationToAjaxAppMgrMap = new HashMap<Application, AbstractCommunicationManager>();
 
+    private long totalSessionTime = 0;
+
+    private long lastRequestTime = -1;
+
     public void addTransactionListener(TransactionListener listener) {
         if (listener != null) {
             listeners.add(listener);
@@ -222,4 +226,30 @@ public abstract class AbstractWebApplicationContext implements
         return relativeUri.substring(index + 1, next);
     }
 
+    /**
+     * @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;
+    }
+
 }
\ No newline at end of file
index 1df65d6c58de99f4bbaab5bef1f01fbeae3a5838..1fec2d280bdfdd63bd7d6f268cb61f688579c74b 100644 (file)
@@ -6,11 +6,6 @@ package com.vaadin.terminal.gwt.server;
 
 import java.io.Serializable;
 
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletSession;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
 /**
  * Times the handling of requests and stores the information as an attribute in
  * the request. The timing info is later passed on to the client in the UIDL and
@@ -20,125 +15,28 @@ import javax.servlet.http.HttpSession;
  * @author Jonatan Kronqvist / Vaadin Ltd
  */
 public class RequestTimer implements Serializable {
-    public static final String SESSION_ATTR_ID = "REQUESTTIMER";
-
     private long requestStartTime = 0;
-    private long totalSessionTime = 0;
-    private long lastRequestTime = -1;
-
-    /**
-     * This class acts as a proxy for setting and getting session and request
-     * attributes on HttpServletRequests and PortletRequests. Using this class
-     * we don't need to duplicate code everywhere.
-     */
-    static class RequestWrapper implements Serializable {
-        private final HttpServletRequest servletRequest;
-        private final PortletRequest portletRequest;
-
-        public RequestWrapper(HttpServletRequest servletRequest) {
-            this.servletRequest = servletRequest;
-            portletRequest = null;
-        }
-
-        public RequestWrapper(PortletRequest portletRequest) {
-            this.portletRequest = portletRequest;
-            servletRequest = null;
-        }
-
-        public void setAttribute(String name, Object value) {
-            if (servletRequest != null) {
-                servletRequest.setAttribute(name, value);
-            } else {
-                portletRequest.setAttribute(name, value);
-            }
-        }
-
-        public void setSessionAttribute(String name, Object value) {
-            if (servletRequest != null) {
-                HttpSession session = servletRequest.getSession();
-                if (session != null) {
-                    session.setAttribute(name, value);
-                }
-            } else {
-                PortletSession portletSession = portletRequest
-                        .getPortletSession();
-                if (portletSession != null) {
-                    portletSession.setAttribute(name, value);
-                }
-            }
-        }
-
-        public Object getSessionAttribute(String name) {
-            if (servletRequest != null) {
-                HttpSession session = servletRequest.getSession();
-                if (session != null) {
-                    return session.getAttribute(name);
-                }
-            } else {
-                PortletSession portletSession = portletRequest
-                        .getPortletSession();
-                if (portletSession != null) {
-                    return portletSession.getAttribute(name);
-                }
-            }
-            return null;
-        }
-    }
 
     /**
      * Starts the timing of a request. This should be called before any
      * processing of the request.
-     * 
-     * @param request
-     *            the request.
      */
-    public void start(RequestWrapper request) {
+    public void start() {
         requestStartTime = System.nanoTime();
-        request.setAttribute("TOTAL", totalSessionTime);
-        request.setAttribute("LASTREQUEST", lastRequestTime);
     }
 
     /**
      * Stops the timing of a request. This should be called when all processing
      * of a request has finished.
+     * 
+     * @param context
      */
-    public void stop() {
+    public void stop(AbstractWebApplicationContext context) {
         // Measure and store the total handling time. This data can be
         // used in TestBench 3 tests.
         long time = (System.nanoTime() - requestStartTime) / 1000000;
-        lastRequestTime = time;
-        totalSessionTime += time;
-    }
-
-    /**
-     * Returns a valid request timer for the specified request. Timers are
-     * session bound.
-     * 
-     * @param request
-     *            the request for which to get a valid timer.
-     * @return a valid timer.
-     */
-    public static RequestTimer get(RequestWrapper request) {
-        RequestTimer timer = (RequestTimer) request
-                .getSessionAttribute(SESSION_ATTR_ID);
-        if (timer == null) {
-            timer = new RequestTimer();
-        }
-        return timer;
-    }
-
-    /**
-     * Associates the specified request timer with the specified request. Since
-     * {@link #get(RequestWrapper)} will, at one point or another, return a new
-     * instance, this method should be called to keep the request <-> timer
-     * association updated.
-     * 
-     * @param request
-     *            the request for which to set the timer.
-     * @param requestTimer
-     *            the timer.
-     */
-    public static void set(RequestWrapper request, RequestTimer requestTimer) {
-        request.setSessionAttribute(RequestTimer.SESSION_ATTR_ID, requestTimer);
+        // The timings must be stored in the context, since a new
+        // RequestTimer is created for every request.
+        context.setLastRequestTime(time);
     }
 }