View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.server.handler; 
20  
21  import java.io.IOException;
22  
23  import javax.servlet.ServletException;
24  import javax.servlet.http.HttpServletRequest;
25  import javax.servlet.http.HttpServletResponse;
26  
27  import org.eclipse.jetty.continuation.Continuation;
28  import org.eclipse.jetty.continuation.ContinuationListener;
29  import org.eclipse.jetty.server.AsyncContinuation;
30  import org.eclipse.jetty.server.DispatcherType;
31  import org.eclipse.jetty.server.Request;
32  import org.eclipse.jetty.server.RequestLog;
33  import org.eclipse.jetty.server.Response;
34  import org.eclipse.jetty.server.Server;
35  import org.eclipse.jetty.util.component.AbstractLifeCycle;
36  import org.eclipse.jetty.util.log.Log;
37  import org.eclipse.jetty.util.log.Logger;
38  
39  
40  /** 
41   * RequestLogHandler.
42   * This handler can be used to wrap an individual context for context logging.
43   * 
44   * @org.apache.xbean.XBean
45   */
46  public class RequestLogHandler extends HandlerWrapper
47  {
48      private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
49  
50      private RequestLog _requestLog;
51      
52      /* ------------------------------------------------------------ */
53      /* 
54       * @see org.eclipse.jetty.server.server.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
55       */
56      @Override
57      public void handle(String target, final Request baseRequest, HttpServletRequest request, final HttpServletResponse response)
58              throws IOException, ServletException
59      {
60          AsyncContinuation continuation = baseRequest.getAsyncContinuation();
61          if (!continuation.isInitial())
62          {
63              baseRequest.setDispatchTime(System.currentTimeMillis());
64          }
65          
66          try
67          {
68              super.handle(target, baseRequest, request, response);
69          }
70          finally
71          {
72              if (continuation.isAsync())
73              {
74                  if (continuation.isInitial())
75                      continuation.addContinuationListener(new ContinuationListener()
76                      {
77                          
78                          public void onTimeout(Continuation continuation)
79                          {
80                              
81                          }
82                          
83                          public void onComplete(Continuation continuation)
84                          {
85                              _requestLog.log(baseRequest, (Response)response);
86                          }
87                      });
88              }
89              else
90                  _requestLog.log(baseRequest, (Response)response);
91          }
92      }
93  
94      /* ------------------------------------------------------------ */
95      public void setRequestLog(RequestLog requestLog)
96      {
97          //are we changing the request log impl?
98          try
99          {
100             if (_requestLog != null)
101                 _requestLog.stop();
102         }
103         catch (Exception e)
104         {
105             LOG.warn (e);
106         }
107         
108         if (getServer()!=null)
109             getServer().getContainer().update(this, _requestLog, requestLog, "logimpl",true);
110         
111         _requestLog = requestLog;
112         
113         //if we're already started, then start our request log
114         try
115         {
116             if (isStarted() && (_requestLog != null))
117                 _requestLog.start();
118         }
119         catch (Exception e)
120         {
121             throw new RuntimeException (e);
122         }
123     }
124 
125     /* ------------------------------------------------------------ */
126     /* 
127      * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#setServer(org.eclipse.jetty.server.server.Server)
128      */
129     @Override
130     public void setServer(Server server)
131     {
132         if (_requestLog!=null)
133         {
134             if (getServer()!=null && getServer()!=server)
135                 getServer().getContainer().update(this, _requestLog, null, "logimpl",true);
136             super.setServer(server);
137             if (server!=null && server!=getServer())
138                 server.getContainer().update(this, null,_requestLog, "logimpl",true);
139         }
140         else
141             super.setServer(server);
142     }
143 
144     /* ------------------------------------------------------------ */
145     public RequestLog getRequestLog() 
146     {
147         return _requestLog;
148     }
149 
150     /* ------------------------------------------------------------ */
151     /* 
152      * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#doStart()
153      */
154     @Override
155     protected void doStart() throws Exception
156     {
157         if (_requestLog==null)
158         {
159             LOG.warn("!RequestLog");
160             _requestLog=new NullRequestLog();
161         }
162         super.doStart();
163         _requestLog.start();
164     }
165 
166     /* ------------------------------------------------------------ */
167     /* 
168      * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#doStop()
169      */
170     @Override
171     protected void doStop() throws Exception
172     {
173         super.doStop();
174         _requestLog.stop();
175         if (_requestLog instanceof NullRequestLog)
176             _requestLog=null;
177     }
178 
179     /* ------------------------------------------------------------ */
180     /* ------------------------------------------------------------ */
181     /* ------------------------------------------------------------ */
182     private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
183     {
184         public void log(Request request, Response response)
185         {            
186         }
187     }
188     
189 }