1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.named.support;
20
21 import java.util.Objects;
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.ConcurrentMap;
24 import java.util.concurrent.atomic.AtomicInteger;
25
26 import org.eclipse.aether.named.NamedLockFactory;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
31
32
33 public abstract class NamedLockFactorySupport implements NamedLockFactory {
34 protected final Logger logger = LoggerFactory.getLogger(getClass());
35
36 private final ConcurrentMap<String, NamedLockHolder> locks;
37
38 public NamedLockFactorySupport() {
39 this.locks = new ConcurrentHashMap<>();
40 }
41
42 @Override
43 public NamedLockSupport getLock(final String name) {
44 return locks.compute(name, (k, v) -> {
45 if (v == null) {
46 v = new NamedLockHolder(createLock(k));
47 }
48 v.incRef();
49 return v;
50 })
51 .namedLock;
52 }
53
54 @Override
55 public void shutdown() {
56
57 }
58
59 public void closeLock(final String name) {
60 locks.compute(name, (k, v) -> {
61 if (v != null && v.decRef() == 0) {
62 destroyLock(v.namedLock.name());
63 return null;
64 }
65 return v;
66 });
67 }
68
69
70
71
72
73 protected abstract NamedLockSupport createLock(String name);
74
75
76
77
78
79 protected void destroyLock(final String name) {
80
81 }
82
83 private static final class NamedLockHolder {
84 private final NamedLockSupport namedLock;
85
86 private final AtomicInteger referenceCount;
87
88 private NamedLockHolder(final NamedLockSupport namedLock) {
89 this.namedLock = Objects.requireNonNull(namedLock);
90 this.referenceCount = new AtomicInteger(0);
91 }
92
93 private int incRef() {
94 return referenceCount.incrementAndGet();
95 }
96
97 private int decRef() {
98 return referenceCount.decrementAndGet();
99 }
100
101 @Override
102 public String toString() {
103 return "[refCount=" + referenceCount.get() + ", lock=" + namedLock + "]";
104 }
105 }
106 }