package org.graalvm.component.installer.commands;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystemException;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermission;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import org.graalvm.component.installer.Feedback;
import org.graalvm.component.installer.SystemUtils;
import org.graalvm.component.installer.os.DefaultFileOperations;
import org.graalvm.component.installer.os.WindowsFileOperations;
class BlockedFileOps extends WindowsFileOperations {
class DefDelegate extends DefaultFileOperations {
@Override
public Path handleUnmodifiableFile(IOException ex, Path p, InputStream content) throws IOException {
return super.handleUnmodifiableFile(ex, p, content);
}
@Override
public void handleUndeletableFile(IOException ex, Path p) throws IOException {
super.handleUndeletableFile(ex, p);
}
@Override
public boolean doWithPermissions(Path p, Callable<Void> action) throws IOException {
return super.doWithPermissions(p, action);
}
}
private DefDelegate defSupport;
Set<Path> blockedPaths = new HashSet<>();
Path delayDeletes;
Path copiedFiles;
@Override
public void init(Feedback feedback) {
super.init(feedback);
defSupport = new DefDelegate();
defSupport.init(feedback);
}
@Override
protected void performInstall(Path target, InputStream contents) throws IOException {
if (blockedPaths.contains(target)) {
throw new FileSystemException("");
}
super.performInstall(target, contents);
}
@Override
protected void performDelete(Path target) throws IOException {
if (blockedPaths.contains(target)) {
throw new FileSystemException("");
}
super.performDelete(target);
}
@Override
public void setPermissions(Path target, Set<PosixFilePermission> perms) throws IOException {
if (SystemUtils.isWindows()) {
super.setPermissions(target, perms);
} else {
defSupport.setPermissions(target, perms);
}
}
@Override
protected boolean doWithPermissions(Path p, Callable<Void> action) throws IOException {
if (SystemUtils.isWindows()) {
return super.doWithPermissions(p, action);
} else {
return defSupport.doWithPermissions(p, action);
}
}
}