diff options
Diffstat (limited to 'jimfs/src/main/java/com/google/common/jimfs/BasicAttributeProvider.java')
-rw-r--r-- | jimfs/src/main/java/com/google/common/jimfs/BasicAttributeProvider.java | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/jimfs/src/main/java/com/google/common/jimfs/BasicAttributeProvider.java b/jimfs/src/main/java/com/google/common/jimfs/BasicAttributeProvider.java new file mode 100644 index 0000000..6315ab7 --- /dev/null +++ b/jimfs/src/main/java/com/google/common/jimfs/BasicAttributeProvider.java @@ -0,0 +1,239 @@ +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.common.jimfs; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.io.IOException; +import java.nio.file.attribute.BasicFileAttributeView; +import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.attribute.FileAttributeView; +import java.nio.file.attribute.FileTime; +import org.checkerframework.checker.nullness.compatqual.NullableDecl; + +/** + * Attribute provider that provides attributes common to all file systems, the {@link + * BasicFileAttributeView} ("basic" or no view prefix), and allows the reading of {@link + * BasicFileAttributes}. + * + * @author Colin Decker + */ +final class BasicAttributeProvider extends AttributeProvider { + + private static final ImmutableSet<String> ATTRIBUTES = + ImmutableSet.of( + "size", + "fileKey", + "isDirectory", + "isRegularFile", + "isSymbolicLink", + "isOther", + "creationTime", + "lastAccessTime", + "lastModifiedTime"); + + @Override + public String name() { + return "basic"; + } + + @Override + public ImmutableSet<String> fixedAttributes() { + return ATTRIBUTES; + } + + @Override + public Object get(File file, String attribute) { + switch (attribute) { + case "size": + return file.size(); + case "fileKey": + return file.id(); + case "isDirectory": + return file.isDirectory(); + case "isRegularFile": + return file.isRegularFile(); + case "isSymbolicLink": + return file.isSymbolicLink(); + case "isOther": + return !file.isDirectory() && !file.isRegularFile() && !file.isSymbolicLink(); + case "creationTime": + return FileTime.fromMillis(file.getCreationTime()); + case "lastAccessTime": + return FileTime.fromMillis(file.getLastAccessTime()); + case "lastModifiedTime": + return FileTime.fromMillis(file.getLastModifiedTime()); + default: + return null; + } + } + + @Override + public void set(File file, String view, String attribute, Object value, boolean create) { + switch (attribute) { + case "creationTime": + checkNotCreate(view, attribute, create); + file.setCreationTime(checkType(view, attribute, value, FileTime.class).toMillis()); + break; + case "lastAccessTime": + checkNotCreate(view, attribute, create); + file.setLastAccessTime(checkType(view, attribute, value, FileTime.class).toMillis()); + break; + case "lastModifiedTime": + checkNotCreate(view, attribute, create); + file.setLastModifiedTime(checkType(view, attribute, value, FileTime.class).toMillis()); + break; + case "size": + case "fileKey": + case "isDirectory": + case "isRegularFile": + case "isSymbolicLink": + case "isOther": + throw unsettable(view, attribute, create); + default: + } + } + + @Override + public Class<BasicFileAttributeView> viewType() { + return BasicFileAttributeView.class; + } + + @Override + public BasicFileAttributeView view( + FileLookup lookup, ImmutableMap<String, FileAttributeView> inheritedViews) { + return new View(lookup); + } + + @Override + public Class<BasicFileAttributes> attributesType() { + return BasicFileAttributes.class; + } + + @Override + public BasicFileAttributes readAttributes(File file) { + return new Attributes(file); + } + + /** Implementation of {@link BasicFileAttributeView}. */ + private static final class View extends AbstractAttributeView implements BasicFileAttributeView { + + protected View(FileLookup lookup) { + super(lookup); + } + + @Override + public String name() { + return "basic"; + } + + @Override + public BasicFileAttributes readAttributes() throws IOException { + return new Attributes(lookupFile()); + } + + @Override + public void setTimes( + @NullableDecl FileTime lastModifiedTime, + @NullableDecl FileTime lastAccessTime, + @NullableDecl FileTime createTime) + throws IOException { + File file = lookupFile(); + + if (lastModifiedTime != null) { + file.setLastModifiedTime(lastModifiedTime.toMillis()); + } + + if (lastAccessTime != null) { + file.setLastAccessTime(lastAccessTime.toMillis()); + } + + if (createTime != null) { + file.setCreationTime(createTime.toMillis()); + } + } + } + + /** Implementation of {@link BasicFileAttributes}. */ + static class Attributes implements BasicFileAttributes { + + private final FileTime lastModifiedTime; + private final FileTime lastAccessTime; + private final FileTime creationTime; + private final boolean regularFile; + private final boolean directory; + private final boolean symbolicLink; + private final long size; + private final Object fileKey; + + protected Attributes(File file) { + this.lastModifiedTime = FileTime.fromMillis(file.getLastModifiedTime()); + this.lastAccessTime = FileTime.fromMillis(file.getLastAccessTime()); + this.creationTime = FileTime.fromMillis(file.getCreationTime()); + this.regularFile = file.isRegularFile(); + this.directory = file.isDirectory(); + this.symbolicLink = file.isSymbolicLink(); + this.size = file.size(); + this.fileKey = file.id(); + } + + @Override + public FileTime lastModifiedTime() { + return lastModifiedTime; + } + + @Override + public FileTime lastAccessTime() { + return lastAccessTime; + } + + @Override + public FileTime creationTime() { + return creationTime; + } + + @Override + public boolean isRegularFile() { + return regularFile; + } + + @Override + public boolean isDirectory() { + return directory; + } + + @Override + public boolean isSymbolicLink() { + return symbolicLink; + } + + @Override + public boolean isOther() { + return false; + } + + @Override + public long size() { + return size; + } + + @Override + public Object fileKey() { + return fileKey; + } + } +} |