View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.internal.impl;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  import javax.inject.Singleton;
24  
25  import java.util.ArrayList;
26  import java.util.Collection;
27  import java.util.Set;
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.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  
37  import static java.util.Objects.requireNonNull;
38  
39  /**
40   */
41  @Singleton
42  @Named
43  public class DefaultRepositoryEventDispatcher implements RepositoryEventDispatcher, Service {
44  
45      private static final Logger LOGGER = LoggerFactory.getLogger(DefaultRepositoryEventDispatcher.class);
46  
47      private Collection<RepositoryListener> listeners = new ArrayList<>();
48  
49      public DefaultRepositoryEventDispatcher() {
50          // enables no-arg constructor
51      }
52  
53      @Inject
54      DefaultRepositoryEventDispatcher(Set<RepositoryListener> listeners) {
55          setRepositoryListeners(listeners);
56      }
57  
58      public DefaultRepositoryEventDispatcher addRepositoryListener(RepositoryListener listener) {
59          this.listeners.add(requireNonNull(listener, "repository listener cannot be null"));
60          return this;
61      }
62  
63      public DefaultRepositoryEventDispatcher setRepositoryListeners(Collection<RepositoryListener> listeners) {
64          if (listeners == null) {
65              this.listeners = new ArrayList<>();
66          } else {
67              this.listeners = listeners;
68          }
69          return this;
70      }
71  
72      public void initService(ServiceLocator locator) {
73          setRepositoryListeners(locator.getServices(RepositoryListener.class));
74      }
75  
76      public void dispatch(RepositoryEvent event) {
77          requireNonNull(event, "event cannot be null");
78          if (!listeners.isEmpty()) {
79              for (RepositoryListener listener : listeners) {
80                  dispatch(event, listener);
81              }
82          }
83  
84          RepositoryListener listener = event.getSession().getRepositoryListener();
85  
86          if (listener != null) {
87              dispatch(event, listener);
88          }
89      }
90  
91      private void dispatch(RepositoryEvent event, RepositoryListener listener) {
92          try {
93              switch (event.getType()) {
94                  case ARTIFACT_DEPLOYED:
95                      listener.artifactDeployed(event);
96                      break;
97                  case ARTIFACT_DEPLOYING:
98                      listener.artifactDeploying(event);
99                      break;
100                 case ARTIFACT_DESCRIPTOR_INVALID:
101                     listener.artifactDescriptorInvalid(event);
102                     break;
103                 case ARTIFACT_DESCRIPTOR_MISSING:
104                     listener.artifactDescriptorMissing(event);
105                     break;
106                 case ARTIFACT_DOWNLOADED:
107                     listener.artifactDownloaded(event);
108                     break;
109                 case ARTIFACT_DOWNLOADING:
110                     listener.artifactDownloading(event);
111                     break;
112                 case ARTIFACT_INSTALLED:
113                     listener.artifactInstalled(event);
114                     break;
115                 case ARTIFACT_INSTALLING:
116                     listener.artifactInstalling(event);
117                     break;
118                 case ARTIFACT_RESOLVED:
119                     listener.artifactResolved(event);
120                     break;
121                 case ARTIFACT_RESOLVING:
122                     listener.artifactResolving(event);
123                     break;
124                 case METADATA_DEPLOYED:
125                     listener.metadataDeployed(event);
126                     break;
127                 case METADATA_DEPLOYING:
128                     listener.metadataDeploying(event);
129                     break;
130                 case METADATA_DOWNLOADED:
131                     listener.metadataDownloaded(event);
132                     break;
133                 case METADATA_DOWNLOADING:
134                     listener.metadataDownloading(event);
135                     break;
136                 case METADATA_INSTALLED:
137                     listener.metadataInstalled(event);
138                     break;
139                 case METADATA_INSTALLING:
140                     listener.metadataInstalling(event);
141                     break;
142                 case METADATA_INVALID:
143                     listener.metadataInvalid(event);
144                     break;
145                 case METADATA_RESOLVED:
146                     listener.metadataResolved(event);
147                     break;
148                 case METADATA_RESOLVING:
149                     listener.metadataResolving(event);
150                     break;
151                 default:
152                     throw new IllegalStateException("unknown repository event type " + event.getType());
153             }
154         } catch (Exception | LinkageError e) {
155             logError(e, listener);
156         }
157     }
158 
159     private void logError(Throwable e, Object listener) {
160         LOGGER.warn(
161                 "Failed to dispatch repository event to {}", listener.getClass().getCanonicalName(), e);
162     }
163 }