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.client;
20  
21  import java.nio.ByteBuffer;
22  import java.util.Iterator;
23  import java.util.List;
24  
25  import org.eclipse.jetty.client.api.ContentResponse;
26  import org.eclipse.jetty.client.api.Request;
27  import org.eclipse.jetty.client.api.Response;
28  import org.eclipse.jetty.client.api.Result;
29  import org.eclipse.jetty.http.HttpField;
30  import org.eclipse.jetty.util.log.Log;
31  import org.eclipse.jetty.util.log.Logger;
32  
33  public class ResponseNotifier
34  {
35      private static final Logger LOG = Log.getLogger(ResponseNotifier.class);
36      private final HttpClient client;
37  
38      public ResponseNotifier(HttpClient client)
39      {
40          this.client = client;
41      }
42  
43      public void notifyBegin(List<Response.ResponseListener> listeners, Response response)
44      {
45          // Optimized to avoid allocations of iterator instances
46          for (int i = 0; i < listeners.size(); ++i)
47          {
48              Response.ResponseListener listener = listeners.get(i);
49              if (listener instanceof Response.BeginListener)
50                  notifyBegin((Response.BeginListener)listener, response);
51          }
52      }
53  
54      private void notifyBegin(Response.BeginListener listener, Response response)
55      {
56          try
57          {
58              listener.onBegin(response);
59          }
60          catch (Exception x)
61          {
62              LOG.info("Exception while notifying listener " + listener, x);
63          }
64      }
65  
66      public boolean notifyHeader(List<Response.ResponseListener> listeners, Response response, HttpField field)
67      {
68          boolean result = true;
69          // Optimized to avoid allocations of iterator instances
70          for (int i = 0; i < listeners.size(); ++i)
71          {
72              Response.ResponseListener listener = listeners.get(i);
73              if (listener instanceof Response.HeaderListener)
74                  result &= notifyHeader((Response.HeaderListener)listener, response, field);
75          }
76          return result;
77      }
78  
79      private boolean notifyHeader(Response.HeaderListener listener, Response response, HttpField field)
80      {
81          try
82          {
83              return listener.onHeader(response, field);
84          }
85          catch (Exception x)
86          {
87              LOG.info("Exception while notifying listener " + listener, x);
88              return false;
89          }
90      }
91  
92      public void notifyHeaders(List<Response.ResponseListener> listeners, Response response)
93      {
94          // Optimized to avoid allocations of iterator instances
95          for (int i = 0; i < listeners.size(); ++i)
96          {
97              Response.ResponseListener listener = listeners.get(i);
98              if (listener instanceof Response.HeadersListener)
99                  notifyHeaders((Response.HeadersListener)listener, response);
100         }
101     }
102 
103     private void notifyHeaders(Response.HeadersListener listener, Response response)
104     {
105         try
106         {
107             listener.onHeaders(response);
108         }
109         catch (Exception x)
110         {
111             LOG.info("Exception while notifying listener " + listener, x);
112         }
113     }
114 
115     public void notifyContent(List<Response.ResponseListener> listeners, Response response, ByteBuffer buffer)
116     {
117         // Optimized to avoid allocations of iterator instances
118         for (int i = 0; i < listeners.size(); ++i)
119         {
120             Response.ResponseListener listener = listeners.get(i);
121             if (listener instanceof Response.ContentListener)
122                 notifyContent((Response.ContentListener)listener, response, buffer);
123         }
124     }
125 
126     private void notifyContent(Response.ContentListener listener, Response response, ByteBuffer buffer)
127     {
128         try
129         {
130             listener.onContent(response, buffer);
131         }
132         catch (Exception x)
133         {
134             LOG.info("Exception while notifying listener " + listener, x);
135         }
136     }
137 
138     public void notifySuccess(List<Response.ResponseListener> listeners, Response response)
139     {
140         // Optimized to avoid allocations of iterator instances
141         for (int i = 0; i < listeners.size(); ++i)
142         {
143             Response.ResponseListener listener = listeners.get(i);
144             if (listener instanceof Response.SuccessListener)
145                 notifySuccess((Response.SuccessListener)listener, response);
146         }
147     }
148 
149     private void notifySuccess(Response.SuccessListener listener, Response response)
150     {
151         try
152         {
153             listener.onSuccess(response);
154         }
155         catch (Exception x)
156         {
157             LOG.info("Exception while notifying listener " + listener, x);
158         }
159     }
160 
161     public void notifyFailure(List<Response.ResponseListener> listeners, Response response, Throwable failure)
162     {
163         // Optimized to avoid allocations of iterator instances
164         for (int i = 0; i < listeners.size(); ++i)
165         {
166             Response.ResponseListener listener = listeners.get(i);
167             if (listener instanceof Response.FailureListener)
168                 notifyFailure((Response.FailureListener)listener, response, failure);
169         }
170     }
171 
172     private void notifyFailure(Response.FailureListener listener, Response response, Throwable failure)
173     {
174         try
175         {
176             listener.onFailure(response, failure);
177         }
178         catch (Exception x)
179         {
180             LOG.info("Exception while notifying listener " + listener, x);
181         }
182     }
183 
184     public void notifyComplete(List<Response.ResponseListener> listeners, Result result)
185     {
186         // Optimized to avoid allocations of iterator instances
187         for (int i = 0; i < listeners.size(); ++i)
188         {
189             Response.ResponseListener listener = listeners.get(i);
190             if (listener instanceof Response.CompleteListener)
191                 notifyComplete((Response.CompleteListener)listener, result);
192         }
193     }
194 
195     private void notifyComplete(Response.CompleteListener listener, Result result)
196     {
197         try
198         {
199             listener.onComplete(result);
200         }
201         catch (Exception x)
202         {
203             LOG.info("Exception while notifying listener " + listener, x);
204         }
205     }
206 
207     public void forwardSuccess(List<Response.ResponseListener> listeners, Response response)
208     {
209         notifyBegin(listeners, response);
210         for (Iterator<HttpField> iterator = response.getHeaders().iterator(); iterator.hasNext();)
211         {
212             HttpField field = iterator.next();
213             if (!notifyHeader(listeners, response, field))
214                 iterator.remove();
215         }
216         notifyHeaders(listeners, response);
217         if (response instanceof ContentResponse)
218             notifyContent(listeners, response, ByteBuffer.wrap(((ContentResponse)response).getContent()));
219         notifySuccess(listeners, response);
220     }
221 
222     public void forwardSuccessComplete(List<Response.ResponseListener> listeners, Request request, Response response)
223     {
224         HttpConversation conversation = client.getConversation(request.getConversationID(), false);
225         forwardSuccess(listeners, response);
226         conversation.complete();
227         notifyComplete(listeners, new Result(request, response));
228     }
229 
230     public void forwardFailure(List<Response.ResponseListener> listeners, Response response, Throwable failure)
231     {
232         notifyBegin(listeners, response);
233         for (Iterator<HttpField> iterator = response.getHeaders().iterator(); iterator.hasNext();)
234         {
235             HttpField field = iterator.next();
236             if (!notifyHeader(listeners, response, field))
237                 iterator.remove();
238         }
239         notifyHeaders(listeners, response);
240         if (response instanceof ContentResponse)
241             notifyContent(listeners, response, ByteBuffer.wrap(((ContentResponse)response).getContent()));
242         notifyFailure(listeners, response, failure);
243     }
244 
245     public void forwardFailureComplete(List<Response.ResponseListener> listeners, Request request, Throwable requestFailure, Response response, Throwable responseFailure)
246     {
247         HttpConversation conversation = client.getConversation(request.getConversationID(), false);
248         forwardFailure(listeners, response, responseFailure);
249         conversation.complete();
250         notifyComplete(listeners, new Result(request, requestFailure, response, responseFailure));
251     }
252 }