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