--- old/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributeView.java 2019-05-21 17:13:06.114533300 +0200 +++ new/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributeView.java 2019-05-21 17:13:05.000348800 +0200 @@ -27,15 +27,18 @@ import java.io.IOException; import java.nio.file.attribute.BasicFileAttributeView; +import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.FileTime; +import java.nio.file.attribute.PosixFilePermission; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; /** * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal */ class ZipFileAttributeView implements BasicFileAttributeView { - private enum AttrID { + static enum AttrID { size, creationTime, lastAccessTime, @@ -47,10 +50,13 @@ fileKey, compressedSize, crc, - method + method, + owner, + group, + permissions } - private final ZipPath path; + final ZipPath path; private final boolean isZipView; ZipFileAttributeView(ZipPath path, boolean isZipView) { @@ -64,7 +70,7 @@ } @Override - public ZipFileAttributes readAttributes() throws IOException { + public BasicFileAttributes readAttributes() throws IOException { return path.readAttributes(); } @@ -77,6 +83,11 @@ path.setTimes(lastModifiedTime, lastAccessTime, createTime); } + public void setPermissions(Set perms) throws IOException { + path.setPermissions(perms); + } + + @SuppressWarnings("unchecked") void setAttribute(String attribute, Object value) throws IOException { @@ -87,6 +98,8 @@ setTimes(null, (FileTime)value, null); if (AttrID.valueOf(attribute) == AttrID.creationTime) setTimes(null, null, (FileTime)value); + if (AttrID.valueOf(attribute) == AttrID.permissions) + setPermissions((Set)value); } catch (IllegalArgumentException x) { throw new UnsupportedOperationException("'" + attribute + "' is unknown or read-only attribute"); @@ -96,7 +109,7 @@ Map readAttributes(String attributes) throws IOException { - ZipFileAttributes zfas = readAttributes(); + ZipFileAttributes zfas = (ZipFileAttributes)readAttributes(); LinkedHashMap map = new LinkedHashMap<>(); if ("*".equals(attributes)) { for (AttrID id : AttrID.values()) { @@ -115,7 +128,7 @@ return map; } - private Object attribute(AttrID id, ZipFileAttributes zfas) { + Object attribute(AttrID id, ZipFileAttributes zfas) { switch (id) { case size: return zfas.size(); @@ -147,6 +160,11 @@ if (isZipView) return zfas.method(); break; + case permissions: + if (isZipView) { + return zfas.storedPermissions().orElse(null); + } + break; default: break; }