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.filter;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.stream.Collectors;
29
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.artifact.Artifact;
32 import org.eclipse.aether.impl.RemoteRepositoryFilterManager;
33 import org.eclipse.aether.metadata.Metadata;
34 import org.eclipse.aether.repository.RemoteRepository;
35 import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
36 import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
37
38 import static java.util.Objects.requireNonNull;
39
40
41
42
43
44
45
46
47
48 @Singleton
49 @Named
50 public final class DefaultRemoteRepositoryFilterManager implements RemoteRepositoryFilterManager {
51 private static final String INSTANCE_KEY = DefaultRemoteRepositoryFilterManager.class.getName() + ".instance";
52
53 private final Map<String, RemoteRepositoryFilterSource> sources;
54
55 @Inject
56 public DefaultRemoteRepositoryFilterManager(Map<String, RemoteRepositoryFilterSource> sources) {
57 this.sources = requireNonNull(sources);
58 }
59
60 @Override
61 public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession session) {
62 return (RemoteRepositoryFilter) session.getData().computeIfAbsent(INSTANCE_KEY, () -> {
63 HashMap<String, RemoteRepositoryFilter> filters = new HashMap<>();
64 for (Map.Entry<String, RemoteRepositoryFilterSource> entry : sources.entrySet()) {
65 RemoteRepositoryFilter filter = entry.getValue().getRemoteRepositoryFilter(session);
66 if (filter != null) {
67 filters.put(entry.getKey(), filter);
68 }
69 }
70 if (!filters.isEmpty()) {
71 return new Participants(filters);
72 } else {
73 return null;
74 }
75 });
76 }
77
78
79
80
81
82 private static class Participants implements RemoteRepositoryFilter {
83 private final Map<String, RemoteRepositoryFilter> participants;
84
85 private Participants(Map<String, RemoteRepositoryFilter> participants) {
86 this.participants = Collections.unmodifiableMap(participants);
87 }
88
89 @Override
90 public RemoteRepositoryFilter.Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifact) {
91 return new Consensus(
92 participants.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
93 .acceptArtifact(remoteRepository, artifact))));
94 }
95
96 @Override
97 public RemoteRepositoryFilter.Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadata) {
98 return new Consensus(
99 participants.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
100 .acceptMetadata(remoteRepository, metadata))));
101 }
102 }
103
104
105
106
107
108 private static class Consensus implements RemoteRepositoryFilter.Result {
109 private final boolean accepted;
110
111 private final String reasoning;
112
113 Consensus(Map<String, RemoteRepositoryFilter.Result> results) {
114 this.accepted = results.values().stream().allMatch(RemoteRepositoryFilter.Result::isAccepted);
115 this.reasoning = results.values().stream()
116 .filter(r -> !r.isAccepted())
117 .map(RemoteRepositoryFilter.Result::reasoning)
118 .collect(Collectors.joining("; "));
119 }
120
121 @Override
122 public boolean isAccepted() {
123 return accepted;
124 }
125
126 @Override
127 public String reasoning() {
128 return reasoning;
129 }
130 }
131 }