@Override
public PermissionOverwrite run(final Session<?> session) throws BackgroundException {
final UnixPermission feature = session.getFeature(UnixPermission.class);
final List<Permission> permissions = new ArrayList<>();
for(Path next : files) {
if(this.isCanceled()) {
throw new ConnectionCanceledException();
}
if(Permission.EMPTY == next.attributes().getPermission()) {
next.attributes().setPermission(feature.getUnixPermission(next));
}
permissions.add(next.attributes().getPermission());
}
final PermissionOverwrite overwrite = new PermissionOverwrite();
final Supplier<Stream<Permission>> supplier = permissions::stream;
overwrite.user.read = resolveOverwrite(map(supplier, Permission::getUser, Permission.Action.read));
overwrite.user.write = resolveOverwrite(map(supplier, Permission::getUser, Permission.Action.write));
overwrite.user.execute = resolveOverwrite(map(supplier, Permission::getUser, Permission.Action.execute));
overwrite.group.read = resolveOverwrite(map(supplier, Permission::getGroup, Permission.Action.read));
overwrite.group.write = resolveOverwrite(map(supplier, Permission::getGroup, Permission.Action.write));
overwrite.group.execute = resolveOverwrite(map(supplier, Permission::getGroup, Permission.Action.execute));
overwrite.other.read = resolveOverwrite(map(supplier, Permission::getOther, Permission.Action.read));
overwrite.other.write = resolveOverwrite(map(supplier, Permission::getOther, Permission.Action.write));
overwrite.other.execute = resolveOverwrite(map(supplier, Permission::getOther, Permission.Action.execute));
return overwrite;
}