1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2.provider;
18
19 import java.util.Map;
20 import java.util.TreeMap;
21 import java.util.stream.Stream;
22
23 import org.apache.commons.vfs2.FileName;
24 import org.apache.commons.vfs2.FileObject;
25 import org.apache.commons.vfs2.FileSystem;
26 import org.apache.commons.vfs2.FileSystemConfigBuilder;
27 import org.apache.commons.vfs2.FileSystemException;
28 import org.apache.commons.vfs2.FileSystemOptions;
29 import org.apache.commons.vfs2.provider.local.GenericFileNameParser;
30
31
32
33
34 public abstract class AbstractFileProvider extends AbstractVfsContainer implements FileProvider {
35
36 private static final AbstractFileSystem[] EMPTY_ABSTRACT_FILE_SYSTEMS = {};
37
38
39
40
41
42
43
44 private final Map<FileSystemKey, FileSystem> fileSystemMap = new TreeMap<>();
45
46 private FileNameParser fileNameParser;
47
48
49
50
51 public AbstractFileProvider() {
52 fileNameParser = GenericFileNameParser.getInstance();
53 }
54
55
56
57
58
59
60
61
62
63
64
65 protected void addFileSystem(final Comparable<?> key, final FileSystem fs) throws FileSystemException {
66
67 addComponent(fs);
68 final FileSystemKey treeKey = new FileSystemKey(key, fs.getFileSystemOptions());
69 ((AbstractFileSystem) fs).setCacheKey(treeKey);
70 synchronized (fileSystemMap) {
71 fileSystemMap.put(treeKey, fs);
72 }
73 }
74
75
76
77
78 @Override
79 public void close() {
80 synchronized (fileSystemMap) {
81 fileSystemMap.clear();
82 }
83 super.close();
84 }
85
86
87
88
89
90
91 public void closeFileSystem(final FileSystem fileSystem) {
92 final AbstractFileSystem fs = (AbstractFileSystem) fileSystem;
93
94 final FileSystemKey key = fs.getCacheKey();
95 if (key != null) {
96 synchronized (fileSystemMap) {
97 fileSystemMap.remove(key);
98 }
99 }
100
101 removeComponent(fs);
102 fs.close();
103 }
104
105
106
107
108
109
110
111
112
113
114 @Override
115 public FileObject createFileSystem(final String scheme, final FileObject file,
116 final FileSystemOptions fileSystemOptions) throws FileSystemException {
117
118 throw new FileSystemException("vfs.provider/not-layered-fs.error", scheme);
119 }
120
121
122
123
124
125
126
127
128 protected FileSystem findFileSystem(final Comparable<?> key, final FileSystemOptions fileSystemOptions) {
129 synchronized (fileSystemMap) {
130 return fileSystemMap.get(new FileSystemKey(key, fileSystemOptions));
131 }
132 }
133
134
135
136
137 public void freeUnusedResources() {
138 final AbstractFileSystem[] abstractFileSystems;
139 synchronized (fileSystemMap) {
140
141 abstractFileSystems = fileSystemMap.values().toArray(EMPTY_ABSTRACT_FILE_SYSTEMS);
142 }
143
144
145 Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable)
146 .forEach(AbstractFileSystem::closeCommunicationLink);
147 }
148
149
150
151
152
153
154 @Override
155 public FileSystemConfigBuilder getConfigBuilder() {
156 return null;
157 }
158
159
160
161
162
163
164 protected FileNameParser getFileNameParser() {
165 return fileNameParser;
166 }
167
168
169
170
171
172
173
174
175
176 @Override
177 public FileName parseUri(final FileName base, final String uri) throws FileSystemException {
178 if (getFileNameParser() != null) {
179 return getFileNameParser().parseUri(getContext(), base, uri);
180 }
181 throw new FileSystemException("vfs.provider/filename-parser-missing.error");
182 }
183
184
185
186
187
188
189 protected void setFileNameParser(final FileNameParser parser) {
190 this.fileNameParser = parser;
191 }
192 }