package com.beijunyi.parallelgit.filesystem.io;
import java.io.IOException;
import java.nio.file.attribute.*;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import static com.beijunyi.parallelgit.filesystem.io.GfsFileAttributeView.Basic.BASIC_KEYS;
import static com.beijunyi.parallelgit.filesystem.io.GfsFileAttributeView.*;
import static com.beijunyi.parallelgit.filesystem.io.GfsFileAttributeView.Git.GIT_KEYS;
import static com.beijunyi.parallelgit.filesystem.io.GfsFileAttributeView.Posix.POSIX_KEYS;
public abstract class GfsFileAttributes {
public static class Basic implements BasicFileAttributes {
private final FileTime lastModifiedTime;
private final FileTime lastAccessTime;
private final FileTime creationTime;
private final boolean isRegularFile;
private final boolean isDirectory;
private final boolean isSymbolicLink;
private final boolean isOther;
private final long size;
private final Object fileKey;
private Basic(Map<String, Object> attributes) {
lastModifiedTime = (FileTime) attributes.get(LAST_MODIFIED_TIME_NAME);
lastAccessTime = (FileTime) attributes.get(LAST_ACCESS_TIME_NAME);
creationTime = (FileTime) attributes.get(CREATION_TIME_NAME);
isRegularFile = (boolean) attributes.get(IS_REGULAR_FILE_NAME);
isDirectory = (boolean) attributes.get(IS_DIRECTORY_NAME);
isSymbolicLink = (boolean) attributes.get(IS_SYMBOLIC_LINK_NAME);
isOther = (boolean) attributes.get(IS_OTHER_NAME);
size = (long) attributes.get(SIZE_NAME);
fileKey = attributes.get(FILE_KEY_NAME);
}
Basic(GfsFileAttributeView view) throws IOException {
this(view.readAttributes(BASIC_KEYS));
}
@Nonnull
@Override
public FileTime lastModifiedTime() {
return lastModifiedTime;
}
@Nonnull
@Override
public FileTime lastAccessTime() {
return lastAccessTime;
}
@Nonnull
@Override
public FileTime creationTime() {
return creationTime;
}
@Override
public boolean isRegularFile() {
return isRegularFile;
}
@Override
public boolean isDirectory() {
return isDirectory;
}
@Override
public boolean isSymbolicLink() {
return isSymbolicLink;
}
@Override
public boolean isOther() {
return isOther;
}
@Override
public long size() {
return size;
}
@Nullable
@Override
public Object fileKey() {
return fileKey;
}
}
public static class Posix extends Basic implements PosixFileAttributes {
private final UserPrincipal owner;
private final GroupPrincipal group;
private final Set<PosixFilePermission> permissions;
@SuppressWarnings("unchecked")
private Posix(Map<String, Object> attributes) {
super(attributes);
owner = (UserPrincipal) attributes.get(GfsFileAttributeView.Posix.OWNER_NAME);
group = (GroupPrincipal) attributes.get(GfsFileAttributeView.Posix.GROUP_NAME);
permissions = (Set<PosixFilePermission>) attributes.get(GfsFileAttributeView.Posix.PERMISSIONS_NAME);
}
Posix(GfsFileAttributeView view) throws IOException {
this(view.readAttributes(POSIX_KEYS));
}
@Override
public UserPrincipal owner() {
return owner;
}
@Override
public GroupPrincipal group() {
return group;
}
@Override
public Set<PosixFilePermission> permissions() {
return permissions;
}
}
public static class Git extends Posix implements GitFileAttributes {
private final boolean isNew;
private final boolean isModified;
private final ObjectId objectId;
private final FileMode fileMode;
public Git(Map<String, Object> attributes) throws IOException {
super(attributes);
isNew = (boolean) attributes.get(GfsFileAttributeView.IS_NEW);
isModified = (boolean) attributes.get(GfsFileAttributeView.IS_MODIFIED);
objectId = (ObjectId) attributes.get(GfsFileAttributeView.OBJECT_ID);
fileMode = (FileMode) attributes.get(GfsFileAttributeView.FILE_MODE);
}
public Git(GfsFileAttributeView.Git view) throws IOException {
this(view.readAttributes(GIT_KEYS));
}
@Override
public boolean isNew() throws IOException {
return isNew;
}
@Override
public boolean isModified() throws IOException {
return isModified;
}
@Nullable
@Override
public ObjectId getObjectId() throws IOException {
return objectId;
}
@Nonnull
@Override
public FileMode getFileMode() {
return fileMode;
}
}
}