You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2008/10/20 11:27:40 UTC

svn commit: r706163 - /incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java

Author: fmeschbe
Date: Mon Oct 20 02:27:40 2008
New Revision: 706163

URL: http://svn.apache.org/viewvc?rev=706163&view=rev
Log:
SLING-705 Reset thread name while processing requests

Modified:
    incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java

Modified: incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=706163&r1=706162&r2=706163&view=diff
==============================================================================
--- incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ incubator/sling/trunk/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Mon Oct 20 02:27:40 2008
@@ -84,7 +84,7 @@
 
 /**
  * The <code>SlingMainServlet</code> TODO
- *
+ * 
  * @scr.component immediate="true" metatype="no"
  * @scr.property name="sling.root" value="/" private="true"
  * @scr.property name="service.vendor" value="The Apache Software Foundation"
@@ -92,7 +92,8 @@
  * @scr.reference name="Filter" interface="javax.servlet.Filter"
  *                cardinality="0..n" policy="dynamic"
  */
-public class SlingMainServlet extends GenericServlet implements ErrorHandler, HttpContext {
+public class SlingMainServlet extends GenericServlet implements ErrorHandler,
+        HttpContext {
 
     /** default log */
     private static final Logger log = LoggerFactory.getLogger(SlingMainServlet.class);
@@ -153,11 +154,13 @@
     private SlingAuthenticator slingAuthenticator;
 
     private static final String INCLUDE_COUNTER = "Sling.ScriptHelper.include.counter";
+
     private static final int MAX_INCLUDE_RECURSION_LEVEL = 50;
 
     public static class InfiniteIncludeLoopException extends SlingException {
         InfiniteIncludeLoopException(String path) {
-            super("Infinite include loop (> " + MAX_INCLUDE_RECURSION_LEVEL + " levels) for path '" + path + "'");
+            super("Infinite include loop (> " + MAX_INCLUDE_RECURSION_LEVEL
+                + " levels) for path '" + path + "'");
         }
     }
 
@@ -169,10 +172,15 @@
         if (req instanceof HttpServletRequest
             && res instanceof HttpServletResponse) {
 
+            HttpServletRequest request = (HttpServletRequest) req;
+
+            // set the thread name according to the request
+            String threadName = setThreadName(request);
+
             try {
 
                 // real request handling for HTTP requests
-                service((HttpServletRequest) req, (HttpServletResponse) res);
+                service(request, (HttpServletResponse) res);
 
             } catch (IOException ioe) {
 
@@ -209,6 +217,13 @@
                 // So here we just log
 
                 log.error("service: Uncaught Problem handling the request", t);
+
+            } finally {
+
+                // reset the thread name
+                if (threadName != null) {
+                    Thread.currentThread().setName(threadName);
+                }
             }
 
         } else {
@@ -259,7 +274,8 @@
             if (session == null) {
                 log.error("service: Cannot handle request: Missing JCR Session");
                 sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                    "Missing JCR Session", null, servletRequest, servletResponse);
+                    "Missing JCR Session", null, servletRequest,
+                    servletResponse);
                 return;
             }
 
@@ -273,9 +289,10 @@
             if (filters != null) {
                 FilterChain processor = new RequestSlingFilterChain(this,
                     filters);
-                
-                request.getRequestProgressTracker().log("Applying request filters");
-                
+
+                request.getRequestProgressTracker().log(
+                    "Applying request filters");
+
                 processor.doFilter(request, response);
 
             } else {
@@ -376,13 +393,15 @@
         checkRecursionLevel(request, resolvedURL.getResourcePath());
 
         try {
-            // we need a SlingHttpServletRequest/SlingHttpServletResponse tupel to continue
+            // we need a SlingHttpServletRequest/SlingHttpServletResponse tupel
+            // to continue
             SlingHttpServletRequest cRequest = RequestData.toSlingHttpServletRequest(request);
             SlingHttpServletResponse cResponse = RequestData.toSlingHttpServletResponse(response);
 
             // get the request data (and btw check the correct type)
             RequestData requestData = RequestData.getRequestData(cRequest);
-            ContentData contentData = requestData.pushContent(resource, resolvedURL);
+            ContentData contentData = requestData.pushContent(resource,
+                resolvedURL);
 
             try {
                 // resolve the servlet
@@ -399,12 +418,13 @@
     }
 
     /** Add a recursion counter to req and fail if it's too high */
-    protected void checkRecursionLevel(ServletRequest request, String info)  throws InfiniteIncludeLoopException {
+    protected void checkRecursionLevel(ServletRequest request, String info)
+            throws InfiniteIncludeLoopException {
         // Detect infinite loops
-        Integer recursionLevel = (Integer)request.getAttribute(INCLUDE_COUNTER);
-        if(recursionLevel == null) {
+        Integer recursionLevel = (Integer) request.getAttribute(INCLUDE_COUNTER);
+        if (recursionLevel == null) {
             recursionLevel = new Integer(1);
-        } else if(recursionLevel.intValue() > MAX_INCLUDE_RECURSION_LEVEL) {
+        } else if (recursionLevel.intValue() > MAX_INCLUDE_RECURSION_LEVEL) {
             throw new InfiniteIncludeLoopException(info);
         } else {
             recursionLevel = new Integer(recursionLevel.intValue() + 1);
@@ -412,15 +432,16 @@
         request.setAttribute(INCLUDE_COUNTER, recursionLevel);
     }
 
-    /** Decrease the recursion counter  */
+    /** Decrease the recursion counter */
     protected void decreaseRecursionLevel(ServletRequest request) {
         // this should never be null, but we better do a sanity check
-        final Integer recursionLevel = (Integer)request.getAttribute(INCLUDE_COUNTER);
-        if ( recursionLevel != null ) {
-            if ( recursionLevel == 1 ) {
+        final Integer recursionLevel = (Integer) request.getAttribute(INCLUDE_COUNTER);
+        if (recursionLevel != null) {
+            if (recursionLevel == 1) {
                 request.removeAttribute(INCLUDE_COUNTER);
             } else {
-                request.setAttribute(INCLUDE_COUNTER, new Integer(recursionLevel.intValue() -1));
+                request.setAttribute(INCLUDE_COUNTER, new Integer(
+                    recursionLevel.intValue() - 1));
             }
         }
     }
@@ -437,7 +458,7 @@
             FilterChain processor = new SlingComponentFilterChain(filters);
 
             request.getRequestProgressTracker().log("Applying inner filters");
-            
+
             processor.doFilter(request, response);
         } else {
             log.debug("service: No Resource level filters, calling servlet");
@@ -497,9 +518,9 @@
             pw.println("<html><head><title>");
             pw.println(message);
             pw.println("</title></head><body><h1>");
-            if(throwable != null) {
+            if (throwable != null) {
                 pw.println(throwable.toString());
-            } else if(message != null) {
+            } else if (message != null) {
                 pw.println(message);
             } else {
                 pw.println("Internal error (no Exception to report)");
@@ -516,7 +537,7 @@
                 pw.println("<pre>");
                 throwable.printStackTrace(pw);
                 pw.println("</pre>");
-                
+
                 RequestProgressTracker tracker = ((SlingHttpServletRequest) request).getRequestProgressTracker();
                 pw.println("<h3>Request Progress:</h3>");
                 pw.println("<pre>");
@@ -767,8 +788,8 @@
         }
         return stringConfig;
     }
-    
-    //---------- HttpContext interface ----------------------------------------
+
+    // ---------- HttpContext interface ----------------------------------------
 
     public String getMimeType(String name) {
         MimeTypeService mtservice = mimeTypeService;
@@ -850,4 +871,33 @@
         return false;
     }
 
+    /**
+     * Sets the name of the current thread to the IP address of the remote
+     * client with the current system time and the first request line consisting
+     * of the method, path and protocol.
+     * 
+     * @param request The request to extract the remote IP address, method,
+     *            request URL and protocol from.
+     * @return The name of the current thread before setting the new name.
+     */
+    private String setThreadName(HttpServletRequest request) {
+
+        // get the name of the current thread (to be returned)
+        Thread thread = Thread.currentThread();
+        String oldThreadName = thread.getName();
+
+        // construct and set the new thread name of the form:
+        // 127.0.0.1 [1224156108055] GET /system/console/config HTTP/1.1
+        StringBuffer buf = new StringBuffer();
+        buf.append(request.getRemoteAddr());
+        buf.append(" [").append(System.currentTimeMillis()).append("] ");
+        buf.append(request.getMethod()).append(' ');
+        buf.append(request.getRequestURI()).append(' ');
+        buf.append(request.getProtocol());
+        thread.setName(buf.toString());
+
+        // return the previous thread name
+        return oldThreadName;
+    }
+
 }