View Javadoc

1   // ========================================================================
2   // Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses.
12  // ========================================================================
13  
14  package org.eclipse.jetty.server;
15  
16  import java.io.IOException;
17  import java.util.concurrent.BlockingQueue;
18  import java.util.concurrent.CountDownLatch;
19  import java.util.concurrent.LinkedBlockingQueue;
20  
21  import org.eclipse.jetty.io.ByteArrayBuffer;
22  import org.eclipse.jetty.io.ByteArrayEndPoint;
23  import org.eclipse.jetty.util.StringUtil;
24  
25  public class LocalConnector extends AbstractConnector
26  {
27      private final BlockingQueue<Request> requests = new LinkedBlockingQueue<Request>();
28  
29      public Object getConnection()
30      {
31          return this;
32      }
33  
34      /**
35       * @deprecated Not needed anymore, as there is no need to reopen the connector to reset its state
36       */
37      @Deprecated
38      public void reopen()
39      {
40      }
41  
42      public String getResponses(String requests) throws Exception
43      {
44          return getResponses(requests, false);
45      }
46  
47      public String getResponses(String requests, boolean keepOpen) throws Exception
48      {
49          ByteArrayBuffer result = getResponses(new ByteArrayBuffer(requests, StringUtil.__ISO_8859_1), keepOpen);
50          return result.toString(StringUtil.__ISO_8859_1);
51      }
52  
53      public ByteArrayBuffer getResponses(ByteArrayBuffer requestsBuffer, boolean keepOpen) throws Exception
54      {
55          CountDownLatch latch = new CountDownLatch(1);
56          Request request = new Request(requestsBuffer, keepOpen, latch);
57          requests.add(request);
58          latch.await();
59          return request.getResponsesBuffer();
60      }
61  
62      protected void accept(int acceptorID) throws IOException, InterruptedException
63      {
64          Request request = requests.take();
65          getThreadPool().dispatch(request);
66      }
67  
68      public void open() throws IOException
69      {
70      }
71  
72      public void close() throws IOException
73      {
74      }
75  
76      public int getLocalPort()
77      {
78          return -1;
79      }
80  
81      public void executeRequest(String rawRequest) throws IOException
82      {
83          Request request = new Request(new ByteArrayBuffer(rawRequest, "UTF-8"), true, null);
84          requests.add(request);
85      }
86  
87      private class Request implements Runnable
88      {
89          private final ByteArrayBuffer requestsBuffer;
90          private final boolean keepOpen;
91          private final CountDownLatch latch;
92          private volatile ByteArrayBuffer responsesBuffer;
93  
94          private Request(ByteArrayBuffer requestsBuffer, boolean keepOpen, CountDownLatch latch)
95          {
96              this.requestsBuffer = requestsBuffer;
97              this.keepOpen = keepOpen;
98              this.latch = latch;
99          }
100 
101         public void run()
102         {
103             ByteArrayEndPoint endPoint = new ByteArrayEndPoint(requestsBuffer.asArray(), 1024);
104             endPoint.setGrowOutput(true);
105 
106             HttpConnection connection = new HttpConnection(LocalConnector.this, endPoint, getServer());
107             connectionOpened(connection);
108 
109             boolean leaveOpen = keepOpen;
110             try
111             {
112                 while (endPoint.getIn().length() > 0)
113                     connection.handle();
114             }
115             catch (Exception x)
116             {
117                 leaveOpen = false;
118             }
119             finally
120             {
121                 if (!leaveOpen)
122                     connectionClosed(connection);
123                 responsesBuffer = endPoint.getOut();
124                 if (latch != null)
125                     latch.countDown();
126             }
127         }
128 
129         public ByteArrayBuffer getResponsesBuffer()
130         {
131             return responsesBuffer;
132         }
133     }
134 }