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.synccontext.named;
20
21 import java.io.File;
22 import java.net.InetAddress;
23 import java.net.UnknownHostException;
24 import java.util.Collection;
25
26 import org.eclipse.aether.RepositorySystemSession;
27 import org.eclipse.aether.artifact.Artifact;
28 import org.eclipse.aether.metadata.Metadata;
29 import org.eclipse.aether.util.ConfigUtils;
30 import org.eclipse.aether.util.StringDigestUtil;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import static java.util.Objects.requireNonNull;
35 import static java.util.stream.Collectors.toList;
36
37
38
39
40
41
42
43
44
45
46 public class DiscriminatingNameMapper implements NameMapper {
47
48
49
50
51
52
53
54 public static final String CONFIG_PROP_DISCRIMINATOR =
55 NamedLockFactoryAdapter.CONFIG_PROPS_PREFIX + "discriminating.discriminator";
56
57
58
59
60
61
62
63
64
65 public static final String CONFIG_PROP_HOSTNAME =
66 NamedLockFactoryAdapter.CONFIG_PROPS_PREFIX + "discriminating.hostname";
67
68 private static final String DEFAULT_DISCRIMINATOR_DIGEST = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
69
70 private static final String DEFAULT_HOSTNAME = "localhost";
71
72 private static final Logger LOGGER = LoggerFactory.getLogger(DiscriminatingNameMapper.class);
73
74 private final NameMapper delegate;
75
76 private final String hostname;
77
78 public DiscriminatingNameMapper(final NameMapper delegate) {
79 this.delegate = requireNonNull(delegate);
80 this.hostname = getHostname();
81 }
82
83 @Override
84 public boolean isFileSystemFriendly() {
85 return false;
86 }
87
88 @Override
89 public Collection<String> nameLocks(
90 final RepositorySystemSession session,
91 final Collection<? extends Artifact> artifacts,
92 final Collection<? extends Metadata> metadatas) {
93 String discriminator = createDiscriminator(session);
94 return delegate.nameLocks(session, artifacts, metadatas).stream()
95 .map(s -> discriminator + ":" + s)
96 .collect(toList());
97 }
98
99 private String getHostname() {
100 try {
101 return InetAddress.getLocalHost().getHostName();
102 } catch (UnknownHostException e) {
103 LOGGER.warn("Failed to get hostname, using '{}'", DEFAULT_HOSTNAME, e);
104 return DEFAULT_HOSTNAME;
105 }
106 }
107
108 private String createDiscriminator(final RepositorySystemSession session) {
109 String discriminator = ConfigUtils.getString(session, null, CONFIG_PROP_DISCRIMINATOR);
110
111 if (discriminator == null || discriminator.isEmpty()) {
112 String hostname = ConfigUtils.getString(session, this.hostname, CONFIG_PROP_HOSTNAME);
113 File basedir = session.getLocalRepository().getBasedir();
114 discriminator = hostname + ":" + basedir;
115 try {
116 return StringDigestUtil.sha1(discriminator);
117 } catch (Exception e) {
118 LOGGER.warn("Failed to calculate discriminator digest, using '{}'", DEFAULT_DISCRIMINATOR_DIGEST, e);
119 return DEFAULT_DISCRIMINATOR_DIGEST;
120 }
121 }
122 return discriminator;
123 }
124 }