1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  package ch.qos.logback.access.jetty;
11  
12  import java.io.IOException;
13  import java.io.OutputStream;
14  
15  import javax.servlet.ServletException;
16  import javax.servlet.http.HttpServletRequest;
17  import javax.servlet.http.HttpServletResponse;
18  
19  import org.mortbay.jetty.Handler;
20  import org.mortbay.jetty.HttpConnection;
21  import org.mortbay.jetty.Request;
22  import org.mortbay.jetty.handler.AbstractHandler;
23  import org.mortbay.util.ByteArrayISO8859Writer;
24  
25  import ch.qos.logback.access.PatternLayout;
26  import ch.qos.logback.access.spi.AccessEvent;
27  import ch.qos.logback.access.testUtil.NotifyingListAppender;
28  import ch.qos.logback.core.ConsoleAppender;
29  
30  public class JettyFixture extends JettyFixtureBase {
31    
32    Handler handler = new BasicHandler();
33    
34    public JettyFixture(RequestLogImpl impl, int port) {
35      super(impl, port);
36      url = "http://localhost:" + port + "/";
37    }
38  
39    public void start() throws Exception {
40      super.start();
41      Thread.yield();
42    }
43  
44    public void stop() throws Exception {
45      super.stop();
46      Thread.sleep(500);
47    }
48  
49    protected void buildContext() {
50      NotifyingListAppender appender = new NotifyingListAppender();
51      appender.setContext(requestLogImpl);
52      appender.setName("list");
53      appender.start();
54  
55      ConsoleAppender<AccessEvent> console = new ConsoleAppender<AccessEvent>();
56      console.setContext(requestLogImpl);
57      console.setName("console");
58      PatternLayout layout = new PatternLayout();
59      layout.setContext(requestLogImpl);
60      layout.setPattern("%date %server %clientHost");
61      console.setLayout(layout);
62      layout.start();
63      console.start();
64  
65      requestLogImpl.addAppender(appender);
66      requestLogImpl.addAppender(console);
67    }
68  
69    @Override
70    protected Handler getHandler() {
71      return handler;
72    }
73  
74  }
75  
76  class BasicHandler extends AbstractHandler {
77    public void handle(String target, HttpServletRequest request,
78        HttpServletResponse response, int dispatch) throws IOException,
79        ServletException {
80  
81      // String requestContent = Util.readToString(request.getInputStream());
82      // System.out.println("request content: " + requestContent);
83  
84      OutputStream out = response.getOutputStream();
85      ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer();
86      writer.write("hello world");
87      writer.flush();
88      response.setContentLength(writer.size());
89      writer.writeTo(out);
90      out.flush();
91  
92      Request base_request = (request instanceof Request) ? (Request) request
93          : HttpConnection.getCurrentConnection().getRequest();
94      base_request.setHandled(true);
95  
96    }
97  }