Module jEdit

Class VFS

java.lang.Object
org.gjt.sp.jedit.io.VFS
Direct Known Subclasses:
FavoritesVFS, FileRootsVFS, FileVFS, UrlVFS, VFSAdapter

public abstract class VFS extends Object
A virtual filesystem implementation.

Plugins can provide virtual file systems by defining entries in their services.xml files like so:

<SERVICE CLASS="org.gjt.sp.jedit.io.VFS" NAME="name">
    new MyVFS();
</SERVICE>
URLs of the form name:path will then be handled by the VFS named name.

See ServiceManager for details.

Session objects:

A session is used to persist things like login information, any network sockets, etc. File system implementations that do not need this kind of persistence return a dummy object as a session.

Methods whose names are prefixed with "_" expect to be given a previously-obtained session object. A session must be obtained with this method:

That method should be called from the AWT (EDT) thread, unless the filesystem has NON_AWT_SESSION_CAP capability.

When done, the session must be disposed of using _endVFSSession(Object,Component).

Thread safety:

The following methods cannot be called from an I/O thread: All remaining methods are required to be thread-safe in subclasses.

Implementing a VFS

You can override as many or as few methods as you want. Make sure getCapabilities() returns a value reflecting the functionality implemented by your VFS.
Author:
Slava Pestov, $Id: VFS.java 25330 2020-05-09 14:21:52Z kpouer $
See Also:
  • Field Details

    • READ_CAP

      public static final int READ_CAP
      Read capability.
      Since:
      jEdit 2.6pre2
      See Also:
    • WRITE_CAP

      public static final int WRITE_CAP
      Write capability.
      Since:
      jEdit 2.6pre2
      See Also:
    • BROWSE_CAP

      public static final int BROWSE_CAP
      Browse capability
      Since:
      jEdit 4.3pre11 This was the official API for adding items to a file system browser's Plugins menu in jEdit 4.1 and earlier. In jEdit 4.2, there is a different way of doing this, you must provide a browser.actions.xml file in your plugin JAR, and define plugin.class.browser-menu-item or plugin.class.browser-menu properties. See EditPlugin for details.
      See Also:
    • DELETE_CAP

      public static final int DELETE_CAP
      Delete file capability.
      Since:
      jEdit 2.6pre2
      See Also:
    • RENAME_CAP

      public static final int RENAME_CAP
      Rename file capability.
      Since:
      jEdit 2.6pre2
      See Also:
    • MKDIR_CAP

      public static final int MKDIR_CAP
      Make directory capability.
      Since:
      jEdit 2.6pre2
      See Also:
    • LOW_LATENCY_CAP

      public static final int LOW_LATENCY_CAP
      Low latency capability. If this is not set, then a confirm dialog will be shown before doing a directory search in this VFS.
      Since:
      jEdit 4.1pre1
      See Also:
    • CASE_INSENSITIVE_CAP

      public static final int CASE_INSENSITIVE_CAP
      Case insensitive file system capability.
      Since:
      jEdit 4.1pre1
      See Also:
    • NON_AWT_SESSION_CAP

      public static final int NON_AWT_SESSION_CAP
      Sessions created outside Event Dispatching Thread - file system capability. Set for the file system that does not require that createVFSSession is called on edt. All systems that do not implement createVFSSession should set it, but others may too.
      Since:
      jEdit 5.0pre1
      See Also:
    • EA_TYPE

      public static final String EA_TYPE
      File type.
      Since:
      jEdit 4.2pre1
      See Also:
    • EA_STATUS

      public static final String EA_STATUS
      File status (read only, read write, etc).
      Since:
      jEdit 4.2pre1
      See Also:
    • EA_SIZE

      public static final String EA_SIZE
      File size.
      Since:
      jEdit 4.2pre1
      See Also:
    • EA_MODIFIED

      public static final String EA_MODIFIED
      File last modified date.
      Since:
      jEdit 4.2pre1
      See Also:
    • IOBUFSIZE

      public static final int IOBUFSIZE
      See Also:
  • Constructor Details

    • VFS

      protected VFS(String name, int caps)
      Creates a new virtual filesystem.
      Parameters:
      name - The name
      caps - The capabilities
    • VFS

      protected VFS(String name, int caps, String[] extAttrs)
      Creates a new virtual filesystem.
      Parameters:
      name - The name
      caps - The capabilities
      extAttrs - The extended attributes
      Since:
      jEdit 4.2pre1
  • Method Details

    • getName

      public String getName()
      Returns this VFS's name. The name is used to obtain the label stored in the vfs.name.label property.
    • getCapabilities

      public int getCapabilities()
      Returns the capabilities of this VFS.
      Since:
      jEdit 2.6pre2
    • isMarkersFileSupported

      public boolean isMarkersFileSupported()
      Returns if an additional markers file can be saved by this VFS. Default is true.
      Since:
      jEdit 4.3pre10
    • getExtendedAttributes

      public String[] getExtendedAttributes()
      Returns the extended attributes supported by this VFS.
      Since:
      jEdit 4.2pre1
    • getFileName

      public String getFileName(String path)
      Returns the file name component of the specified path.
      Parameters:
      path - The path
      Since:
      jEdit 3.1pre4
    • getFilePath

      public String getFilePath(String vfsPath)
      Returns the path component of the specified VFS path. The standard implementation cuts off the protocol and the protocol separator character and then delegates to eventually present sub-VFS-paths present in the VFS path like "jode:archive:/test.zip!/test.txt".

      If a VFS implementation can have additional information in the VFS path like username / password / host / port for FTP VFS or archive filename for archive VFS, this method should be overridden to remove those information also. The easiest would be to remove those additional information and then delegate to super.getFilePath().

      Parameters:
      vfsPath - The VFS path
      Since:
      jEdit 4.5pre1
    • getParentOfPath

      @Nonnull public String getParentOfPath(String path)
      Returns the parent of the specified path. This must be overridden to return a non-null value for browsing of this filesystem to work.
      Parameters:
      path - The path
      Since:
      jEdit 2.6pre5
    • constructPath

      public String constructPath(String parent, String path)
      Constructs a path from the specified directory and file name component. This must be overridden to return a non-null value, otherwise browsing this filesystem will not work.

      Unless you are writing a VFS, this method should not be called directly. To ensure correct behavior, you must call MiscUtilities.constructPath(String,String) instead.

      Parameters:
      parent - The parent directory
      path - The path
      Since:
      jEdit 2.6pre2
    • getFileSeparator

      public char getFileSeparator()
      Returns the file separator used by this VFS.
      Since:
      jEdit 2.6pre9
    • getTwoStageSaveName

      @Nullable public String getTwoStageSaveName(String path)
      Returns a temporary file name based on the given path. By default jEdit first saves a file to #name#save# and then renames it to the original file. However some virtual file systems might not support the # character in filenames, so this method permits the VFS to override this behavior. If this method returns null, two stage save will not be used for that particular file (introduced in jEdit 4.3pre1).
      Parameters:
      path - The path name
      Since:
      jEdit 4.1pre7
    • reloadDirectory

      public void reloadDirectory(String path)
      Called before a directory is reloaded by the file system browser. Can be used to flush a cache, etc.
      Since:
      jEdit 4.0pre3
    • createVFSSession

      public Object createVFSSession(String path, Component comp)
      Creates a VFS session. This method is called from the AWT thread, so it should not do any I/O. It could, however, prompt for a login name and password, for example. A simpler filesystem may set the NON_AWT_SESSION_CAP capability. When set, sessions may be obtained from any thread.
      Parameters:
      path - The path in question
      comp - The component that will parent any dialog boxes shown
      Returns:
      The session. The session can be null if there were errors
      Since:
      jEdit 2.6pre3
    • createVFSSessionSafe

      public Object createVFSSessionSafe(String path, Component comp)
      Same as createVFSSession(java.lang.String, java.awt.Component), but may be called from any thread. It first checks the NON_AWT_SESSION_CAP capability and enters EDT thread if necessary.
    • load

      public boolean load(View view, Buffer buffer, String path, boolean untitled)
      Loads the specified buffer. The default implementation posts an I/O request to the I/O thread.
      Parameters:
      view - The view
      buffer - The buffer
      path - The path
      untitled - is the buffer untitled
    • save

      public boolean save(View view, Buffer buffer, String path)
      Saves the specifies buffer. The default implementation posts an I/O request to the I/O thread.
      Parameters:
      view - The view
      buffer - The buffer
      path - The path
    • copy

      public static boolean copy(ProgressObserver progress, VFS sourceVFS, Object sourceSession, String sourcePath, VFS targetVFS, Object targetSession, String targetPath, Component comp, boolean canStop) throws IOException
      Copy a file to another using VFS.
      Parameters:
      progress - the progress observer. It could be null if you don't want to monitor progress. If not null you should probably launch this command in a WorkThread
      sourceVFS - the source VFS
      sourceSession - the VFS session
      sourcePath - the source path. It must be a file and must exists
      targetVFS - the target VFS
      targetSession - the target session
      targetPath - the target path. If it is a path, it must exists, if it is a file, the parent must exists
      comp - The component that will parent error dialog boxes
      canStop - could this copy be stopped ?
      Returns:
      true if the copy was successful
      Throws:
      IOException - IOException If an I/O error occurs
      Since:
      jEdit 4.3pre3
    • copy

      public static boolean copy(ProgressObserver progress, VFS sourceVFS, Object sourceSession, String sourcePath, VFS targetVFS, Object targetSession, String targetPath, Component comp, boolean canStop, boolean sendVFSUpdate) throws IOException
      Copy a file to another using VFS.
      Parameters:
      progress - the progress observer. It could be null if you don't want to monitor progress. If not null you should probably launch this command in a WorkThread
      sourceVFS - the source VFS
      sourceSession - the VFS session
      sourcePath - the source path. It must be a file and must exists
      targetVFS - the target VFS
      targetSession - the target session
      targetPath - the target path. If it is a path, it must exists, if it is a file, the parent must exists
      comp - The component that will parent error dialog boxes
      canStop - could this copy be stopped ?
      sendVFSUpdate - true if you want to send a VFS update after the copy. False otherwise (if you do a lot of copy)
      Returns:
      true if the copy was successful
      Throws:
      IOException - IOException If an I/O error occurs
      Since:
      jEdit 5.0
    • copy

      public static boolean copy(ProgressObserver progress, String sourcePath, String targetPath, Component comp, boolean canStop, boolean sendVFSUpdate) throws IOException
      Copy a file to another using VFS.
      Parameters:
      progress - the progress observer. It could be null if you don't want to monitor progress. If not null you should probably launch this command in a WorkThread
      sourcePath - the source path
      targetPath - the target path
      comp - The component that will parent error dialog boxes
      canStop - if true the copy can be stopped
      sendVFSUpdate - true if you want to send a VFS update after the copy. False otherwise (if you do a lot of copy)
      Returns:
      true if the copy was successful
      Throws:
      IOException - IOException If an I/O error occurs
      Since:
      jEdit 5.0
    • copy

      public static boolean copy(ProgressObserver progress, String sourcePath, String targetPath, Component comp, boolean canStop) throws IOException
      Copy a file to another using VFS.
      Parameters:
      progress - the progress observer. It could be null if you don't want to monitor progress. If not null you should probably launch this command in a WorkThread
      sourcePath - the source path
      targetPath - the target path
      comp - The component that will parent error dialog boxes
      canStop - if true the copy can be stopped
      Returns:
      true if the copy was successful
      Throws:
      IOException - IOException If an I/O error occurs
      Since:
      jEdit 4.3pre3
    • insert

      public boolean insert(View view, Buffer buffer, String path)
      Inserts a file into the specified buffer. The default implementation posts an I/O request to the I/O thread.
      Parameters:
      view - The view
      buffer - The buffer
      path - The path
    • _canonPath

      public String _canonPath(Object session, String path, Component comp) throws IOException
      Returns the canonical form of the specified path name. For example, ~ might be expanded to the user's home directory.
      Parameters:
      session - The session
      path - The path
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.0pre2
    • _listDirectory

      public String[] _listDirectory(Object session, String directory, String glob, boolean recursive, Component comp) throws IOException
      A convenience method that matches file names against globs, and can optionally list the directory recursively.
      Parameters:
      session - The session
      directory - The directory. Note that this must be a full URL, including the host name, path name, and so on. The username and password (if needed by the VFS) is obtained from the session instance.
      glob - Only file names matching this glob will be returned
      recursive - If true, subdirectories will also be listed.
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.1pre1
    • _listDirectory

      public String[] _listDirectory(Object session, String directory, String glob, boolean recursive, Component comp, boolean skipBinary, boolean skipHidden) throws IOException
      A convenience method that matches file names against globs, and can optionally list the directory recursively.
      Parameters:
      session - The session
      directory - The directory. Note that this must be a full URL, including the host name, path name, and so on. The username and password (if needed by the VFS) is obtained from the session instance.
      glob - Only file names matching this glob will be returned
      recursive - If true, subdirectories will also be listed.
      comp - The component that will parent error dialog boxes
      skipBinary - ignore binary files (do not return them). This will slow down the process since it will open the files
      skipHidden - skips hidden files, directories, and backup files. Ignores any file beginning with . or #, or ending with ~ or .bak
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.3pre5
    • _listDirectory

      public String[] _listDirectory(Object session, String directory, VFSFileFilter filter, boolean recursive, Component comp, boolean skipBinary, boolean skipHidden) throws IOException
      A convenience method that filters the directory listing according to a filter, and can optionally list the directory recursively.
      Parameters:
      session - The session
      directory - The directory. Note that this must be a full URL, including the host name, path name, and so on. The username and password (if needed by the VFS) is obtained from the session instance.
      filter - The VFSFileFilter to use for filtering.
      recursive - If true, subdirectories will also be listed.
      comp - The component that will parent error dialog boxes
      skipBinary - ignore binary files (do not return them). This will slow down the process since it will open the files
      skipHidden - skips hidden files, directories, and backup files. Ignores any file beginning with . or #, or ending with ~ or .bak
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.3pre7
    • _listFiles

      public VFSFile[] _listFiles(Object session, String directory, Component comp) throws IOException
      Lists the specified directory.
      Parameters:
      session - The session
      directory - The directory. Note that this must be a full URL, including the host name, path name, and so on. The username and password (if needed by the VFS) is obtained from the session instance.
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.3pre2
    • _getFile

      @Nullable public VFSFile _getFile(Object session, String path, Component comp) throws IOException
      Returns the specified directory entry.
      Parameters:
      session - The session get it with createVFSSession(String, Component)
      path - The path
      comp - The component that will parent error dialog boxes
      Returns:
      The specified directory entry, or null if it doesn't exist.
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 4.3pre2
    • _delete

      public boolean _delete(Object session, String path, Component comp) throws IOException
      Deletes the specified URL.
      Parameters:
      session - The VFS session
      path - The path
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurs
      Since:
      jEdit 2.7pre1
    • _rename

      public boolean _rename(Object session, String from, String to, Component comp) throws IOException
      Renames the specified URL. Some filesystems might support moving URLs between directories, however others may not. Do not rely on this behavior.
      Parameters:
      session - The VFS session
      from - The old path
      to - The new path
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurs
      Since:
      jEdit 2.7pre1
    • _mkdir

      public boolean _mkdir(Object session, String directory, Component comp) throws IOException
      Creates a new directory with the specified URL.
      Parameters:
      session - The VFS session
      directory - The directory
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurs
      Since:
      jEdit 2.7pre1
    • _backup

      public void _backup(Object session, String path, Component comp) throws IOException
      Backs up the specified file. Default implementation in 5.0pre1 copies the file to the backup directory. Before 5.0pre1 it was empty.
      Parameters:
      session - The VFS session
      path - The path
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurs
      Since:
      jEdit 3.2pre2
    • _createInputStream

      public InputStream _createInputStream(Object session, String path, boolean ignoreErrors, Component comp) throws IOException
      Creates an input stream. This method is called from the I/O thread.
      Parameters:
      session - the VFS session
      path - The path
      ignoreErrors - If true, file not found errors should be ignored
      comp - The component that will parent error dialog boxes
      Returns:
      an inputstream or null if there was a problem
      Throws:
      IOException - If an I/O error occurs
      Since:
      jEdit 2.7pre1
    • _createOutputStream

      public OutputStream _createOutputStream(Object session, String path, Component comp) throws IOException
      Creates an output stream. This method is called from the I/O thread.
      Parameters:
      session - the VFS session
      path - The path
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - If an I/O error occurs
      Since:
      jEdit 2.7pre1
    • _saveComplete

      public void _saveComplete(Object session, Buffer buffer, String path, Component comp) throws IOException
      Called after a file has been saved.
      Parameters:
      session - The VFS session
      buffer - The buffer
      path - The path the buffer was saved to (can be different from Buffer.getPath() if the user invoked the Save a Copy As command, for example).
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - If an I/O error occurs
      Since:
      jEdit 4.1pre9
    • _finishTwoStageSave

      public void _finishTwoStageSave(Object session, Buffer buffer, String path, Component comp) throws IOException
      Called after a file has been saved and we use twoStageSave (first saving to another file). This should re-apply permissions for example.
      Parameters:
      session - The VFS session
      buffer - The buffer
      path - The path the buffer was saved to (can be different from Buffer.getPath() if the user invoked the Save a Copy As command, for example).
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - If an I/O error occurs
      Since:
      jEdit 4.3pre4
    • _endVFSSession

      public void _endVFSSession(Object session, Component comp) throws IOException
      Finishes the specified VFS session. This must be called after all I/O with this VFS is complete, to avoid leaving stale network connections and such.
      Parameters:
      session - The VFS session
      comp - The component that will parent error dialog boxes
      Throws:
      IOException - if an I/O error occurred
      Since:
      jEdit 2.7pre1
    • getDefaultColorFor

      public static Color getDefaultColorFor(String name)
      Returns color of the specified file name, by matching it against user-specified regular expressions.
      Since:
      jEdit 4.0pre1
    • getDefaultEncoding

      public String getDefaultEncoding(String path)
    • setEncoding

      public void setEncoding(String path, String encoding)