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
63 String instanceSpecificKey = INSTANCE_KEY + "." + session.hashCode();
64 return (RemoteRepositoryFilter) session.getData().computeIfAbsent(instanceSpecificKey, () -> {
65 HashMap<String, RemoteRepositoryFilter> filters = new HashMap<>();
66 for (Map.Entry<String, RemoteRepositoryFilterSource> entry : sources.entrySet()) {
67 RemoteRepositoryFilter filter = entry.getValue().getRemoteRepositoryFilter(session);
68 if (filter != null) {
69 filters.put(entry.getKey(), filter);
70 }
71 }
72 if (!filters.isEmpty()) {
73 return new Participants(filters);
74 } else {
75 return null;
76 }
77 });
78 }
79
80
81
82
83
84 private static class Participants implements RemoteRepositoryFilter {
85 private final Map<String, RemoteRepositoryFilter> participants;
86
87 private Participants(Map<String, RemoteRepositoryFilter> participants) {
88 this.participants = Collections.unmodifiableMap(participants);
89 }
90
91 @Override
92 public RemoteRepositoryFilter.Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifact) {
93 return new Consensus(
94 participants.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
95 .acceptArtifact(remoteRepository, artifact))));
96 }
97
98 @Override
99 public RemoteRepositoryFilter.Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadata) {
100 return new Consensus(
101 participants.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
102 .acceptMetadata(remoteRepository, metadata))));
103 }
104 }
105
106
107
108
109
110 private static class Consensus implements RemoteRepositoryFilter.Result {
111 private final boolean accepted;
112
113 private final String reasoning;
114
115 Consensus(Map<String, RemoteRepositoryFilter.Result> results) {
116 this.accepted = results.values().stream().allMatch(RemoteRepositoryFilter.Result::isAccepted);
117 this.reasoning = results.values().stream()
118 .filter(r -> !r.isAccepted())
119 .map(RemoteRepositoryFilter.Result::reasoning)
120 .collect(Collectors.joining("; "));
121 }
122
123 @Override
124 public boolean isAccepted() {
125 return accepted;
126 }
127
128 @Override
129 public String reasoning() {
130 return reasoning;
131 }
132 }
133 }