View Javadoc
1   package org.eclipse.aether.internal.impl;
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.ArrayList;
23  import java.util.Collection;
24  import java.util.Set;
25  
26  import javax.inject.Inject;
27  import javax.inject.Named;
28  
29  import org.eclipse.aether.RepositoryEvent;
30  import org.eclipse.aether.RepositoryListener;
31  import org.eclipse.aether.impl.RepositoryEventDispatcher;
32  import org.eclipse.aether.spi.locator.Service;
33  import org.eclipse.aether.spi.locator.ServiceLocator;
34  import org.eclipse.aether.spi.log.Logger;
35  import org.eclipse.aether.spi.log.LoggerFactory;
36  import org.eclipse.aether.spi.log.NullLoggerFactory;
37  
38  /**
39   */
40  @Named
41  public class DefaultRepositoryEventDispatcher
42      implements RepositoryEventDispatcher, Service
43  {
44  
45      private Logger logger = NullLoggerFactory.LOGGER;
46  
47      private Collection<RepositoryListener> listeners = new ArrayList<RepositoryListener>();
48  
49      public DefaultRepositoryEventDispatcher()
50      {
51          // enables no-arg constructor
52      }
53  
54      @Inject
55      DefaultRepositoryEventDispatcher( Set<RepositoryListener> listeners, LoggerFactory loggerFactory )
56      {
57          setRepositoryListeners( listeners );
58          setLoggerFactory( loggerFactory );
59      }
60  
61      public DefaultRepositoryEventDispatcher setLoggerFactory( LoggerFactory loggerFactory )
62      {
63          this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
64          return this;
65      }
66  
67      public DefaultRepositoryEventDispatcher addRepositoryListener( RepositoryListener listener )
68      {
69          if ( listener == null )
70          {
71              throw new IllegalArgumentException( "repository listener has not been specified" );
72          }
73          this.listeners.add( listener );
74          return this;
75      }
76  
77      public DefaultRepositoryEventDispatcher setRepositoryListeners( Collection<RepositoryListener> listeners )
78      {
79          if ( listeners == null )
80          {
81              this.listeners = new ArrayList<RepositoryListener>();
82          }
83          else
84          {
85              this.listeners = listeners;
86          }
87          return this;
88      }
89  
90      public void initService( ServiceLocator locator )
91      {
92          setLoggerFactory( locator.getService( LoggerFactory.class ) );
93          setRepositoryListeners( locator.getServices( RepositoryListener.class ) );
94      }
95  
96      public void dispatch( RepositoryEvent event )
97      {
98          if ( !listeners.isEmpty() )
99          {
100             for ( RepositoryListener listener : listeners )
101             {
102                 dispatch( event, listener );
103             }
104         }
105 
106         RepositoryListener listener = event.getSession().getRepositoryListener();
107 
108         if ( listener != null )
109         {
110             dispatch( event, listener );
111         }
112     }
113 
114     private void dispatch( RepositoryEvent event, RepositoryListener listener )
115     {
116         try
117         {
118             switch ( event.getType() )
119             {
120                 case ARTIFACT_DEPLOYED:
121                     listener.artifactDeployed( event );
122                     break;
123                 case ARTIFACT_DEPLOYING:
124                     listener.artifactDeploying( event );
125                     break;
126                 case ARTIFACT_DESCRIPTOR_INVALID:
127                     listener.artifactDescriptorInvalid( event );
128                     break;
129                 case ARTIFACT_DESCRIPTOR_MISSING:
130                     listener.artifactDescriptorMissing( event );
131                     break;
132                 case ARTIFACT_DOWNLOADED:
133                     listener.artifactDownloaded( event );
134                     break;
135                 case ARTIFACT_DOWNLOADING:
136                     listener.artifactDownloading( event );
137                     break;
138                 case ARTIFACT_INSTALLED:
139                     listener.artifactInstalled( event );
140                     break;
141                 case ARTIFACT_INSTALLING:
142                     listener.artifactInstalling( event );
143                     break;
144                 case ARTIFACT_RESOLVED:
145                     listener.artifactResolved( event );
146                     break;
147                 case ARTIFACT_RESOLVING:
148                     listener.artifactResolving( event );
149                     break;
150                 case METADATA_DEPLOYED:
151                     listener.metadataDeployed( event );
152                     break;
153                 case METADATA_DEPLOYING:
154                     listener.metadataDeploying( event );
155                     break;
156                 case METADATA_DOWNLOADED:
157                     listener.metadataDownloaded( event );
158                     break;
159                 case METADATA_DOWNLOADING:
160                     listener.metadataDownloading( event );
161                     break;
162                 case METADATA_INSTALLED:
163                     listener.metadataInstalled( event );
164                     break;
165                 case METADATA_INSTALLING:
166                     listener.metadataInstalling( event );
167                     break;
168                 case METADATA_INVALID:
169                     listener.metadataInvalid( event );
170                     break;
171                 case METADATA_RESOLVED:
172                     listener.metadataResolved( event );
173                     break;
174                 case METADATA_RESOLVING:
175                     listener.metadataResolving( event );
176                     break;
177                 default:
178                     throw new IllegalStateException( "unknown repository event type " + event.getType() );
179             }
180         }
181         catch ( Exception e )
182         {
183             logError( e, listener );
184         }
185         catch ( LinkageError e )
186         {
187             logError( e, listener );
188         }
189     }
190 
191     private void logError( Throwable e, Object listener )
192     {
193         String msg =
194             "Failed to dispatch repository event to " + listener.getClass().getCanonicalName() + ": " + e.getMessage();
195 
196         if ( logger.isDebugEnabled() )
197         {
198             logger.warn( msg, e );
199         }
200         else
201         {
202             logger.warn( msg );
203         }
204     }
205 
206 }