1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.vfs2; 18 19 import java.io.File; 20 import java.lang.reflect.Constructor; 21 import java.net.URI; 22 import java.net.URL; 23 import java.net.URLStreamHandlerFactory; 24 import java.nio.file.Path; 25 import java.util.Collection; 26 27 import org.apache.commons.logging.Log; 28 import org.apache.commons.vfs2.operations.FileOperationProvider; 29 30 /** 31 * A FileSystemManager manages a set of file systems. This interface is used to locate a {@link FileObject} by name from 32 * one of those file systems. 33 * <p> 34 * To locate a {@link FileObject}, use one of the {@code resolveFile()} methods. 35 * </p> 36 * 37 * <h2><a id="naming">File Naming</a></h2> 38 * <p> 39 * A file system manager can recognize several types of file names: 40 * </p> 41 * <ul> 42 * <li>Absolute URI. These must start with a scheme, such as {@code file:} or {@code ftp:}, followed by a scheme 43 * dependent file name. Some examples: {@code file:/c:/somefile} or {@code ftp://somewhere.org/somefile}.</li> 44 * <li>Absolute local file name. For example, {@code /home/someuser/a-file} or {@code c:\dir\somefile.html}. Elements in 45 * the name can be separated using any of the following characters: {@code /}, {@code \}, or the native file separator 46 * character. For example, the following file names are the same: {@code c:\somedir\somefile.xml} and 47 * {@code c:/somedir/somefile.xml}.</li> 48 * <li>Relative path. For example: {@code ../somefile} or {@code somedir/file.txt}. The file system manager resolves 49 * relative paths against its <em>base file</em>. Elements in the relative path can be separated using {@code /}, 50 * {@code \}, or file system specific separator characters. Relative paths may also contain {@code ..} and {@code .} 51 * elements. See {@link FileObject#resolveFile} for more details.</li> 52 * </ul> 53 */ 54 public interface FileSystemManager extends AutoCloseable { 55 56 /** 57 * Adds the specified FileOperationProvider for the specified scheme. 58 * <p> 59 * Several FileOperationProvider's might be registered for the same scheme. For example, for {@code "file"} scheme 60 * we can register {@code SvnWsOperationProvider} and {@code CvsOperationProvider.} 61 * </p> 62 * 63 * @param scheme The scheme associated with this provider. 64 * @param operationProvider The FileOperationProvider to add. 65 * @throws FileSystemException if an error occurs. 66 */ 67 void addOperationProvider(String scheme, FileOperationProvider operationProvider) throws FileSystemException; 68 69 /** 70 * Adds an operation provider. 71 * 72 * @see FileSystemManager#addOperationProvider(String, org.apache.commons.vfs2.operations.FileOperationProvider) 73 * @param schemes The schemes that will be associated with the provider. 74 * @param operationProvider The FileOperationProvider to add. 75 * @throws FileSystemException if an error occurs. 76 */ 77 void addOperationProvider(String[] schemes, FileOperationProvider operationProvider) throws FileSystemException; 78 79 /** 80 * Determines if a layered file system can be created for a given file. 81 * 82 * @param file The file to check for. 83 * @return true if the FileSystem can be created. 84 * @throws FileSystemException if an error occurs. 85 */ 86 boolean canCreateFileSystem(FileObject file) throws FileSystemException; 87 88 /** 89 * Closes this file system manager. 90 * 91 * @since 2.5.0 92 */ 93 @Override 94 default void close() { 95 // noop 96 } 97 98 /** 99 * Closes the given file system. 100 * <p> 101 * If you use VFS as singleton it is VERY dangerous to call this method. 102 * </p> 103 * 104 * @param fileSystem The FileSystem to close. 105 */ 106 void closeFileSystem(FileSystem fileSystem); 107 108 /** 109 * Creates a layered file system. A layered file system is a file system that is created from the contents of a 110 * file, such as a ZIP or tar file. 111 * 112 * @param file The file to use to create the file system. 113 * @return The root file of the new file system. 114 * @throws FileSystemException On error creating the file system. 115 */ 116 FileObject createFileSystem(FileObject file) throws FileSystemException; 117 118 /** 119 * Creates a layered file system. A layered file system is a file system that is created from the contents of a 120 * file, such as a ZIP or tar file. 121 * 122 * @param provider The name of the file system provider to use. This name is the same as the scheme used in URI to 123 * identify the provider. 124 * @param file The file to use to create the file system. 125 * @return The root file of the new file system. 126 * @throws FileSystemException On error creating the file system. 127 */ 128 FileObject createFileSystem(String provider, FileObject file) throws FileSystemException; 129 130 /** 131 * Creates a virtual file system. The file system will contain a junction at the fs root to the supplied root file. 132 * 133 * @param rootFile The root file to backs the file system. 134 * @return The root of the new file system. 135 * @throws FileSystemException if an error occurs creating the VirtualFileSystem. 136 */ 137 FileObject createVirtualFileSystem(FileObject rootFile) throws FileSystemException; 138 139 /** 140 * Creates an empty virtual file system. Can be populated by adding junctions to it. 141 * 142 * @param rootUri The root URI to use for the new file system. Can be null. 143 * @return The root file of the new file system. 144 * @throws FileSystemException if an error occurs creating the VirtualFileSystem. 145 */ 146 FileObject createVirtualFileSystem(String rootUri) throws FileSystemException; 147 148 /** 149 * Returns the base file used to resolve relative paths. 150 * 151 * @return The base FileObject. 152 * @throws FileSystemException if an error occurs. 153 */ 154 FileObject getBaseFile() throws FileSystemException; 155 156 /** 157 * Gets the cache strategy used. 158 * 159 * @return the CacheStrategy. 160 */ 161 CacheStrategy getCacheStrategy(); 162 163 /** 164 * Gets the class to use to determine the content-type (mime-type). 165 * 166 * @return the FileContentInfoFactory. 167 */ 168 FileContentInfoFactory getFileContentInfoFactory(); 169 170 /** 171 * Gets the file object decorator used. 172 * 173 * @return the file object decorator Class. 174 */ 175 Class<?> getFileObjectDecorator(); 176 177 /** 178 * Gets the constructor associated to the fileObjectDecorator. We cache it here for performance reasons. 179 * 180 * @return the Constructor associated with the FileObjectDecorator. 181 */ 182 Constructor<?> getFileObjectDecoratorConst(); 183 184 /** 185 * Gets the cache used to cache file objects. 186 * 187 * @return The FilesCache. 188 */ 189 FilesCache getFilesCache(); 190 191 /** 192 * Gets the configuration builder for the given scheme. 193 * 194 * @param scheme The scheme to use to obtain the FileSystemConfigBuilder. 195 * @return A FileSystemConfigBuilder appropriate for the given scheme. 196 * @throws FileSystemException if the given scheme is not known. 197 */ 198 FileSystemConfigBuilder getFileSystemConfigBuilder(String scheme) throws FileSystemException; 199 200 /** 201 * Gets Providers for file operations. 202 * 203 * @param scheme the scheme for which we want to get the list af registered providers. 204 * @return the registered FileOperationProviders for the specified scheme. If there were no providers registered for 205 * the scheme, it returns null. 206 * 207 * @throws FileSystemException if an error occurs. 208 */ 209 FileOperationProvider[] getOperationProviders(String scheme) throws FileSystemException; 210 211 /** 212 * Gets the capabilities for a given scheme. 213 * 214 * @param scheme The scheme to use to locate the provider's capabilities. 215 * @return A Collection of the various capabilities. 216 * @throws FileSystemException if the given scheme is not known. 217 */ 218 Collection<Capability> getProviderCapabilities(String scheme) throws FileSystemException; 219 220 /** 221 * Gets the schemes currently available. 222 * 223 * @return An array of available scheme names that are supported. 224 */ 225 String[] getSchemes(); 226 227 /** 228 * Returns a stream handler factory to enable URL lookup using this FileSystemManager. 229 * 230 * @return the URLStreamHandlerFactory. 231 */ 232 URLStreamHandlerFactory getURLStreamHandlerFactory(); 233 234 /** 235 * Returns true if this manager has a provider for a particular scheme. 236 * 237 * @param scheme The scheme for which a provider should be checked. 238 * @return true if a provider for the scheme is available. 239 */ 240 boolean hasProvider(String scheme); 241 242 /** 243 * Locates a file by name. See {@link #resolveFile(FileObject, String)} for details. 244 * 245 * @param baseFile The base file to use to resolve relative paths. Must not be {@code null}, not even if the 246 * <em>name</em> is absolute. 247 * @param name The name of the file. 248 * @return The file. Never returns null. 249 * @throws FileSystemException On error parsing the file name. 250 */ 251 FileObject resolveFile(File baseFile, String name) throws FileSystemException; 252 253 /** 254 * Locates a file by name. The name is resolved as described <a href="#naming">above</a>. That is, the name can be 255 * either an absolute URI, an absolute file name, or a relative path to be resolved against {@code baseFile}. 256 * <p> 257 * Note that the file does not have to exist when this method is called. 258 * </p> 259 * 260 * @param baseFile The base file to use to resolve relative paths. May be null if the name is an absolute file name. 261 * @param name The name of the file. 262 * @return The file. Never returns null. 263 * @throws FileSystemException On error parsing the file name. 264 */ 265 FileObject resolveFile(FileObject baseFile, String name) throws FileSystemException; 266 267 /** 268 * Locates a file by name. Equivalent to calling {@code resolveFile(getBaseFile(), name)}. 269 * 270 * @param name The name of the file. 271 * @return The file. Never returns null. 272 * @throws FileSystemException On error parsing the file name. 273 */ 274 FileObject resolveFile(String name) throws FileSystemException; 275 276 /** 277 * Locates a file by name. Equivalent to calling {@code resolveFile(getBaseFile(), name)}. 278 * 279 * @param name The name of the file. 280 * @param fileSystemOptions The FileSystemOptions used for FileSystem creation. All files that are later resolved 281 * relative to the returned {@code FileObject} share the options. 282 * @return The file. Never returns null. 283 * @throws FileSystemException On error parsing the file name. 284 */ 285 FileObject resolveFile(String name, FileSystemOptions fileSystemOptions) throws FileSystemException; 286 287 /** 288 * Resolves a URI into a {@link FileObject}. 289 * 290 * @param uri The URI to convert. 291 * @return The {@link FileObject} that represents the URI. Never returns null. 292 * @throws FileSystemException On error converting the file. 293 * @since 2.1 294 */ 295 FileObject resolveFile(URI uri) throws FileSystemException; 296 297 /** 298 * Resolves a URL into a {@link FileObject}. 299 * 300 * @param url The URL to convert. 301 * @return The {@link FileObject} that represents the URL. Never returns null. 302 * @throws FileSystemException On error converting the file. 303 * @since 2.1 304 */ 305 FileObject resolveFile(URL url) throws FileSystemException; 306 307 /** 308 * Resolves a name, relative to this file name. Equivalent to calling 309 * {@code resolveName( path, NameScope.FILE_SYSTEM )}. 310 * 311 * @param root the base file name 312 * @param name The name to resolve. 313 * @return A {@link FileName} object representing the resolved file name. 314 * @throws FileSystemException If the name is invalid. 315 */ 316 FileName resolveName(FileName root, String name) throws FileSystemException; 317 318 /** 319 * Resolves a name, relative to the "root" file name. Refer to {@link NameScope} for a description of how names are 320 * resolved. 321 * 322 * @param root the base file name 323 * @param name The name to resolve. 324 * @param scope The {@link NameScope} to use when resolving the name. 325 * @return A {@link FileName} object representing the resolved file name. 326 * @throws FileSystemException If the name is invalid. 327 */ 328 FileName resolveName(FileName root, String name, NameScope scope) throws FileSystemException; 329 330 /** 331 * Resolves the URI to a file name. 332 * 333 * @param uri The URI to resolve. 334 * @return A FileName that matches the URI. 335 * @throws FileSystemException if this is not possible. 336 */ 337 FileName resolveURI(String uri) throws FileSystemException; 338 339 /** 340 * Sets the logger to use. 341 * 342 * @param log The logger to use. 343 */ 344 void setLogger(Log log); 345 346 /** 347 * Converts a local file into a {@link FileObject}. 348 * 349 * @param file The file to convert. 350 * @return The {@link FileObject} that represents the local file. Never returns null. 351 * @throws FileSystemException On error converting the file. 352 */ 353 FileObject toFileObject(File file) throws FileSystemException; 354 355 /** 356 * Converts a local path into a {@link FileObject}. 357 * 358 * @param path The path to convert. 359 * @return The {@link FileObject} that represents the local file. Never returns null. 360 * @throws FileSystemException On error converting the file. 361 * @since 2.10.0 362 */ 363 default FileObject toFileObject(final Path path) throws FileSystemException { 364 return toFileObject(path.toFile()); 365 } 366 367 }