From b99feb74c5efe06a1e6e555eb8159afb4a66edcd Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 30 Aug 2012 10:32:50 +0400 Subject: [PATCH] Don't miss Win32FsCache --- .../openapi/vfs/impl/win32/Win32FsCache.java | 9 ++-- .../vfs/impl/win32/Win32LocalFileSystem.java | 44 ++----------------- .../openapi/util/io/FileSystemUtil.java | 11 +---- .../openapi/util/io/win32/FileInfo.java | 44 ++++++++++++------- 4 files changed, 38 insertions(+), 70 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32FsCache.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32FsCache.java index 476ac27df681..578d2e0d830e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32FsCache.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32FsCache.java @@ -61,15 +61,16 @@ class Win32FsCache { List names = new ArrayList(fileInfo.length); Map map = getMap(); for (FileInfo info : fileInfo) { - if (info.name.equals(".")) { + String name = info.getName(); + if (name.equals(".")) { map.put(absolutePath, info); continue; } - if (info.name.equals("..")) { + if (name.equals("..")) { continue; } - map.put(absolutePath + "/" + info.name, info); - names.add(info.name); + map.put(absolutePath + "/" + name, info); + names.add(name); } return ArrayUtil.toStringArray(names); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java index c379a149b4e7..c8353d5c94d5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.vfs.impl.win32; +import com.intellij.openapi.util.io.FileAttributes; import com.intellij.openapi.util.io.win32.FileInfo; import com.intellij.openapi.util.io.win32.IdeaWin32; import com.intellij.openapi.vfs.VirtualFile; @@ -25,9 +26,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Set; -import static com.intellij.util.BitUtil.isSet; -import static com.intellij.util.BitUtil.notSet; - /** * @author Dmitry Avdeev */ @@ -61,45 +59,9 @@ public class Win32LocalFileSystem extends LocalFileSystemBase { } @Override - public boolean exists(@NotNull VirtualFile file) { - if (file.getParent() == null) return true; - return myFsCache.getInfo(file) != null; - } - - @Override - public boolean isDirectory(@NotNull VirtualFile file) { + public FileAttributes getAttributes(@NotNull VirtualFile file) { final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DIRECTORY); - } - - @Override - public boolean isWritable(@NotNull VirtualFile file) { - final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null && notSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_READONLY); - } - - @Override - public boolean isSymLink(@NotNull VirtualFile file) { - final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_REPARSE_POINT); - } - - @Override - public boolean isSpecialFile(@NotNull VirtualFile file) { - final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null && isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DEVICE); - } - - @Override - public long getTimeStamp(@NotNull VirtualFile file) { - final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null ? fileInfo.getTimestamp() : DEFAULT_TIMESTAMP; - } - - @Override - public long getLength(@NotNull VirtualFile file) { - final FileInfo fileInfo = myFsCache.getInfo(file); - return fileInfo != null ? fileInfo.length : DEFAULT_LENGTH; + return fileInfo != null ? fileInfo.toFileAttributes() : null; } @NotNull diff --git a/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java index 7246d2cadc68..182505cb9353 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileSystemUtil.java @@ -365,16 +365,7 @@ public class FileSystemUtil { @Override public FileAttributes getAttributes(@NotNull final String path) throws Exception { final FileInfo fileInfo = myInstance.getInfo(path); - if (fileInfo == null) return null; - if (fileInfo.attributes == FileInfo.BROKEN_SYMLINK) return FileAttributes.BROKEN_SYMLINK; - - final boolean isDirectory = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DIRECTORY); - final boolean isSpecial = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_DEVICE); - final boolean isSymlink = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_REPARSE_POINT); - final boolean isHidden = isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_HIDDEN); - final boolean isWritable = !isSet(fileInfo.attributes, FileInfo.FILE_ATTRIBUTE_READONLY); - final long timestamp = fileInfo.getTimestamp(); - return new FileAttributes(isDirectory, isSpecial, isSymlink, isHidden, fileInfo.length, timestamp, isWritable); + return fileInfo != null ? fileInfo.toFileAttributes() : null; } @Override diff --git a/platform/util/src/com/intellij/openapi/util/io/win32/FileInfo.java b/platform/util/src/com/intellij/openapi/util/io/win32/FileInfo.java index 4c6eee7f22af..b2f54e0c2eef 100644 --- a/platform/util/src/com/intellij/openapi/util/io/win32/FileInfo.java +++ b/platform/util/src/com/intellij/openapi/util/io/win32/FileInfo.java @@ -15,7 +15,10 @@ */ package com.intellij.openapi.util.io.win32; -import org.intellij.lang.annotations.MagicConstant; +import com.intellij.openapi.util.io.FileAttributes; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.util.BitUtil.isSet; /** * Do not use this class directly. @@ -24,25 +27,36 @@ import org.intellij.lang.annotations.MagicConstant; * @since 12.0 */ public class FileInfo { - public static final int BROKEN_SYMLINK = -1; + private static final int BROKEN_SYMLINK = -1; + private static final int FILE_ATTRIBUTE_READONLY = 0x0001; + private static final int FILE_ATTRIBUTE_HIDDEN = 0x0002; + private static final int FILE_ATTRIBUTE_DIRECTORY = 0x0010; + private static final int FILE_ATTRIBUTE_DEVICE = 0x0040; + private static final int FILE_ATTRIBUTE_REPARSE_POINT = 0x0400; // is set only for symlinks - public static final int FILE_ATTRIBUTE_READONLY = 0x0001; - public static final int FILE_ATTRIBUTE_HIDDEN = 0x0002; - public static final int FILE_ATTRIBUTE_DIRECTORY = 0x0010; - public static final int FILE_ATTRIBUTE_DEVICE = 0x0040; - public static final int FILE_ATTRIBUTE_REPARSE_POINT = 0x0400; // is set only for symlinks + private String name; + private int attributes; + private long timestamp; + private long length; - public String name; - @MagicConstant(flagsFromClass = FileInfo.class) - public int attributes; - public long timestamp; - public long length; - - public long getTimestamp() { - return timestamp / 10000 - 11644473600000l; + public String getName() { + return name; } public String toString() { return name; } + + @NotNull + public FileAttributes toFileAttributes() { + if (attributes == BROKEN_SYMLINK) return FileAttributes.BROKEN_SYMLINK; + + final boolean isDirectory = isSet(attributes, FILE_ATTRIBUTE_DIRECTORY); + final boolean isSpecial = isSet(attributes, FILE_ATTRIBUTE_DEVICE); + final boolean isSymlink = isSet(attributes, FILE_ATTRIBUTE_REPARSE_POINT); + final boolean isHidden = isSet(attributes, FILE_ATTRIBUTE_HIDDEN); + final boolean isWritable = !isSet(attributes, FILE_ATTRIBUTE_READONLY); + final long javaTimestamp = timestamp / 10000 - 11644473600000l; + return new FileAttributes(isDirectory, isSpecial, isSymlink, isHidden, length, javaTimestamp, isWritable); + } }