1 package org.eclipse.aether.synccontext;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Collection;
23 import java.util.concurrent.locks.Lock;
24 import java.util.concurrent.locks.ReentrantReadWriteLock;
25
26 import javax.annotation.Priority;
27 import javax.inject.Named;
28 import javax.inject.Singleton;
29
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.SyncContext;
32 import org.eclipse.aether.artifact.Artifact;
33 import org.eclipse.aether.impl.SyncContextFactory;
34 import org.eclipse.aether.metadata.Metadata;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44 @Named
45 @Priority( Integer.MAX_VALUE )
46 @Singleton
47 public class GlobalSyncContextFactory
48 implements SyncContextFactory
49 {
50 private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
51
52 public SyncContext newInstance( RepositorySystemSession session, boolean shared )
53 {
54 return new GlobalSyncContext( shared ? lock.readLock() : lock.writeLock(), shared );
55 }
56
57 static class GlobalSyncContext
58 implements SyncContext
59 {
60 private static final Logger LOGGER = LoggerFactory.getLogger( GlobalSyncContext.class );
61
62 private final Lock lock;
63 private final boolean shared;
64 private int lockHoldCount;
65
66 private GlobalSyncContext( Lock lock, boolean shared )
67 {
68 this.lock = lock;
69 this.shared = shared;
70 }
71
72 public void acquire( Collection<? extends Artifact> artifact, Collection<? extends Metadata> metadata )
73 {
74 LOGGER.trace( "Acquiring global {} lock (currently held: {})",
75 shared ? "read" : "write", lockHoldCount );
76 lock.lock();
77 lockHoldCount++;
78 }
79
80 public void close()
81 {
82 while ( lockHoldCount > 0 )
83 {
84 LOGGER.trace( "Releasing global {} lock (currently held: {})",
85 shared ? "read" : "write", lockHoldCount );
86 lock.unlock();
87 lockHoldCount--;
88 }
89 }
90
91 }
92
93 }