diff options
Diffstat (limited to 'openjdk/sun/nio/fs/NetFileSystemProvider.java')
-rw-r--r-- | openjdk/sun/nio/fs/NetFileSystemProvider.java | 1424 |
1 files changed, 0 insertions, 1424 deletions
diff --git a/openjdk/sun/nio/fs/NetFileSystemProvider.java b/openjdk/sun/nio/fs/NetFileSystemProvider.java deleted file mode 100644 index 1f112199..00000000 --- a/openjdk/sun/nio/fs/NetFileSystemProvider.java +++ /dev/null @@ -1,1424 +0,0 @@ -/* - Copyright (C) 2011 Jeroen Frijters - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jeroen Frijters - jeroen@frijters.net - -*/ - -package sun.nio.fs; - -import ikvm.internal.NotYetImplementedError; -import static ikvm.internal.Util.WINDOWS; -import cli.System.IO.Directory; -import cli.System.IO.DirectoryInfo; -import cli.System.IO.DriveInfo; -import cli.System.IO.File; -import cli.System.IO.FileAttributes; -import cli.System.IO.FileInfo; -import cli.System.IO.FileMode; -import cli.System.IO.FileShare; -import cli.System.IO.FileStream; -import cli.System.IO.FileOptions; -import cli.System.Security.AccessControl.FileSystemRights; -import com.sun.nio.file.ExtendedOpenOption; -import java.io.FileDescriptor; -import java.io.IOException; -import java.net.URI; -import java.nio.channels.*; -import java.nio.file.*; -import java.nio.file.attribute.*; -import java.nio.file.spi.FileSystemProvider; -import java.util.concurrent.ExecutorService; -import java.util.Iterator; -import java.util.HashMap; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; -import sun.nio.ch.WindowsAsynchronousFileChannelImpl; -import sun.nio.ch.FileChannelImpl; -import sun.nio.ch.ThreadPool; - -final class NetFileSystemProvider extends AbstractFileSystemProvider -{ - private final NetFileSystem fs = new NetFileSystem(this); - private final HashMap<String, FileStore> stores = new HashMap<String, FileStore>(); - - final synchronized FileStore getFileStore(DriveInfo drive) throws IOException - { - String name = drive.get_Name().toLowerCase(); - FileStore fs = stores.get(name); - if (fs == null) - { - fs = new NetFileStore(drive); - stores.put(name, fs); - } - return fs; - } - - public String getScheme() - { - return "file"; - } - - public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException - { - throw new FileSystemAlreadyExistsException(); - } - - public FileSystem getFileSystem(URI uri) - { - return fs; - } - - public Path getPath(URI uri) - { - if (WINDOWS) - { - return WindowsUriSupport.fromUri(fs, uri); - } - else - { - return UnixUriUtils.fromUri(fs, uri); - } - } - - public AsynchronousFileChannel newAsynchronousFileChannel(Path path, Set<? extends OpenOption> opts, ExecutorService executor, FileAttribute<?>... attrs) throws IOException - { - NetPath npath = NetPath.from(path); - for (FileAttribute<?> attr : attrs) - { - // null check - attr.getClass(); - throw new NotYetImplementedError(); - } - int mode = FileMode.Open; - int share = FileShare.ReadWrite | FileShare.Delete; - int options = FileOptions.Asynchronous; - boolean read = false; - boolean write = false; - boolean truncate = false; - for (OpenOption opt : opts) - { - if (opt instanceof StandardOpenOption) - { - switch ((StandardOpenOption)opt) - { - case CREATE: - mode = FileMode.Create; - break; - case CREATE_NEW: - mode = FileMode.CreateNew; - break; - case DELETE_ON_CLOSE: - options |= FileOptions.DeleteOnClose; - break; - case DSYNC: - options |= FileOptions.WriteThrough; - break; - case READ: - read = true; - break; - case SPARSE: - break; - case SYNC: - options |= FileOptions.WriteThrough; - break; - case TRUNCATE_EXISTING: - truncate = true; - break; - case WRITE: - write = true; - break; - default: - throw new UnsupportedOperationException(); - } - } - else if (opt instanceof ExtendedOpenOption) - { - switch ((ExtendedOpenOption)opt) - { - case NOSHARE_READ: - share &= ~FileShare.Read; - break; - case NOSHARE_WRITE: - share &= ~FileShare.Write; - break; - case NOSHARE_DELETE: - share &= ~FileShare.Delete; - break; - default: - throw new UnsupportedOperationException(); - } - } - else - { - // null check - opt.getClass(); - throw new UnsupportedOperationException(); - } - } - - if (!read && !write) - { - read = true; - } - - if (truncate) - { - if (mode == FileMode.Open) - { - mode = FileMode.Truncate; - } - } - - int rights = 0; - if (read) - { - rights |= FileSystemRights.Read; - } - if (write) - { - rights |= FileSystemRights.Write; - } - - ThreadPool pool; - if (executor == null) - { - pool = null; - } - else - { - pool = ThreadPool.wrap(executor, 0); - } - - return WindowsAsynchronousFileChannelImpl.open(open(npath.path, mode, rights, share, options), read, write, pool); - } - - public SeekableByteChannel newByteChannel(Path path, Set<? extends OpenOption> opts, FileAttribute<?>... attrs) throws IOException - { - return newFileChannel(path, opts, attrs); - } - - public FileChannel newFileChannel(Path path, Set<? extends OpenOption> opts, FileAttribute<?>... attrs) throws IOException - { - NetPath npath = NetPath.from(path); - for (FileAttribute<?> attr : attrs) - { - // null check - attr.getClass(); - throw new NotYetImplementedError(); - } - int mode = FileMode.Open; - int share = FileShare.ReadWrite | FileShare.Delete; - int options = FileOptions.None; - boolean read = false; - boolean write = false; - boolean append = false; - boolean truncate = false; - for (OpenOption opt : opts) - { - if (opt instanceof StandardOpenOption) - { - switch ((StandardOpenOption)opt) - { - case APPEND: - append = true; - write = true; - mode = FileMode.Append; - break; - case CREATE: - mode = FileMode.Create; - break; - case CREATE_NEW: - mode = FileMode.CreateNew; - break; - case DELETE_ON_CLOSE: - options |= FileOptions.DeleteOnClose; - break; - case DSYNC: - options |= FileOptions.WriteThrough; - break; - case READ: - read = true; - break; - case SPARSE: - break; - case SYNC: - options |= FileOptions.WriteThrough; - break; - case TRUNCATE_EXISTING: - truncate = true; - break; - case WRITE: - write = true; - break; - default: - throw new UnsupportedOperationException(); - } - } - else if (opt instanceof ExtendedOpenOption) - { - switch ((ExtendedOpenOption)opt) - { - case NOSHARE_READ: - share &= ~FileShare.Read; - break; - case NOSHARE_WRITE: - share &= ~FileShare.Write; - break; - case NOSHARE_DELETE: - share &= ~FileShare.Delete; - break; - default: - throw new UnsupportedOperationException(); - } - } - else - { - // null check - opt.getClass(); - throw new UnsupportedOperationException(); - } - } - - if (!read && !write) - { - read = true; - } - - if (read && append) - { - throw new IllegalArgumentException("READ + APPEND not allowed"); - } - - if (truncate) - { - if (append) - { - throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); - } - if (mode == FileMode.Open) - { - mode = FileMode.Truncate; - } - } - - int rights = 0; - if (append) - { - // for atomic append to work, we can't set FileSystemRights.Write - rights |= FileSystemRights.AppendData; - } - else - { - if (read) - { - rights |= FileSystemRights.Read; - } - if (write) - { - rights |= FileSystemRights.Write; - } - } - - return FileChannelImpl.open(open(npath.path, mode, rights, share, options), read, write, append, null); - } - - private static FileDescriptor open(String path, int mode, int rights, int share, int options) throws IOException - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - if ((rights & FileSystemRights.Read) != 0) - { - sm.checkRead(path); - } - if ((rights & (FileSystemRights.Write | FileSystemRights.AppendData)) != 0) - { - sm.checkWrite(path); - } - if ((options & FileOptions.DeleteOnClose) != 0) - { - sm.checkDelete(path); - } - } - - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.PlatformNotSupportedException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - return FileDescriptor.fromStream(new FileStream(path, FileMode.wrap(mode), FileSystemRights.wrap(rights), FileShare.wrap(share), 8, FileOptions.wrap(options))); - } - catch (cli.System.ArgumentException x) - { - throw new FileSystemException(path, null, x.getMessage()); - } - catch (cli.System.IO.FileNotFoundException _) - { - throw new NoSuchFileException(path); - } - catch (cli.System.IO.DirectoryNotFoundException _) - { - throw new NoSuchFileException(path); - } - catch (cli.System.PlatformNotSupportedException x) - { - throw new UnsupportedOperationException(x.getMessage()); - } - catch (cli.System.IO.IOException x) - { - if (mode == FileMode.CreateNew && File.Exists(path)) - { - throw new FileAlreadyExistsException(path); - } - throw new FileSystemException(path, null, x.getMessage()); - } - catch (cli.System.Security.SecurityException _) - { - throw new AccessDeniedException(path); - } - catch (cli.System.UnauthorizedAccessException _) - { - throw new AccessDeniedException(path); - } - } - - public DirectoryStream<Path> newDirectoryStream(Path dir, final DirectoryStream.Filter<? super Path> filter) throws IOException - { - final String ndir = NetPath.from(dir).path; - // null check - filter.getClass(); - - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(ndir); - } - - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - final String[] files = Directory.GetFileSystemEntries(ndir); - return new DirectoryStream<Path>() { - private boolean closed; - public Iterator<Path> iterator() { - if (closed) { - throw new IllegalStateException(); - } - closed = true; - return new Iterator<Path>() { - private int pos; - private Path filtered; - public boolean hasNext() { - if (filtered == null) { - while (pos != files.length) { - Path p = new NetPath(fs, cli.System.IO.Path.Combine(ndir, files[pos++])); - try { - if (filter.accept(p)) { - filtered = p; - break; - } - } catch (IOException x) { - throw new DirectoryIteratorException(x); - } - } - } - return filtered != null; - } - public Path next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - Path p = filtered; - filtered = null; - return p; - } - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - public void close() { - closed = true; - } - }; - } - catch (cli.System.ArgumentException - | cli.System.IO.IOException - | cli.System.Security.SecurityException - | cli.System.UnauthorizedAccessException x) - { - if (File.Exists(ndir)) - { - throw new NotDirectoryException(ndir); - } - throw new IOException(x.getMessage()); - } - } - - public void createDirectory(Path dir, FileAttribute<?>... attrs) throws IOException - { - NetPath ndir = NetPath.from(dir); - for (FileAttribute<?> attr : attrs) - { - // null check - attr.getClass(); - throw new NotYetImplementedError(); - } - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkWrite(ndir.path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - Directory.CreateDirectory(ndir.path); - } - catch (cli.System.ArgumentException - | cli.System.IO.IOException - | cli.System.Security.SecurityException - | cli.System.UnauthorizedAccessException x) - { - if (File.Exists(ndir.path)) - { - throw new FileAlreadyExistsException(ndir.path); - } - throw new IOException(x.getMessage()); - } - } - - public void copy(Path source, Path target, CopyOption... options) throws IOException - { - NetPath nsource = NetPath.from(source); - NetPath ntarget = NetPath.from(target); - boolean overwrite = false; - boolean copyAttribs = false; - for (CopyOption opt : options) - { - if (opt == StandardCopyOption.REPLACE_EXISTING) - { - overwrite = true; - } - else if (opt == StandardCopyOption.COPY_ATTRIBUTES) - { - copyAttribs = true; - } - else - { - // null check - opt.getClass(); - throw new UnsupportedOperationException("Unsupported copy option"); - } - } - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(nsource.path); - sm.checkWrite(ntarget.path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - if (File.Exists(ntarget.path)) - { - if (!overwrite) - { - throw new FileAlreadyExistsException(ntarget.path); - } - File.Delete(ntarget.path); - } - if (Directory.Exists(ntarget.path)) - { - if (!overwrite) - { - throw new FileAlreadyExistsException(ntarget.path); - } - try - { - if (false) throw new cli.System.IO.IOException(); - Directory.Delete(ntarget.path); - } - catch (cli.System.IO.IOException _) - { - // HACK we assume that the IOException is caused by the directory not being empty - throw new DirectoryNotEmptyException(ntarget.path); - } - } - if (Directory.Exists(nsource.path)) - { - Directory.CreateDirectory(ntarget.path); - } - else - { - File.Copy(nsource.path, ntarget.path, overwrite); - } - if (copyAttribs) - { - if (Directory.Exists(ntarget.path)) - { - File.SetAttributes(ntarget.path, File.GetAttributes(nsource.path)); - Directory.SetCreationTimeUtc(ntarget.path, File.GetCreationTimeUtc(nsource.path)); - Directory.SetLastAccessTimeUtc(ntarget.path, File.GetLastAccessTimeUtc(nsource.path)); - Directory.SetLastWriteTimeUtc(ntarget.path, File.GetLastWriteTimeUtc(nsource.path)); - } - else - { - File.SetAttributes(ntarget.path, File.GetAttributes(nsource.path)); - File.SetCreationTimeUtc(ntarget.path, File.GetCreationTimeUtc(nsource.path)); - File.SetLastAccessTimeUtc(ntarget.path, File.GetLastAccessTimeUtc(nsource.path)); - File.SetLastWriteTimeUtc(ntarget.path, File.GetLastWriteTimeUtc(nsource.path)); - } - } - } - catch (cli.System.IO.FileNotFoundException x) - { - throw new NoSuchFileException(x.get_FileName()); - } - catch (cli.System.IO.DirectoryNotFoundException x) - { - throw new NoSuchFileException(nsource.path, ntarget.path, x.getMessage()); - } - catch (cli.System.IO.IOException | cli.System.ArgumentException x) - { - throw new FileSystemException(nsource.path, ntarget.path, x.getMessage()); - } - catch (cli.System.Security.SecurityException | cli.System.UnauthorizedAccessException x) - { - throw new AccessDeniedException(nsource.path, ntarget.path, x.getMessage()); - } - } - - public void move(Path source, Path target, CopyOption... options) throws IOException - { - NetPath nsource = NetPath.from(source); - NetPath ntarget = NetPath.from(target); - boolean overwrite = false; - for (CopyOption opt : options) - { - if (opt == StandardCopyOption.REPLACE_EXISTING) - { - overwrite = true; - } - else if (opt == StandardCopyOption.ATOMIC_MOVE) - { - throw new AtomicMoveNotSupportedException(nsource.path, ntarget.path, "Unsupported copy option"); - } - else - { - // null check - opt.getClass(); - throw new UnsupportedOperationException("Unsupported copy option"); - } - } - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(nsource.path); - sm.checkWrite(ntarget.path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - if (File.Exists(ntarget.path)) - { - if (!overwrite) - { - throw new FileAlreadyExistsException(ntarget.path); - } - File.Delete(ntarget.path); - } - if (Directory.Exists(ntarget.path)) - { - if (!overwrite) - { - throw new FileAlreadyExistsException(ntarget.path); - } - try - { - if (false) throw new cli.System.IO.IOException(); - Directory.Delete(ntarget.path); - } - catch (cli.System.IO.IOException _) - { - // HACK we assume that the IOException is caused by the directory not being empty - throw new DirectoryNotEmptyException(ntarget.path); - } - } - if (Directory.Exists(nsource.path)) - { - Directory.Move(nsource.path, ntarget.path); - } - else - { - File.Move(nsource.path, ntarget.path); - } - } - catch (cli.System.IO.FileNotFoundException x) - { - throw new NoSuchFileException(x.get_FileName()); - } - catch (cli.System.IO.DirectoryNotFoundException x) - { - throw new NoSuchFileException(nsource.path, ntarget.path, x.getMessage()); - } - catch (cli.System.IO.IOException | cli.System.ArgumentException x) - { - throw new FileSystemException(nsource.path, ntarget.path, x.getMessage()); - } - catch (cli.System.Security.SecurityException | cli.System.UnauthorizedAccessException x) - { - throw new AccessDeniedException(nsource.path, ntarget.path, x.getMessage()); - } - } - - public boolean isSameFile(Path path, Path path2) throws IOException - { - if (path.equals(path2)) - { - return true; - } - if (!(path instanceof NetPath && path2 instanceof NetPath)) - { - // null check - path2.getClass(); - return false; - } - return path.toRealPath().equals(path2.toRealPath()); - } - - public boolean isHidden(Path path) throws IOException - { - String npath = NetPath.from(path).path; - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(npath); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - return (File.GetAttributes(npath).Value & (cli.System.IO.FileAttributes.Hidden | cli.System.IO.FileAttributes.Directory)) == cli.System.IO.FileAttributes.Hidden; - } - catch (cli.System.IO.FileNotFoundException x) - { - throw new NoSuchFileException(npath); - } - catch (cli.System.IO.IOException | cli.System.ArgumentException x) - { - throw new IOException(x.getMessage()); - } - } - - private static class NetFileStore extends FileStore - { - private final DriveInfo info; - private final String name; - private final String type; - - NetFileStore(DriveInfo info) throws IOException - { - this.info = info; - try - { - if (false) throw new cli.System.IO.IOException(); - name = info.get_VolumeLabel(); - type = info.get_DriveFormat(); - } - catch (cli.System.IO.IOException x) - { - throw new IOException(x.getMessage()); - } - } - - public Object getAttribute(String attribute) throws IOException - { - switch (attribute) - { - case "totalSpace": - return getTotalSpace(); - case "unallocatedSpace": - return getUnallocatedSpace(); - case "usableSpace": - return getUsableSpace(); - default: - throw new UnsupportedOperationException(); - } - } - - public <V extends FileStoreAttributeView> V getFileStoreAttributeView(Class<V> type) - { - return null; - } - - public long getTotalSpace() throws IOException - { - try - { - if (false) throw new cli.System.IO.IOException(); - return info.get_TotalSize(); - } - catch (cli.System.IO.IOException x) - { - throw new IOException(x.getMessage()); - } - } - - public long getUnallocatedSpace() throws IOException - { - try - { - if (false) throw new cli.System.IO.IOException(); - return info.get_TotalFreeSpace(); - } - catch (cli.System.IO.IOException x) - { - throw new IOException(x.getMessage()); - } - } - - public long getUsableSpace() throws IOException - { - try - { - if (false) throw new cli.System.IO.IOException(); - return info.get_AvailableFreeSpace(); - } - catch (cli.System.IO.IOException x) - { - throw new IOException(x.getMessage()); - } - } - - public boolean isReadOnly() - { - return false; - } - - public String name() - { - return name; - } - - public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) - { - // null check - type.getClass(); - return type == BasicFileAttributeView.class || type == DosFileAttributeView.class; - } - - public boolean supportsFileAttributeView(String name) - { - return name.equals("basic") || name.equals("dos"); - } - - public String type() - { - return type; - } - - public String toString() - { - return name + " (" + info.get_Name().charAt(0) + ":)"; - } - } - - public FileStore getFileStore(Path path) throws IOException - { - NetPath npath = NetPath.from(path.toAbsolutePath()); - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(npath.path); - } - return getFileStore(new DriveInfo(npath.path)); - } - - public void checkAccess(Path path, AccessMode... modes) throws IOException - { - String npath = NetPath.from(path).path; - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - if (modes.length == 0) - { - sm.checkRead(npath); - } - for (AccessMode m : modes) - { - switch (m) - { - case READ: - sm.checkRead(npath); - break; - case WRITE: - sm.checkWrite(npath); - break; - case EXECUTE: - sm.checkExec(npath); - break; - default: - throw new UnsupportedOperationException(); - } - } - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.NotSupportedException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - // note that File.GetAttributes() works for directories as well - int attr = File.GetAttributes(npath).Value; - for (AccessMode m : modes) - { - switch (m) - { - case READ: - case EXECUTE: - break; - case WRITE: - if ((attr & (cli.System.IO.FileAttributes.ReadOnly | cli.System.IO.FileAttributes.Directory)) == cli.System.IO.FileAttributes.ReadOnly) - { - throw new AccessDeniedException(npath, null, "file has read-only attribute set"); - } - if (getFileStore(path).isReadOnly()) - { - throw new AccessDeniedException(npath, null, "volume is read-only"); - } - break; - default: - throw new UnsupportedOperationException(); - } - } - } - catch (cli.System.IO.FileNotFoundException | cli.System.IO.DirectoryNotFoundException _) - { - throw new NoSuchFileException(npath); - } - catch (cli.System.Security.SecurityException | cli.System.UnauthorizedAccessException x) - { - throw new AccessDeniedException(npath, null, x.getMessage()); - } - catch (cli.System.ArgumentException | cli.System.IO.IOException | cli.System.NotSupportedException x) - { - throw new IOException(x.getMessage()); - } - } - - private static class BasicFileAttributesViewImpl extends AbstractBasicFileAttributeView - { - protected final String path; - - BasicFileAttributesViewImpl(String path) - { - this.path = path; - } - - public BasicFileAttributes readAttributes() throws IOException - { - return DosFileAttributesViewImpl.readAttributesImpl(path); - } - - public void setTimes(FileTime lastModifiedTime, FileTime lastAccessTime, FileTime createTime) throws IOException - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkWrite(path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.NotSupportedException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - if (File.Exists(path)) - { - if (lastModifiedTime != null) - { - File.SetLastWriteTimeUtc(path, toDateTime(lastModifiedTime)); - } - if (lastAccessTime != null) - { - File.SetLastAccessTimeUtc(path, toDateTime(lastAccessTime)); - } - if (createTime != null) - { - File.SetCreationTimeUtc(path, toDateTime(createTime)); - } - } - else if (Directory.Exists(path)) - { - if (lastModifiedTime != null) - { - Directory.SetLastWriteTimeUtc(path, toDateTime(lastModifiedTime)); - } - if (lastAccessTime != null) - { - Directory.SetLastAccessTimeUtc(path, toDateTime(lastAccessTime)); - } - if (createTime != null) - { - Directory.SetCreationTimeUtc(path, toDateTime(createTime)); - } - } - else - { - throw new NoSuchFileException(path); - } - } - catch (cli.System.ArgumentException - | cli.System.IO.IOException - | cli.System.NotSupportedException - | cli.System.Security.SecurityException - | cli.System.UnauthorizedAccessException x) - { - throw new IOException(x.getMessage()); - } - } - } - - private static class DosFileAttributesViewImpl extends BasicFileAttributesViewImpl implements DosFileAttributeView - { - private static final String READONLY_NAME = "readonly"; - private static final String ARCHIVE_NAME = "archive"; - private static final String SYSTEM_NAME = "system"; - private static final String HIDDEN_NAME = "hidden"; - private static final String ATTRIBUTES_NAME = "attributes"; - private static final Set<String> dosAttributeNames = Util.newSet(basicAttributeNames, READONLY_NAME, ARCHIVE_NAME, SYSTEM_NAME, HIDDEN_NAME, ATTRIBUTES_NAME); - - DosFileAttributesViewImpl(String path) - { - super(path); - } - - public String name() - { - return "dos"; - } - - public DosFileAttributes readAttributes() throws IOException - { - return readAttributesImpl(path); - } - - private static class DosFileAttributesImpl implements DosFileAttributes - { - private final FileInfo info; - - DosFileAttributesImpl(FileInfo info) - { - this.info = info; - } - - int attributes() - { - return info.get_Attributes().Value; - } - - public FileTime creationTime() - { - return toFileTime(info.get_CreationTimeUtc()); - } - - public Object fileKey() - { - return null; - } - - public boolean isDirectory() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.Directory) != 0; - } - - public boolean isOther() - { - return false; - } - - public boolean isRegularFile() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.Directory) == 0; - } - - public boolean isSymbolicLink() - { - return false; - } - - public FileTime lastAccessTime() - { - return toFileTime(info.get_LastAccessTimeUtc()); - } - - public FileTime lastModifiedTime() - { - return toFileTime(info.get_LastWriteTimeUtc()); - } - - public long size() - { - return info.get_Exists() ? info.get_Length() : 0; - } - - public boolean isArchive() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.Archive) != 0; - } - - public boolean isHidden() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.Hidden) != 0; - } - - public boolean isReadOnly() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.ReadOnly) != 0; - } - - public boolean isSystem() - { - return (info.get_Attributes().Value & cli.System.IO.FileAttributes.System) != 0; - } - } - - static DosFileAttributesImpl readAttributesImpl(String path) throws IOException - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - FileInfo info = new FileInfo(path); - // We have to rely on the (undocumented) fact that FileInfo.Attributes returns -1 - // when the path does not exist. We need this to work for both files and directories - // and this is the only efficient way to do that. - if (info.get_Attributes().Value == -1) - { - throw new NoSuchFileException(path); - } - return new DosFileAttributesImpl(info); - } - catch (cli.System.IO.FileNotFoundException _) - { - throw new NoSuchFileException(path); - } - catch (cli.System.IO.IOException | cli.System.ArgumentException x) - { - throw new IOException(x.getMessage()); - } - } - - public void setArchive(boolean value) throws IOException - { - setAttribute(cli.System.IO.FileAttributes.Archive, value); - } - - public void setHidden(boolean value) throws IOException - { - setAttribute(cli.System.IO.FileAttributes.Hidden, value); - } - - public void setReadOnly(boolean value) throws IOException - { - setAttribute(cli.System.IO.FileAttributes.ReadOnly, value); - } - - public void setSystem(boolean value) throws IOException - { - setAttribute(cli.System.IO.FileAttributes.System, value); - } - - private void setAttribute(int attr, boolean value) throws IOException - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkWrite(path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.IOException(); - FileInfo info = new FileInfo(path); - if (value) - { - info.set_Attributes(cli.System.IO.FileAttributes.wrap(info.get_Attributes().Value | attr)); - } - else - { - info.set_Attributes(cli.System.IO.FileAttributes.wrap(info.get_Attributes().Value & ~attr)); - } - } - catch (cli.System.IO.FileNotFoundException _) - { - throw new NoSuchFileException(path); - } - catch (cli.System.ArgumentException - | cli.System.IO.IOException x) - { - throw new IOException(x.getMessage()); - } - } - - public Map<String,Object> readAttributes(String[] attributes) throws IOException - { - AttributesBuilder builder = AttributesBuilder.create(dosAttributeNames, attributes); - DosFileAttributesImpl attrs = readAttributesImpl(path); - addRequestedBasicAttributes(attrs, builder); - if (builder.match(READONLY_NAME)) - { - builder.add(READONLY_NAME, attrs.isReadOnly()); - } - if (builder.match(ARCHIVE_NAME)) - { - builder.add(ARCHIVE_NAME, attrs.isArchive()); - } - if (builder.match(SYSTEM_NAME)) - { - builder.add(SYSTEM_NAME, attrs.isSystem()); - } - if (builder.match(HIDDEN_NAME)) - { - builder.add(HIDDEN_NAME, attrs.isHidden()); - } - if (builder.match(ATTRIBUTES_NAME)) - { - builder.add(ATTRIBUTES_NAME, attrs.attributes()); - } - return builder.unmodifiableMap(); - } - - public void setAttribute(String attribute, Object value) throws IOException - { - switch (attribute) - { - case READONLY_NAME: - setReadOnly((Boolean)value); - break; - case ARCHIVE_NAME: - setArchive((Boolean)value); - break; - case SYSTEM_NAME: - setSystem((Boolean)value); - break; - case HIDDEN_NAME: - setHidden((Boolean)value); - break; - default: - super.setAttribute(attribute, value); - break; - } - } - } - - private static void validateLinkOption(LinkOption... options) - { - for (LinkOption option : options) - { - if (option == LinkOption.NOFOLLOW_LINKS) - { - // ignored - } - else - { - // null check - option.getClass(); - throw new UnsupportedOperationException(); - } - } - } - - public <V extends FileAttributeView> V getFileAttributeView(Path path, Class<V> type, LinkOption... options) - { - String npath = NetPath.from(path).path; - validateLinkOption(options); - if (type == BasicFileAttributeView.class) - { - return (V)new BasicFileAttributesViewImpl(npath); - } - else if (type == DosFileAttributeView.class) - { - return (V)new DosFileAttributesViewImpl(npath); - } - else - { - // null check - type.getClass(); - return null; - } - } - - public <A extends BasicFileAttributes> A readAttributes(Path path, Class<A> type, LinkOption... options) throws IOException - { - String npath = NetPath.from(path).path; - // null check - type.getClass(); - validateLinkOption(options); - if (type != BasicFileAttributes.class && type != DosFileAttributes.class) - { - throw new UnsupportedOperationException(); - } - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkRead(npath); - } - return (A)DosFileAttributesViewImpl.readAttributesImpl(npath); - } - - DynamicFileAttributeView getFileAttributeView(Path file, String name, LinkOption... options) - { - validateLinkOption(options); - if (name.equals("basic")) - { - return new BasicFileAttributesViewImpl(NetPath.from(file).path); - } - else if (name.equals("dos")) - { - return new DosFileAttributesViewImpl(NetPath.from(file).path); - } - else - { - return null; - } - } - - boolean implDelete(Path file, boolean failIfNotExists) throws IOException - { - String path = NetPath.from(file).path; - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - sm.checkDelete(path); - } - try - { - if (false) throw new cli.System.ArgumentException(); - if (false) throw new cli.System.IO.FileNotFoundException(); - if (false) throw new cli.System.IO.DirectoryNotFoundException(); - if (false) throw new cli.System.IO.IOException(); - if (false) throw new cli.System.Security.SecurityException(); - if (false) throw new cli.System.UnauthorizedAccessException(); - int attr = cli.System.IO.File.GetAttributes(path).Value; - if ((attr & cli.System.IO.FileAttributes.Directory) != 0) - { - try - { - if (false) throw new cli.System.IO.IOException(); - cli.System.IO.Directory.Delete(path); - } - catch (cli.System.IO.IOException _) - { - // HACK we assume that the IOException is caused by the directory not being empty - throw new DirectoryNotEmptyException(path); - } - return true; - } - else - { - cli.System.IO.File.Delete(path); - return true; - } - } - catch (cli.System.ArgumentException x) - { - throw new FileSystemException(path, null, x.getMessage()); - } - catch (cli.System.IO.FileNotFoundException _) - { - if (failIfNotExists) - { - throw new NoSuchFileException(path); - } - else - { - return false; - } - } - catch (cli.System.IO.DirectoryNotFoundException _) - { - if (failIfNotExists) - { - throw new NoSuchFileException(path); - } - else - { - return false; - } - } - catch (cli.System.IO.IOException x) - { - throw new FileSystemException(path, null, x.getMessage()); - } - catch (cli.System.Security.SecurityException _) - { - throw new AccessDeniedException(path); - } - catch (cli.System.UnauthorizedAccessException _) - { - throw new AccessDeniedException(path); - } - } - - static FileTime toFileTime(cli.System.DateTime dateTime) - { - return FileTime.from((dateTime.get_Ticks() - 621355968000000000L) / 10, java.util.concurrent.TimeUnit.MICROSECONDS); - } - - static cli.System.DateTime toDateTime(FileTime fileTime) - { - return new cli.System.DateTime(fileTime.to(java.util.concurrent.TimeUnit.MICROSECONDS) * 10 + 621355968000000000L); - } -} |