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.repository.RemoteRepository;
32 import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
33 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
34 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
35 import org.eclipse.aether.transfer.NoRepositoryLayoutException;
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 final class DefaultRepositoryLayoutProvider implements RepositoryLayoutProvider {
46
47 private static final Logger LOGGER = LoggerFactory.getLogger(DefaultRepositoryLayoutProvider.class);
48
49 private final Map<String, RepositoryLayoutFactory> layoutFactories;
50
51 @Inject
52 public DefaultRepositoryLayoutProvider(Map<String, RepositoryLayoutFactory> layoutFactories) {
53 this.layoutFactories = Collections.unmodifiableMap(layoutFactories);
54 }
55
56 @Override
57 public RepositoryLayout newRepositoryLayout(RepositorySystemSession session, RemoteRepository repository)
58 throws NoRepositoryLayoutException {
59 requireNonNull(session, "session cannot be null");
60 requireNonNull(repository, "remote repository cannot be null");
61
62 PrioritizedComponents<RepositoryLayoutFactory> factories = PrioritizedComponents.reuseOrCreate(
63 session, RepositoryLayoutFactory.class, layoutFactories, RepositoryLayoutFactory::getPriority);
64
65 LOGGER.debug("Selecting RepositoryLayout for {}", repository);
66
67 List<NoRepositoryLayoutException> errors = new ArrayList<>();
68 for (PrioritizedComponent<RepositoryLayoutFactory> factory : factories.getEnabled()) {
69 try {
70 RepositoryLayout repositoryLayout = factory.getComponent().newInstance(session, repository);
71
72 if (LOGGER.isDebugEnabled()) {
73 StringBuilder buffer = new StringBuilder(256);
74 buffer.append("Using layout ")
75 .append(repositoryLayout.getClass().getSimpleName());
76 Utils.appendClassLoader(buffer, repositoryLayout);
77 buffer.append(" with priority ").append(factory.getPriority());
78 buffer.append(" for ").append(repository.getUrl());
79 LOGGER.debug(buffer.toString());
80 }
81
82 return repositoryLayout;
83 } catch (NoRepositoryLayoutException e) {
84
85 if (LOGGER.isTraceEnabled()) {
86 LOGGER.trace(
87 "Layout factory {} did not provide layout for {}",
88 factory.getComponent().getClass(),
89 repository,
90 e);
91 } else {
92 LOGGER.debug(
93 "Layout factory {} did not provide layout for {}: {}",
94 factory.getComponent().getClass(),
95 repository,
96 e.getMessage());
97 }
98 errors.add(e);
99 }
100 }
101
102 StringBuilder buffer = new StringBuilder(256);
103 if (factories.isEmpty()) {
104 buffer.append("No layout factories registered");
105 } else {
106 buffer.append("Cannot access ").append(repository.getUrl());
107 buffer.append(" with type ").append(repository.getContentType());
108 buffer.append(" using the available layout factories: ");
109 factories.list(buffer);
110 }
111
112
113 NoRepositoryLayoutException ex = new NoRepositoryLayoutException(
114 repository, buffer.toString(), errors.size() == 1 ? errors.get(0) : null);
115
116 if (errors.size() > 1) {
117 errors.forEach(ex::addSuppressed);
118 }
119 throw ex;
120 }
121 }