blob: e80c5f3adecd8ac89448662a57a83dd77cb288dd [file] [log] [blame]
Jake Slack03928ae2014-05-13 18:41:56 -07001//
2// ========================================================================
3// Copyright (c) 1995-2014 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
19package org.eclipse.jetty.server.handler;
20
21import java.io.IOException;
22
23import javax.servlet.DispatcherType;
24import javax.servlet.ServletException;
25import javax.servlet.http.HttpServletRequest;
26import javax.servlet.http.HttpServletResponse;
27
28import org.eclipse.jetty.continuation.Continuation;
29import org.eclipse.jetty.continuation.ContinuationListener;
30import org.eclipse.jetty.server.AsyncContinuation;
31import org.eclipse.jetty.server.Request;
32import org.eclipse.jetty.server.RequestLog;
33import org.eclipse.jetty.server.Response;
34import org.eclipse.jetty.server.Server;
35import org.eclipse.jetty.util.component.AbstractLifeCycle;
36import org.eclipse.jetty.util.log.Log;
37import 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 */
46public 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 (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
73 {
74 if (continuation.isAsync())
75 {
76 if (continuation.isInitial())
77 continuation.addContinuationListener(new ContinuationListener()
78 {
79
80 public void onTimeout(Continuation continuation)
81 {
82
83 }
84
85 public void onComplete(Continuation continuation)
86 {
87 _requestLog.log(baseRequest, (Response)response);
88 }
89 });
90 }
91 else
92 _requestLog.log(baseRequest, (Response)response);
93 }
94 }
95 }
96
97 /* ------------------------------------------------------------ */
98 public void setRequestLog(RequestLog requestLog)
99 {
100 //are we changing the request log impl?
101 try
102 {
103 if (_requestLog != null)
104 _requestLog.stop();
105 }
106 catch (Exception e)
107 {
108 LOG.warn (e);
109 }
110
111 if (getServer()!=null)
112 getServer().getContainer().update(this, _requestLog, requestLog, "logimpl",true);
113
114 _requestLog = requestLog;
115
116 //if we're already started, then start our request log
117 try
118 {
119 if (isStarted() && (_requestLog != null))
120 _requestLog.start();
121 }
122 catch (Exception e)
123 {
124 throw new RuntimeException (e);
125 }
126 }
127
128 /* ------------------------------------------------------------ */
129 /*
130 * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#setServer(org.eclipse.jetty.server.server.Server)
131 */
132 @Override
133 public void setServer(Server server)
134 {
135 if (_requestLog!=null)
136 {
137 if (getServer()!=null && getServer()!=server)
138 getServer().getContainer().update(this, _requestLog, null, "logimpl",true);
139 super.setServer(server);
140 if (server!=null && server!=getServer())
141 server.getContainer().update(this, null,_requestLog, "logimpl",true);
142 }
143 else
144 super.setServer(server);
145 }
146
147 /* ------------------------------------------------------------ */
148 public RequestLog getRequestLog()
149 {
150 return _requestLog;
151 }
152
153 /* ------------------------------------------------------------ */
154 /*
155 * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#doStart()
156 */
157 @Override
158 protected void doStart() throws Exception
159 {
160 if (_requestLog==null)
161 {
162 LOG.warn("!RequestLog");
163 _requestLog=new NullRequestLog();
164 }
165 super.doStart();
166 _requestLog.start();
167 }
168
169 /* ------------------------------------------------------------ */
170 /*
171 * @see org.eclipse.jetty.server.server.handler.HandlerWrapper#doStop()
172 */
173 @Override
174 protected void doStop() throws Exception
175 {
176 super.doStop();
177 _requestLog.stop();
178 if (_requestLog instanceof NullRequestLog)
179 _requestLog=null;
180 }
181
182 /* ------------------------------------------------------------ */
183 /* ------------------------------------------------------------ */
184 /* ------------------------------------------------------------ */
185 private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
186 {
187 public void log(Request request, Response response)
188 {
189 }
190 }
191
192}