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