package org.eclipse.core.internal.filesystem.local.nio;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.provider.FileInfo;
import org.eclipse.core.internal.filesystem.local.NativeHandler;
public class PosixHandler extends NativeHandler {
private static final int ATTRIBUTES = EFS.ATTRIBUTE_SYMLINK | EFS.ATTRIBUTE_LINK_TARGET
| EFS.ATTRIBUTE_READ_ONLY | EFS.ATTRIBUTE_EXECUTABLE
| EFS.ATTRIBUTE_OWNER_READ | EFS.ATTRIBUTE_OWNER_WRITE | EFS.ATTRIBUTE_OWNER_EXECUTE
| EFS.ATTRIBUTE_GROUP_READ | EFS.ATTRIBUTE_GROUP_WRITE | EFS.ATTRIBUTE_GROUP_EXECUTE
| EFS.ATTRIBUTE_OTHER_READ | EFS.ATTRIBUTE_OTHER_WRITE | EFS.ATTRIBUTE_OTHER_EXECUTE;
@Override
public FileInfo fetchFileInfo(String fileName) {
Path path = Paths.get(fileName);
FileInfo info = new FileInfo();
Path fileNamePath = path.getFileName();
info.setName(fileNamePath == null ? "" : fileNamePath.toString());
try {
PosixFileAttributes attrs = Files.readAttributes(path, PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
if (attrs.isSymbolicLink()) {
info.setAttribute(EFS.ATTRIBUTE_SYMLINK, true);
info.setStringAttribute(EFS.ATTRIBUTE_LINK_TARGET, Files.readSymbolicLink(path).toString());
attrs = Files.readAttributes(path, PosixFileAttributes.class);
}
info.setExists(true);
info.setLastModified(attrs.lastModifiedTime().toMillis());
info.setLength(attrs.size());
info.setDirectory(attrs.isDirectory());
Set<PosixFilePermission> perms = attrs.permissions();
info.setAttribute(EFS.ATTRIBUTE_OWNER_READ, perms.contains(PosixFilePermission.OWNER_READ));
info.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE, perms.contains(PosixFilePermission.OWNER_WRITE));
info.setAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE, perms.contains(PosixFilePermission.OWNER_EXECUTE));
info.setAttribute(EFS.ATTRIBUTE_GROUP_READ, perms.contains(PosixFilePermission.GROUP_READ));
info.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE, perms.contains(PosixFilePermission.GROUP_WRITE));
info.setAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE, perms.contains(PosixFilePermission.GROUP_EXECUTE));
info.setAttribute(EFS.ATTRIBUTE_OTHER_READ, perms.contains(PosixFilePermission.OTHERS_READ));
info.setAttribute(EFS.ATTRIBUTE_OTHER_WRITE, perms.contains(PosixFilePermission.OTHERS_WRITE));
info.setAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE, perms.contains(PosixFilePermission.OTHERS_EXECUTE));
} catch (NoSuchFileException e) {
} catch (IOException e) {
info.setError(IFileInfo.IO_ERROR);
}
return info;
}
@Override
public int getSupportedAttributes() {
return ATTRIBUTES;
}
@Override
public boolean putFileInfo(String fileName, IFileInfo info, int options) {
Path path = Paths.get(fileName);
Set<PosixFilePermission> perms = new HashSet<>();
if (info.getAttribute(EFS.ATTRIBUTE_OWNER_READ))
perms.add(PosixFilePermission.OWNER_READ);
if (info.getAttribute(EFS.ATTRIBUTE_OWNER_WRITE))
perms.add(PosixFilePermission.OWNER_WRITE);
if (info.getAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE))
perms.add(PosixFilePermission.OWNER_EXECUTE);
if (info.getAttribute(EFS.ATTRIBUTE_GROUP_READ))
perms.add(PosixFilePermission.GROUP_READ);
if (info.getAttribute(EFS.ATTRIBUTE_GROUP_WRITE))
perms.add(PosixFilePermission.GROUP_WRITE);
if (info.getAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE))
perms.add(PosixFilePermission.GROUP_EXECUTE);
if (info.getAttribute(EFS.ATTRIBUTE_OTHER_READ))
perms.add(PosixFilePermission.OTHERS_READ);
if (info.getAttribute(EFS.ATTRIBUTE_OTHER_WRITE))
perms.add(PosixFilePermission.OTHERS_WRITE);
if (info.getAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE))
perms.add(PosixFilePermission.OTHERS_EXECUTE);
PosixFileAttributeView view = Files.getFileAttributeView(path, PosixFileAttributeView.class);
try {
view.setPermissions(perms);
} catch (IOException e) {
return false;
}
return true;
}
}