1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2.cache;
18
19 import java.util.Map;
20 import java.util.concurrent.ConcurrentHashMap;
21 import java.util.concurrent.ConcurrentMap;
22
23 import org.apache.commons.vfs2.FileName;
24 import org.apache.commons.vfs2.FileObject;
25 import org.apache.commons.vfs2.FileSystem;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class DefaultFilesCache extends AbstractFilesCache {
46
47 private static final float LOAD_FACTOR = 0.75f;
48 private static final int INITIAL_CAPACITY = 200;
49
50
51 private final ConcurrentMap<FileSystem, ConcurrentMap<FileName, FileObject>> fileSystemCache = new ConcurrentHashMap<>(10);
52
53
54
55
56 public DefaultFilesCache() {
57
58 }
59
60 @Override
61 public void clear(final FileSystem filesystem) {
62
63 final Map<FileName, FileObject> files = fileSystemCache.remove(filesystem);
64 if (files != null) {
65 files.clear();
66 }
67 }
68
69 @Override
70 public void close() {
71 super.close();
72 fileSystemCache.clear();
73 }
74
75 @Override
76 public FileObject getFile(final FileSystem filesystem, final FileName name) {
77
78 final Map<FileName, FileObject> files = fileSystemCache.get(filesystem);
79 if (files == null) {
80
81 return null;
82 }
83 return files.get(name);
84 }
85
86
87
88
89
90
91
92 protected ConcurrentMap<FileName, FileObject> getOrCreateFilesystemCache(final FileSystem fileSystem) {
93 ConcurrentMap<FileName, FileObject> files = fileSystemCache.get(fileSystem);
94
95 while (files == null) {
96 files = fileSystemCache.computeIfAbsent(fileSystem,
97 k -> new ConcurrentHashMap<>(INITIAL_CAPACITY, LOAD_FACTOR, Math.max(2, Runtime.getRuntime().availableProcessors()) / 2));
98 }
99 return files;
100 }
101
102 @Override
103 public void putFile(final FileObject file) {
104 final Map<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem());
105 files.put(file.getName(), file);
106 }
107
108 @Override
109 public boolean putFileIfAbsent(final FileObject file) {
110 final ConcurrentMap<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem());
111 return files.putIfAbsent(file.getName(), file) == null;
112 }
113
114 @Override
115 public void removeFile(final FileSystem filesystem, final FileName name) {
116
117 final Map<FileName, FileObject> files = fileSystemCache.get(filesystem);
118 if (files != null) {
119 files.remove(name);
120
121
122 }
123 }
124 }