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.AsyncEvent;
24  import javax.servlet.AsyncListener;
25  import javax.servlet.DispatcherType;
26  import javax.servlet.ServletException;
27  import javax.servlet.http.HttpServletRequest;
28  import javax.servlet.http.HttpServletResponse;
29  
30  import org.eclipse.jetty.server.AsyncContextState;
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.util.component.AbstractLifeCycle;
35  import org.eclipse.jetty.util.log.Log;
36  import org.eclipse.jetty.util.log.Logger;
37  
38  
39  
40  /**
41   * RequestLogHandler.
42   * This handler can be used to wrap an individual context for context logging.
43   *
44   *
45   * @org.apache.xbean.XBean
46   */
47  public class RequestLogHandler extends HandlerWrapper
48  {
49      private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
50      private RequestLog _requestLog;
51      private final AsyncListener _listener = new AsyncListener()
52      {
53          
54          @Override
55          public void onTimeout(AsyncEvent event) throws IOException
56          {
57              
58          }
59          
60          @Override
61          public void onStartAsync(AsyncEvent event) throws IOException
62          {
63              event.getAsyncContext().addListener(this);
64          }
65          
66          @Override
67          public void onError(AsyncEvent event) throws IOException
68          {
69              
70          }
71          
72          @Override
73          public void onComplete(AsyncEvent event) throws IOException
74          {
75              AsyncContextState context = (AsyncContextState)event.getAsyncContext();
76              Request request=context.getHttpChannelState().getBaseRequest();
77              Response response=request.getResponse();
78              _requestLog.log(request,response);
79          }
80      };
81  
82      /* ------------------------------------------------------------ */
83      /*
84       * @see org.eclipse.jetty.server.server.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
85       */
86      @Override
87      public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
88              throws IOException, ServletException
89      {
90          try
91          {
92              super.handle(target, baseRequest, request, response);
93          }
94          finally
95          {
96              if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
97              {
98                  if (baseRequest.getHttpChannelState().isAsync())
99                  {
100                     if (baseRequest.getHttpChannelState().isInitial())
101                         baseRequest.getAsyncContext().addListener(_listener);
102                 }
103                 else
104                     _requestLog.log(baseRequest, (Response)response);
105             }
106         }
107     }
108 
109     /* ------------------------------------------------------------ */
110     public void setRequestLog(RequestLog requestLog)
111     {
112         updateBean(_requestLog,requestLog);
113         _requestLog=requestLog;
114     }
115 
116     /* ------------------------------------------------------------ */
117     public RequestLog getRequestLog()
118     {
119         return _requestLog;
120     }
121     
122     /* ------------------------------------------------------------ */
123     @Override
124     protected void doStart() throws Exception
125     {
126         if (_requestLog==null)
127         {
128             LOG.warn("!RequestLog");
129             _requestLog=new NullRequestLog();
130         }
131         super.doStart();
132     }
133     
134     /* ------------------------------------------------------------ */
135     @Override
136     protected void doStop() throws Exception
137     {
138         super.doStop();
139         if (_requestLog instanceof NullRequestLog)
140             _requestLog=null;
141     }
142 
143     /* ------------------------------------------------------------ */
144     /* ------------------------------------------------------------ */
145     /* ------------------------------------------------------------ */
146     private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
147     {
148         @Override
149         public void log(Request request, Response response)
150         {            
151         }
152     }
153 }