1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.Collections;
27 import java.util.List;
28 import java.util.Map;
29
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.impl.LocalRepositoryProvider;
32 import org.eclipse.aether.repository.LocalRepository;
33 import org.eclipse.aether.repository.LocalRepositoryManager;
34 import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
35 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import static java.util.Objects.requireNonNull;
40
41
42
43 @Singleton
44 @Named
45 public class DefaultLocalRepositoryProvider implements LocalRepositoryProvider {
46
47 private static final Logger LOGGER = LoggerFactory.getLogger(DefaultLocalRepositoryProvider.class);
48
49 private final Map<String, LocalRepositoryManagerFactory> localRepositoryManagerFactories;
50
51 @Inject
52 public DefaultLocalRepositoryProvider(Map<String, LocalRepositoryManagerFactory> localRepositoryManagerFactories) {
53 this.localRepositoryManagerFactories = Collections.unmodifiableMap(localRepositoryManagerFactories);
54 }
55
56 @Override
57 public LocalRepositoryManager newLocalRepositoryManager(RepositorySystemSession session, LocalRepository repository)
58 throws NoLocalRepositoryManagerException {
59 requireNonNull(session, "session cannot be null");
60 requireNonNull(repository, "repository cannot be null");
61
62 PrioritizedComponents<LocalRepositoryManagerFactory> factories = PrioritizedComponents.reuseOrCreate(
63 session,
64 LocalRepositoryManagerFactory.class,
65 localRepositoryManagerFactories,
66 LocalRepositoryManagerFactory::getPriority);
67
68 LOGGER.debug("Selecting LocalRepositoryManager for {}", repository);
69
70 List<NoLocalRepositoryManagerException> errors = new ArrayList<>();
71 for (PrioritizedComponent<LocalRepositoryManagerFactory> factory : factories.getEnabled()) {
72 try {
73 LocalRepositoryManager manager = factory.getComponent().newInstance(session, repository);
74
75 if (LOGGER.isDebugEnabled()) {
76 StringBuilder buffer = new StringBuilder(256);
77 buffer.append("Using manager ").append(manager.getClass().getSimpleName());
78 Utils.appendClassLoader(buffer, manager);
79 buffer.append(" with priority ").append(factory.getPriority());
80 buffer.append(" for ").append(repository.getBasePath());
81
82 LOGGER.debug(buffer.toString());
83 }
84
85 return manager;
86 } catch (NoLocalRepositoryManagerException e) {
87
88 if (LOGGER.isTraceEnabled()) {
89 LOGGER.trace(
90 "LRM factory {} did not provide LRM for {}",
91 factory.getComponent().getClass(),
92 repository,
93 e);
94 } else {
95 LOGGER.debug(
96 "LRM factory {} did not provide LRM for {}: {}",
97 factory.getComponent().getClass(),
98 repository,
99 e.getMessage());
100 }
101 errors.add(e);
102 }
103 }
104
105 StringBuilder buffer = new StringBuilder(256);
106 if (factories.isEmpty()) {
107 buffer.append("No local repository managers registered");
108 } else {
109 buffer.append("Cannot access ").append(repository.getBasePath());
110 buffer.append(" with type ").append(repository.getContentType());
111 buffer.append(" using the available factories ");
112 factories.list(buffer);
113 }
114
115
116 NoLocalRepositoryManagerException ex = new NoLocalRepositoryManagerException(
117 repository, buffer.toString(), errors.size() == 1 ? errors.get(0) : null);
118
119 if (errors.size() > 1) {
120 errors.forEach(ex::addSuppressed);
121 }
122 throw ex;
123 }
124 }