private void executeDelete(@NotNull VirtualFile file) { if (!file.exists()) { LOG.error("Deleting a file, which does not exist: " + file.getPath()); return; } clearIdCache(); int id = getFileId(file); final VirtualFile parent = file.getParent(); final int parentId = parent == null ? 0 : getFileId(parent); if (parentId == 0) { String rootUrl = normalizeRootUrl(file.getPath(), (NewVirtualFileSystem) file.getFileSystem()); myRootsLock.writeLock().lock(); try { myRoots.remove(rootUrl); myRootsById.remove(id); FSRecords.deleteRootRecord(id); } finally { myRootsLock.writeLock().unlock(); } } else { removeIdFromParentList(parentId, id, parent, file); VirtualDirectoryImpl directory = (VirtualDirectoryImpl) file.getParent(); assert directory != null : file; directory.removeChild(file); } FSRecords.deleteRecordRecursively(id); invalidateSubtree(file); }
/** * Gets the common ancestor for passed files, or null if the files do not have common ancestors. * * @param file1 fist file * @param file2 second file * @return common ancestor for the passed files. Returns <code>null</code> if the files do not * have common ancestor */ @Nullable public static VirtualFile getCommonAncestor( @NotNull VirtualFile file1, @NotNull VirtualFile file2) { if (!file1.getFileSystem().equals(file2.getFileSystem())) { return null; } VirtualFile[] path1 = getPathComponents(file1); VirtualFile[] path2 = getPathComponents(file2); int lastEqualIdx = -1; for (int i = 0; i < path1.length && i < path2.length; i++) { if (path1[i].equals(path2[i])) { lastEqualIdx = i; } else { break; } } return lastEqualIdx == -1 ? null : path1[lastEqualIdx]; }
@NotNull private static NewVirtualFileSystem getDelegate(@NotNull VirtualFile file) { return (NewVirtualFileSystem) file.getFileSystem(); }