1 package org.eclipse.aether.named.hazelcast;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.ConcurrentMap;
24 import java.util.concurrent.TimeUnit;
25
26 import com.hazelcast.core.HazelcastInstance;
27 import com.hazelcast.cp.ISemaphore;
28 import org.eclipse.aether.named.support.AdaptedSemaphoreNamedLock;
29 import org.eclipse.aether.named.support.AdaptedSemaphoreNamedLock.AdaptedSemaphore;
30 import org.eclipse.aether.named.support.NamedLockFactorySupport;
31
32 import static java.util.Objects.requireNonNull;
33
34
35
36
37
38
39 public class HazelcastSemaphoreNamedLockFactory
40 extends NamedLockFactorySupport
41 {
42 protected final HazelcastInstance hazelcastInstance;
43
44 protected final boolean manageHazelcast;
45
46 private final HazelcastSemaphoreProvider hazelcastSemaphoreProvider;
47
48 private final ConcurrentMap<String, ISemaphore> semaphores;
49
50 public HazelcastSemaphoreNamedLockFactory(
51 final HazelcastInstance hazelcastInstance,
52 final boolean manageHazelcast,
53 final HazelcastSemaphoreProvider hazelcastSemaphoreProvider
54 )
55 {
56 this.hazelcastInstance = requireNonNull( hazelcastInstance );
57 this.manageHazelcast = manageHazelcast;
58 this.hazelcastSemaphoreProvider = requireNonNull( hazelcastSemaphoreProvider );
59 this.semaphores = new ConcurrentHashMap<>();
60 }
61
62 @Override
63 protected AdaptedSemaphoreNamedLock createLock( final String name )
64 {
65 ISemaphore semaphore = semaphores.computeIfAbsent( name,
66 k -> hazelcastSemaphoreProvider.acquireSemaphore( hazelcastInstance, name ) );
67 return new AdaptedSemaphoreNamedLock( name, this, new HazelcastSemaphore( semaphore ) );
68 }
69
70 @Override
71 protected void destroyLock( final String name )
72 {
73 hazelcastSemaphoreProvider.releaseSemaphore( hazelcastInstance, name, semaphores.remove( name ) );
74 }
75
76 @Override
77 public void shutdown()
78 {
79 if ( manageHazelcast )
80 {
81 hazelcastInstance.shutdown();
82 }
83 }
84
85 private static final class HazelcastSemaphore implements AdaptedSemaphore
86 {
87 private final ISemaphore semaphore;
88
89 private HazelcastSemaphore( final ISemaphore semaphore )
90 {
91 this.semaphore = semaphore;
92 }
93
94 @Override
95 public boolean tryAcquire( final int perms, final long time, final TimeUnit unit )
96 throws InterruptedException
97 {
98 return semaphore.tryAcquire( perms, time, unit );
99 }
100
101 @Override
102 public void release( final int perms )
103 {
104 semaphore.release( perms );
105 }
106 }
107 }