View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2015 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.List;
23  
24  import org.eclipse.jetty.client.api.Request;
25  import org.eclipse.jetty.util.log.Log;
26  import org.eclipse.jetty.util.log.Logger;
27  
28  public class RequestNotifier
29  {
30      private static final Logger LOG = Log.getLogger(ResponseNotifier.class);
31  
32      private final HttpClient client;
33  
34      public RequestNotifier(HttpClient client)
35      {
36          this.client = client;
37      }
38  
39      public void notifyQueued(Request request)
40      {
41          // Optimized to avoid allocations of iterator instances
42          List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
43          for (int i = 0; i < requestListeners.size(); ++i)
44          {
45              Request.RequestListener listener = requestListeners.get(i);
46              if (listener instanceof Request.QueuedListener)
47                  notifyQueued((Request.QueuedListener)listener, request);
48          }
49          List<Request.Listener> listeners = client.getRequestListeners();
50          for (int i = 0; i < listeners.size(); ++i)
51          {
52              Request.Listener listener = listeners.get(i);
53              notifyQueued(listener, request);
54          }
55      }
56  
57      private void notifyQueued(Request.QueuedListener listener, Request request)
58      {
59          try
60          {
61              listener.onQueued(request);
62          }
63          catch (Throwable x)
64          {
65              LOG.info("Exception while notifying listener " + listener, x);
66          }
67      }
68  
69      public void notifyBegin(Request request)
70      {
71          // Optimized to avoid allocations of iterator instances
72          List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
73          for (int i = 0; i < requestListeners.size(); ++i)
74          {
75              Request.RequestListener listener = requestListeners.get(i);
76              if (listener instanceof Request.BeginListener)
77                  notifyBegin((Request.BeginListener)listener, request);
78          }
79          List<Request.Listener> listeners = client.getRequestListeners();
80          for (int i = 0; i < listeners.size(); ++i)
81          {
82              Request.Listener listener = listeners.get(i);
83              notifyBegin(listener, request);
84          }
85      }
86  
87      private void notifyBegin(Request.BeginListener listener, Request request)
88      {
89          try
90          {
91              listener.onBegin(request);
92          }
93          catch (Throwable x)
94          {
95              LOG.info("Exception while notifying listener " + listener, x);
96          }
97      }
98  
99      public void notifyHeaders(Request request)
100     {
101         // Optimized to avoid allocations of iterator instances
102         List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
103         for (int i = 0; i < requestListeners.size(); ++i)
104         {
105             Request.RequestListener listener = requestListeners.get(i);
106             if (listener instanceof Request.HeadersListener)
107                 notifyHeaders((Request.HeadersListener)listener, request);
108         }
109         List<Request.Listener> listeners = client.getRequestListeners();
110         for (int i = 0; i < listeners.size(); ++i)
111         {
112             Request.Listener listener = listeners.get(i);
113             notifyHeaders(listener, request);
114         }
115     }
116 
117     private void notifyHeaders(Request.HeadersListener listener, Request request)
118     {
119         try
120         {
121             listener.onHeaders(request);
122         }
123         catch (Throwable x)
124         {
125             LOG.info("Exception while notifying listener " + listener, x);
126         }
127     }
128 
129     public void notifyCommit(Request request)
130     {
131         // Optimized to avoid allocations of iterator instances
132         List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
133         for (int i = 0; i < requestListeners.size(); ++i)
134         {
135             Request.RequestListener listener = requestListeners.get(i);
136             if (listener instanceof Request.CommitListener)
137                 notifyCommit((Request.CommitListener)listener, request);
138         }
139         List<Request.Listener> listeners = client.getRequestListeners();
140         for (int i = 0; i < listeners.size(); ++i)
141         {
142             Request.Listener listener = listeners.get(i);
143             notifyCommit(listener, request);
144         }
145     }
146 
147     private void notifyCommit(Request.CommitListener listener, Request request)
148     {
149         try
150         {
151             listener.onCommit(request);
152         }
153         catch (Throwable x)
154         {
155             LOG.info("Exception while notifying listener " + listener, x);
156         }
157     }
158 
159     public void notifyContent(Request request, ByteBuffer content)
160     {
161         // Slice the buffer to avoid that listeners peek into data they should not look at.
162         content = content.slice();
163         if (!content.hasRemaining())
164             return;
165         // Optimized to avoid allocations of iterator instances.
166         List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
167         for (int i = 0; i < requestListeners.size(); ++i)
168         {
169             Request.RequestListener listener = requestListeners.get(i);
170             if (listener instanceof Request.ContentListener)
171             {
172                 // The buffer was sliced, so we always clear it (position=0, limit=capacity)
173                 // before passing it to the listener that may consume it.
174                 content.clear();
175                 notifyContent((Request.ContentListener)listener, request, content);
176             }
177         }
178         List<Request.Listener> listeners = client.getRequestListeners();
179         for (int i = 0; i < listeners.size(); ++i)
180         {
181             Request.Listener listener = listeners.get(i);
182             // The buffer was sliced, so we always clear it (position=0, limit=capacity)
183             // before passing it to the listener that may consume it.
184             content.clear();
185             notifyContent(listener, request, content);
186         }
187     }
188 
189     private void notifyContent(Request.ContentListener listener, Request request, ByteBuffer content)
190     {
191         try
192         {
193             listener.onContent(request, content);
194         }
195         catch (Throwable x)
196         {
197             LOG.info("Exception while notifying listener " + listener, x);
198         }
199     }
200 
201     public void notifySuccess(Request request)
202     {
203         // Optimized to avoid allocations of iterator instances
204         List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
205         for (int i = 0; i < requestListeners.size(); ++i)
206         {
207             Request.RequestListener listener = requestListeners.get(i);
208             if (listener instanceof Request.SuccessListener)
209                 notifySuccess((Request.SuccessListener)listener, request);
210         }
211         List<Request.Listener> listeners = client.getRequestListeners();
212         for (int i = 0; i < listeners.size(); ++i)
213         {
214             Request.Listener listener = listeners.get(i);
215             notifySuccess(listener, request);
216         }
217     }
218 
219     private void notifySuccess(Request.SuccessListener listener, Request request)
220     {
221         try
222         {
223             listener.onSuccess(request);
224         }
225         catch (Throwable x)
226         {
227             LOG.info("Exception while notifying listener " + listener, x);
228         }
229     }
230 
231     public void notifyFailure(Request request, Throwable failure)
232     {
233         // Optimized to avoid allocations of iterator instances
234         List<Request.RequestListener> requestListeners = request.getRequestListeners(null);
235         for (int i = 0; i < requestListeners.size(); ++i)
236         {
237             Request.RequestListener listener = requestListeners.get(i);
238             if (listener instanceof Request.FailureListener)
239                 notifyFailure((Request.FailureListener)listener, request, failure);
240         }
241         List<Request.Listener> listeners = client.getRequestListeners();
242         for (int i = 0; i < listeners.size(); ++i)
243         {
244             Request.Listener listener = listeners.get(i);
245             notifyFailure(listener, request, failure);
246         }
247     }
248 
249     private void notifyFailure(Request.FailureListener listener, Request request, Throwable failure)
250     {
251         try
252         {
253             listener.onFailure(request, failure);
254         }
255         catch (Throwable x)
256         {
257             LOG.info("Exception while notifying listener " + listener, x);
258         }
259     }
260 }