1 package org.eclipse.aether.internal.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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 }