1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.named.ipc;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.nio.file.Path;
26 import java.nio.file.Paths;
27 import java.util.Collection;
28 import java.util.stream.Collectors;
29
30 import org.eclipse.aether.named.NamedLock;
31 import org.eclipse.aether.named.NamedLockKey;
32 import org.eclipse.aether.named.support.NamedLockFactorySupport;
33 import org.eclipse.aether.named.support.NamedLockSupport;
34 import org.eclipse.aether.util.StringDigestUtil;
35
36 import static java.util.Objects.requireNonNull;
37
38
39
40
41
42
43 @Singleton
44 @Named(IpcNamedLockFactory.NAME)
45 public class IpcNamedLockFactory extends NamedLockFactorySupport {
46 public static final String NAME = "ipc";
47
48 protected final IpcClient client;
49
50 @Inject
51 public IpcNamedLockFactory() {
52 this(Paths.get(System.getProperty("user.home")).resolve(".ipc-sync"));
53 }
54
55 public IpcNamedLockFactory(Path ipcHome) {
56 requireNonNull(ipcHome);
57 Path repository = ipcHome.resolve("repository");
58 Path logPath = ipcHome.resolve("log");
59 this.client = new IpcClient(repository, logPath, null);
60 }
61
62 @Override
63 protected NamedLock doGetLock(Collection<NamedLockKey> keys) {
64 NamedLockKey key = NamedLockKey.of(
65 digestKeys(keys),
66 keys.stream()
67 .map(NamedLockKey::resources)
68 .flatMap(Collection::stream)
69 .collect(Collectors.toList()));
70 return getLockAndRefTrack(
71 key,
72 () -> new IpcNamedLock(
73 key, this, client, keys.stream().map(NamedLockKey::name).collect(Collectors.toList())));
74 }
75
76
77
78
79
80
81
82
83
84 static String digestKeys(Collection<NamedLockKey> keys) {
85 StringDigestUtil sha1 = StringDigestUtil.sha1();
86 sha1.update(keys.size() + ":");
87 for (NamedLockKey key : keys) {
88 String name = key.name();
89 sha1.update(name.length() + ":");
90 sha1.update(name);
91 }
92 return sha1.digest();
93 }
94
95 @Override
96 protected NamedLockSupport createLock(NamedLockKey key) {
97 throw new IllegalStateException("should not get here");
98 }
99
100 @Override
101 protected void doShutdown() {
102 client.close();
103 }
104 }