1 package org.eclipse.aether.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.lang.reflect.Constructor;
23 import java.lang.reflect.Modifier;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.Collections;
27 import java.util.HashMap;
28 import java.util.LinkedHashSet;
29 import java.util.List;
30 import java.util.Map;
31 import static java.util.Objects.requireNonNull;
32
33 import org.eclipse.aether.RepositorySystem;
34 import org.eclipse.aether.internal.impl.DefaultRepositorySystemLifecycle;
35 import org.eclipse.aether.internal.impl.LocalPathComposer;
36 import org.eclipse.aether.internal.impl.DefaultLocalPathComposer;
37 import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
38 import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
39 import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
40 import org.eclipse.aether.internal.impl.TrackingFileManager;
41 import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
42 import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
43 import org.eclipse.aether.internal.impl.DefaultDeployer;
44 import org.eclipse.aether.internal.impl.DefaultFileProcessor;
45 import org.eclipse.aether.internal.impl.DefaultInstaller;
46 import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
47 import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
48 import org.eclipse.aether.internal.impl.DefaultOfflineController;
49 import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
50 import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
51 import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
52 import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
53 import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
54 import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
55 import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
56 import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
57 import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
58 import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
59 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
60 import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
61 import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory;
62 import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
63 import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
64 import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactory;
65 import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector;
66 import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
67 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
68 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
69 import org.eclipse.aether.spi.connector.transport.TransporterProvider;
70 import org.eclipse.aether.spi.io.FileProcessor;
71 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
72 import org.eclipse.aether.spi.locator.Service;
73 import org.eclipse.aether.spi.locator.ServiceLocator;
74 import org.eclipse.aether.spi.log.LoggerFactory;
75 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 @Deprecated
93 public final class DefaultServiceLocator
94 implements ServiceLocator
95 {
96
97 private class Entry<T>
98 {
99
100 private final Class<T> type;
101
102 private final Collection<Object> providers;
103
104 private List<T> instances;
105
106 Entry( Class<T> type )
107 {
108 this.type = requireNonNull( type, "service type cannot be null" );
109 providers = new LinkedHashSet<>( 8 );
110 }
111
112 public synchronized void setServices( T... services )
113 {
114 providers.clear();
115 if ( services != null )
116 {
117 for ( T service : services )
118 {
119 providers.add( requireNonNull( service, "service instance cannot be null" ) );
120 }
121 }
122 instances = null;
123 }
124
125 public synchronized void setService( Class<? extends T> impl )
126 {
127 providers.clear();
128 addService( impl );
129 }
130
131 public synchronized void addService( Class<? extends T> impl )
132 {
133 providers.add( requireNonNull( impl, "implementation class cannot be null" ) );
134 instances = null;
135 }
136
137 public T getInstance()
138 {
139 List<T> instances = getInstances();
140 return instances.isEmpty() ? null : instances.get( 0 );
141 }
142
143 public synchronized List<T> getInstances()
144 {
145 if ( instances == null )
146 {
147 instances = new ArrayList<>( providers.size() );
148 for ( Object provider : providers )
149 {
150 T instance;
151 if ( provider instanceof Class )
152 {
153 instance = newInstance( (Class<?>) provider );
154 }
155 else
156 {
157 instance = type.cast( provider );
158 }
159 if ( instance != null )
160 {
161 instances.add( instance );
162 }
163 }
164 instances = Collections.unmodifiableList( instances );
165 }
166 return instances;
167 }
168
169 private T newInstance( Class<?> impl )
170 {
171 try
172 {
173 Constructor<?> constr = impl.getDeclaredConstructor();
174 if ( !Modifier.isPublic( constr.getModifiers() ) )
175 {
176 constr.setAccessible( true );
177 }
178 Object obj = constr.newInstance();
179
180 T instance = type.cast( obj );
181 if ( instance instanceof Service )
182 {
183 ( (Service) instance ).initService( DefaultServiceLocator.this );
184 }
185 return instance;
186 }
187 catch ( Exception | LinkageError e )
188 {
189 serviceCreationFailed( type, impl, e );
190 }
191 return null;
192 }
193
194 }
195
196 private final Map<Class<?>, Entry<?>> entries;
197
198 private ErrorHandler errorHandler;
199
200
201
202
203 public DefaultServiceLocator()
204 {
205 entries = new HashMap<>();
206
207 addService( RepositorySystem.class, DefaultRepositorySystem.class );
208 addService( ArtifactResolver.class, DefaultArtifactResolver.class );
209 addService( DependencyCollector.class, DefaultDependencyCollector.class );
210 addService( Deployer.class, DefaultDeployer.class );
211 addService( Installer.class, DefaultInstaller.class );
212 addService( MetadataResolver.class, DefaultMetadataResolver.class );
213 addService( RepositoryLayoutProvider.class, DefaultRepositoryLayoutProvider.class );
214 addService( RepositoryLayoutFactory.class, Maven2RepositoryLayoutFactory.class );
215 addService( TransporterProvider.class, DefaultTransporterProvider.class );
216 addService( ChecksumPolicyProvider.class, DefaultChecksumPolicyProvider.class );
217 addService( RepositoryConnectorProvider.class, DefaultRepositoryConnectorProvider.class );
218 addService( RemoteRepositoryManager.class, DefaultRemoteRepositoryManager.class );
219 addService( UpdateCheckManager.class, DefaultUpdateCheckManager.class );
220 addService( UpdatePolicyAnalyzer.class, DefaultUpdatePolicyAnalyzer.class );
221 addService( FileProcessor.class, DefaultFileProcessor.class );
222 addService( org.eclipse.aether.impl.SyncContextFactory.class,
223 org.eclipse.aether.internal.impl.synccontext.legacy.DefaultSyncContextFactory.class );
224 addService( SyncContextFactory.class, DefaultSyncContextFactory.class );
225 addService( RepositoryEventDispatcher.class, DefaultRepositoryEventDispatcher.class );
226 addService( OfflineController.class, DefaultOfflineController.class );
227 addService( LocalRepositoryProvider.class, DefaultLocalRepositoryProvider.class );
228 addService( LocalRepositoryManagerFactory.class, SimpleLocalRepositoryManagerFactory.class );
229 addService( LocalRepositoryManagerFactory.class, EnhancedLocalRepositoryManagerFactory.class );
230 addService( LoggerFactory.class, Slf4jLoggerFactory.class );
231 addService( TrackingFileManager.class, DefaultTrackingFileManager.class );
232 addService( ChecksumAlgorithmFactorySelector.class, DefaultChecksumAlgorithmFactorySelector.class );
233 addService( LocalPathComposer.class, DefaultLocalPathComposer.class );
234 addService( RemoteRepositoryFilterManager.class, DefaultRemoteRepositoryFilterManager.class );
235 addService( RepositorySystemLifecycle.class, DefaultRepositorySystemLifecycle.class );
236 addService( NamedLockFactoryAdapterFactory.class, NamedLockFactoryAdapterFactoryImpl.class );
237 }
238
239 private <T> Entry<T> getEntry( Class<T> type, boolean create )
240 {
241 @SuppressWarnings( "unchecked" )
242 Entry<T> entry = (Entry<T>) entries.get( requireNonNull( type, "service type cannot be null" ) );
243 if ( entry == null && create )
244 {
245 entry = new Entry<>( type );
246 entries.put( type, entry );
247 }
248 return entry;
249 }
250
251
252
253
254
255
256
257
258
259
260
261 public <T> DefaultServiceLocator setService( Class<T> type, Class<? extends T> impl )
262 {
263 getEntry( type, true ).setService( impl );
264 return this;
265 }
266
267
268
269
270
271
272
273
274
275
276
277 public <T> DefaultServiceLocator addService( Class<T> type, Class<? extends T> impl )
278 {
279 getEntry( type, true ).addService( impl );
280 return this;
281 }
282
283
284
285
286
287
288
289
290
291 public <T> DefaultServiceLocator setServices( Class<T> type, T... services )
292 {
293 getEntry( type, true ).setServices( services );
294 return this;
295 }
296
297 public <T> T getService( Class<T> type )
298 {
299 Entry<T> entry = getEntry( type, false );
300 return ( entry != null ) ? entry.getInstance() : null;
301 }
302
303 public <T> List<T> getServices( Class<T> type )
304 {
305 Entry<T> entry = getEntry( type, false );
306 return ( entry != null ) ? entry.getInstances() : null;
307 }
308
309 private void serviceCreationFailed( Class<?> type, Class<?> impl, Throwable exception )
310 {
311 if ( errorHandler != null )
312 {
313 errorHandler.serviceCreationFailed( type, impl, exception );
314 }
315 }
316
317
318
319
320
321
322 public void setErrorHandler( ErrorHandler errorHandler )
323 {
324 this.errorHandler = errorHandler;
325 }
326
327
328
329
330 public abstract static class ErrorHandler
331 {
332
333
334
335
336
337
338
339
340
341 public void serviceCreationFailed( Class<?> type, Class<?> impl, Throwable exception )
342 {
343 }
344
345 }
346
347 }