package automately.core.file.nio; import automately.core.file.VirtualFile; import java.nio.file.attribute.*; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; class UserFileAttributes implements BasicFileAttributes, PosixFileAttributes { public static final Set<PosixFilePermission> DEFAULT_PERMISSIONS; public static final Set<PosixFilePermission> DEFAULT_PUBLIC_PERMISSIONS; static { DEFAULT_PERMISSIONS = new LinkedHashSet<>(); DEFAULT_PERMISSIONS.add(PosixFilePermission.OWNER_READ); DEFAULT_PERMISSIONS.add(PosixFilePermission.OWNER_EXECUTE); DEFAULT_PERMISSIONS.add(PosixFilePermission.GROUP_READ); DEFAULT_PERMISSIONS.add(PosixFilePermission.GROUP_EXECUTE); DEFAULT_PERMISSIONS.add(PosixFilePermission.OWNER_WRITE); DEFAULT_PERMISSIONS.add(PosixFilePermission.GROUP_WRITE); DEFAULT_PUBLIC_PERMISSIONS = new LinkedHashSet<>(); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.OWNER_READ); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.OWNER_EXECUTE); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.GROUP_READ); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.GROUP_EXECUTE); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.OWNER_WRITE); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.GROUP_WRITE); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.OTHERS_READ); DEFAULT_PUBLIC_PERMISSIONS.add(PosixFilePermission.OTHERS_EXECUTE); } private final FileTime lastModifiedTime; private final FileTime creationTime; private final boolean isDirectory; private final long size; private final String fileKey; private final UserPrincipal userPrincipal; private final GroupPrincipal groupPrincipal; private final boolean isPublic; UserFileAttributes(UserFileSystem fs, VirtualFile file) { if (file != null) { lastModifiedTime = FileTime.fromMillis(file.updated.getTime()); creationTime = FileTime.fromMillis(file.created.getTime()); isDirectory = file.isDirectory; size = file.size; fileKey = file.token(); isPublic = file.isPublic; } else { lastModifiedTime = FileTime.fromMillis(new Date().getTime()); creationTime = FileTime.fromMillis(new Date().getTime()); isDirectory = true; size = 0; fileKey = "/"; isPublic = false; } String username = fs.getUser().username; userPrincipal = () -> username; groupPrincipal = () -> username; } @Override public FileTime lastModifiedTime() { return lastModifiedTime; } @Override public FileTime lastAccessTime() { throw new UnsupportedOperationException(); } @Override public FileTime creationTime() { return creationTime; } @Override public boolean isRegularFile() { return !isDirectory; } @Override public boolean isDirectory() { return isDirectory; } @Override public boolean isSymbolicLink() { return false; } @Override public boolean isOther() { return false; } @Override public long size() { return size; } @Override public Object fileKey() { return fileKey; } @Override public UserPrincipal owner() { return userPrincipal; } @Override public GroupPrincipal group() { return groupPrincipal; } @Override public Set<PosixFilePermission> permissions() { if(isPublic){ return DEFAULT_PUBLIC_PERMISSIONS; } return DEFAULT_PERMISSIONS; } }