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