View Javadoc
1   package org.eclipse.aether.util.listener;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   * 
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   * 
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.Arrays;
23  import java.util.Collection;
24  import java.util.List;
25  import java.util.concurrent.CopyOnWriteArrayList;
26  
27  import org.eclipse.aether.AbstractRepositoryListener;
28  import org.eclipse.aether.RepositoryEvent;
29  import org.eclipse.aether.RepositoryListener;
30  
31  /**
32   * A repository listener that delegates to zero or more other listeners (multicast). The list of target listeners is
33   * thread-safe, i.e. target listeners can be added or removed by any thread at any time.
34   */
35  public final class ChainedRepositoryListener
36      extends AbstractRepositoryListener
37  {
38  
39      private final List<RepositoryListener> listeners = new CopyOnWriteArrayList<RepositoryListener>();
40  
41      /**
42       * Creates a new multicast listener that delegates to the specified listeners. In contrast to the constructor, this
43       * factory method will avoid creating an actual chained listener if one of the specified readers is actually
44       * {@code null}.
45       * 
46       * @param listener1 The first listener, may be {@code null}.
47       * @param listener2 The second listener, may be {@code null}.
48       * @return The chained listener or {@code null} if no listener was supplied.
49       */
50      public static RepositoryListener newInstance( RepositoryListener listener1, RepositoryListener listener2 )
51      {
52          if ( listener1 == null )
53          {
54              return listener2;
55          }
56          else if ( listener2 == null )
57          {
58              return listener1;
59          }
60          return new ChainedRepositoryListener( listener1, listener2 );
61      }
62  
63      /**
64       * Creates a new multicast listener that delegates to the specified listeners.
65       * 
66       * @param listeners The listeners to delegate to, may be {@code null} or empty.
67       */
68      public ChainedRepositoryListener( RepositoryListener... listeners )
69      {
70          if ( listeners != null )
71          {
72              add( Arrays.asList( listeners ) );
73          }
74      }
75  
76      /**
77       * Creates a new multicast listener that delegates to the specified listeners.
78       * 
79       * @param listeners The listeners to delegate to, may be {@code null} or empty.
80       */
81      public ChainedRepositoryListener( Collection<? extends RepositoryListener> listeners )
82      {
83          add( listeners );
84      }
85  
86      /**
87       * Adds the specified listeners to the end of the multicast chain.
88       * 
89       * @param listeners The listeners to add, may be {@code null} or empty.
90       */
91      public void add( Collection<? extends RepositoryListener> listeners )
92      {
93          if ( listeners != null )
94          {
95              for ( RepositoryListener listener : listeners )
96              {
97                  add( listener );
98              }
99          }
100     }
101 
102     /**
103      * Adds the specified listener to the end of the multicast chain.
104      * 
105      * @param listener The listener to add, may be {@code null}.
106      */
107     public void add( RepositoryListener listener )
108     {
109         if ( listener != null )
110         {
111             listeners.add( listener );
112         }
113     }
114 
115     /**
116      * Removes the specified listener from the multicast chain. Trying to remove a non-existing listener has no effect.
117      * 
118      * @param listener The listener to remove, may be {@code null}.
119      */
120     public void remove( RepositoryListener listener )
121     {
122         if ( listener != null )
123         {
124             listeners.remove( listener );
125         }
126     }
127 
128     protected void handleError( RepositoryEvent event, RepositoryListener listener, RuntimeException error )
129     {
130         // default just swallows errors
131     }
132 
133     @Override
134     public void artifactDeployed( RepositoryEvent event )
135     {
136         for ( RepositoryListener listener : listeners )
137         {
138             try
139             {
140                 listener.artifactDeployed( event );
141             }
142             catch ( RuntimeException e )
143             {
144                 handleError( event, listener, e );
145             }
146         }
147     }
148 
149     @Override
150     public void artifactDeploying( RepositoryEvent event )
151     {
152         for ( RepositoryListener listener : listeners )
153         {
154             try
155             {
156                 listener.artifactDeploying( event );
157             }
158             catch ( RuntimeException e )
159             {
160                 handleError( event, listener, e );
161             }
162         }
163     }
164 
165     @Override
166     public void artifactDescriptorInvalid( RepositoryEvent event )
167     {
168         for ( RepositoryListener listener : listeners )
169         {
170             try
171             {
172                 listener.artifactDescriptorInvalid( event );
173             }
174             catch ( RuntimeException e )
175             {
176                 handleError( event, listener, e );
177             }
178         }
179     }
180 
181     @Override
182     public void artifactDescriptorMissing( RepositoryEvent event )
183     {
184         for ( RepositoryListener listener : listeners )
185         {
186             try
187             {
188                 listener.artifactDescriptorMissing( event );
189             }
190             catch ( RuntimeException e )
191             {
192                 handleError( event, listener, e );
193             }
194         }
195     }
196 
197     @Override
198     public void artifactDownloaded( RepositoryEvent event )
199     {
200         for ( RepositoryListener listener : listeners )
201         {
202             try
203             {
204                 listener.artifactDownloaded( event );
205             }
206             catch ( RuntimeException e )
207             {
208                 handleError( event, listener, e );
209             }
210         }
211     }
212 
213     @Override
214     public void artifactDownloading( RepositoryEvent event )
215     {
216         for ( RepositoryListener listener : listeners )
217         {
218             try
219             {
220                 listener.artifactDownloading( event );
221             }
222             catch ( RuntimeException e )
223             {
224                 handleError( event, listener, e );
225             }
226         }
227     }
228 
229     @Override
230     public void artifactInstalled( RepositoryEvent event )
231     {
232         for ( RepositoryListener listener : listeners )
233         {
234             try
235             {
236                 listener.artifactInstalled( event );
237             }
238             catch ( RuntimeException e )
239             {
240                 handleError( event, listener, e );
241             }
242         }
243     }
244 
245     @Override
246     public void artifactInstalling( RepositoryEvent event )
247     {
248         for ( RepositoryListener listener : listeners )
249         {
250             try
251             {
252                 listener.artifactInstalling( event );
253             }
254             catch ( RuntimeException e )
255             {
256                 handleError( event, listener, e );
257             }
258         }
259     }
260 
261     @Override
262     public void artifactResolved( RepositoryEvent event )
263     {
264         for ( RepositoryListener listener : listeners )
265         {
266             try
267             {
268                 listener.artifactResolved( event );
269             }
270             catch ( RuntimeException e )
271             {
272                 handleError( event, listener, e );
273             }
274         }
275     }
276 
277     @Override
278     public void artifactResolving( RepositoryEvent event )
279     {
280         for ( RepositoryListener listener : listeners )
281         {
282             try
283             {
284                 listener.artifactResolving( event );
285             }
286             catch ( RuntimeException e )
287             {
288                 handleError( event, listener, e );
289             }
290         }
291     }
292 
293     @Override
294     public void metadataDeployed( RepositoryEvent event )
295     {
296         for ( RepositoryListener listener : listeners )
297         {
298             try
299             {
300                 listener.metadataDeployed( event );
301             }
302             catch ( RuntimeException e )
303             {
304                 handleError( event, listener, e );
305             }
306         }
307     }
308 
309     @Override
310     public void metadataDeploying( RepositoryEvent event )
311     {
312         for ( RepositoryListener listener : listeners )
313         {
314             try
315             {
316                 listener.metadataDeploying( event );
317             }
318             catch ( RuntimeException e )
319             {
320                 handleError( event, listener, e );
321             }
322         }
323     }
324 
325     @Override
326     public void metadataDownloaded( RepositoryEvent event )
327     {
328         for ( RepositoryListener listener : listeners )
329         {
330             try
331             {
332                 listener.metadataDownloaded( event );
333             }
334             catch ( RuntimeException e )
335             {
336                 handleError( event, listener, e );
337             }
338         }
339     }
340 
341     @Override
342     public void metadataDownloading( RepositoryEvent event )
343     {
344         for ( RepositoryListener listener : listeners )
345         {
346             try
347             {
348                 listener.metadataDownloading( event );
349             }
350             catch ( RuntimeException e )
351             {
352                 handleError( event, listener, e );
353             }
354         }
355     }
356 
357     @Override
358     public void metadataInstalled( RepositoryEvent event )
359     {
360         for ( RepositoryListener listener : listeners )
361         {
362             try
363             {
364                 listener.metadataInstalled( event );
365             }
366             catch ( RuntimeException e )
367             {
368                 handleError( event, listener, e );
369             }
370         }
371     }
372 
373     @Override
374     public void metadataInstalling( RepositoryEvent event )
375     {
376         for ( RepositoryListener listener : listeners )
377         {
378             try
379             {
380                 listener.metadataInstalling( event );
381             }
382             catch ( RuntimeException e )
383             {
384                 handleError( event, listener, e );
385             }
386         }
387     }
388 
389     @Override
390     public void metadataInvalid( RepositoryEvent event )
391     {
392         for ( RepositoryListener listener : listeners )
393         {
394             try
395             {
396                 listener.metadataInvalid( event );
397             }
398             catch ( RuntimeException e )
399             {
400                 handleError( event, listener, e );
401             }
402         }
403     }
404 
405     @Override
406     public void metadataResolved( RepositoryEvent event )
407     {
408         for ( RepositoryListener listener : listeners )
409         {
410             try
411             {
412                 listener.metadataResolved( event );
413             }
414             catch ( RuntimeException e )
415             {
416                 handleError( event, listener, e );
417             }
418         }
419     }
420 
421     @Override
422     public void metadataResolving( RepositoryEvent event )
423     {
424         for ( RepositoryListener listener : listeners )
425         {
426             try
427             {
428                 listener.metadataResolving( event );
429             }
430             catch ( RuntimeException e )
431             {
432                 handleError( event, listener, e );
433             }
434         }
435     }
436 
437 }