1919import java .util .Map ;
2020import java .util .concurrent .ConcurrentHashMap ;
2121import java .util .concurrent .ConcurrentMap ;
22- import java .util .concurrent .locks .Lock ;
2322import java .util .concurrent .locks .ReadWriteLock ;
2423import java .util .concurrent .locks .ReentrantReadWriteLock ;
2524
2625import org .apache .commons .collections4 .map .AbstractLinkedMap ;
2726import org .apache .commons .collections4 .map .LRUMap ;
2827import org .apache .commons .io .IOUtils ;
28+ import org .apache .commons .lang3 .concurrent .locks .LockingVisitors ;
29+ import org .apache .commons .lang3 .concurrent .locks .LockingVisitors .ReadWriteLockVisitor ;
2930import org .apache .commons .logging .Log ;
3031import org .apache .commons .logging .LogFactory ;
3132import org .apache .commons .vfs2 .FileName ;
@@ -64,17 +65,14 @@ protected boolean removeLRU(final AbstractLinkedMap.LinkEntry<FileName, FileObje
6465 synchronized (LRUFilesCache .this ) {
6566 @ SuppressWarnings ("resource" ) // FileObject allocated elsewhere.
6667 final FileObject fileObject = linkEntry .getValue ();
67-
6868 // System.err.println(">>> " + size() + " check removeLRU:" + linkEntry.getKey().toString());
69-
7069 if (fileObject .isAttached () || fileObject .isContentOpen ()) {
7170 // do not allow open or attached files to be removed
7271 // System.err.println(">>> " + size() + " VETO removeLRU:" +
7372 // linkEntry.getKey().toString() + " (" + file.isAttached() + "/" +
7473 // file.isContentOpen() + ")");
7574 return false ;
7675 }
77-
7876 // System.err.println(">>> " + size() + " removeLRU:" + linkEntry.getKey().toString());
7977 if (super .removeLRU (linkEntry )) {
8078 // force detach
@@ -85,7 +83,6 @@ protected boolean removeLRU(final AbstractLinkedMap.LinkEntry<FileName, FileObje
8583 }
8684 return true ;
8785 }
88-
8986 return false ;
9087 }
9188 }
@@ -122,16 +119,10 @@ public LRUFilesCache(final int lruSize) {
122119
123120 @ Override
124121 public void clear (final FileSystem filesystem ) {
125- final Map <FileName , FileObject > files = getOrCreateFilesystemCache (filesystem );
126-
127- writeLock ().lock ();
128- try {
129- files .clear ();
130-
122+ createLockingVisitors (filesystem ).acceptReadLocked (m -> {
123+ m .clear ();
131124 fileSystemCache .remove (filesystem );
132- } finally {
133- writeLock ().unlock ();
134- }
125+ });
135126 }
136127
137128 @ Override
@@ -140,15 +131,17 @@ public void close() {
140131 fileSystemCache .clear ();
141132 }
142133
134+ private ReadWriteLockVisitor <Map <FileName , FileObject >> createLockingVisitors (final FileObject file ) {
135+ return createLockingVisitors (file .getFileSystem ());
136+ }
137+
138+ private ReadWriteLockVisitor <Map <FileName , FileObject >> createLockingVisitors (final FileSystem filesystem ) {
139+ return LockingVisitors .create (getOrCreateFilesystemCache (filesystem ), rwLock );
140+ }
141+
143142 @ Override
144143 public FileObject getFile (final FileSystem filesystem , final FileName name ) {
145- final Map <FileName , FileObject > files = getOrCreateFilesystemCache (filesystem );
146- readLock ().lock ();
147- try {
148- return files .get (name );
149- } finally {
150- readLock ().unlock ();
151- }
144+ return createLockingVisitors (filesystem ).applyReadLocked (m -> m .get (name ));
152145 }
153146
154147 /**
@@ -163,55 +156,27 @@ protected Map<FileName, FileObject> getOrCreateFilesystemCache(final FileSystem
163156
164157 @ Override
165158 public void putFile (final FileObject file ) {
166- final Map <FileName , FileObject > files = getOrCreateFilesystemCache (file .getFileSystem ());
167-
168- writeLock ().lock ();
169- try {
170- files .put (file .getName (), file );
171- } finally {
172- writeLock ().unlock ();
173- }
159+ createLockingVisitors (file ).acceptWriteLocked (m -> m .put (file .getName (), file ));
174160 }
175161
176162 @ Override
177163 public boolean putFileIfAbsent (final FileObject file ) {
178- final Map <FileName , FileObject > files = getOrCreateFilesystemCache (file .getFileSystem ());
179-
180- writeLock ().lock ();
181- try {
182- return files .putIfAbsent (file .getName (), file ) == null ;
183- } finally {
184- writeLock ().unlock ();
185- }
186- }
187-
188- private Lock readLock () {
189- return rwLock .readLock ();
164+ return createLockingVisitors (file ).applyWriteLocked (m -> m .putIfAbsent (file .getName (), file ) == null );
190165 }
191166
192167 @ Override
193168 public void removeFile (final FileSystem filesystem , final FileName name ) {
194- final Map <?, ?> files = getOrCreateFilesystemCache (filesystem );
195-
196- writeLock ().lock ();
197- try {
198- files .remove (name );
199-
200- if (files .isEmpty ()) {
169+ createLockingVisitors (filesystem ).acceptWriteLocked (m -> {
170+ m .remove (name );
171+ if (m .isEmpty ()) {
201172 fileSystemCache .remove (filesystem );
202173 }
203- } finally {
204- writeLock ().unlock ();
205- }
174+ });
206175 }
207176
208177 @ Override
209178 public void touchFile (final FileObject file ) {
210179 // this moves the file back on top
211180 getFile (file .getFileSystem (), file .getName ());
212181 }
213-
214- private Lock writeLock () {
215- return rwLock .writeLock ();
216- }
217182}
0 commit comments