< prev index next >

src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributeView.java

Print this page
rev 55003 : 8213031: (zipfs) Add support for POSIX file permissions

@@ -25,19 +25,22 @@
 
 package jdk.nio.zipfs;
 
 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,
         lastModifiedTime,
         isDirectory,

@@ -45,14 +48,17 @@
         isSymbolicLink,
         isOther,
         fileKey,
         compressedSize,
         crc,
-        method
+        method,
+        owner,
+        group,
+        permissions
     }
 
-    private final ZipPath path;
+    final ZipPath path;
     private final boolean isZipView;
 
     ZipFileAttributeView(ZipPath path, boolean isZipView) {
         this.path = path;
         this.isZipView = isZipView;

@@ -62,11 +68,11 @@
     public String name() {
         return isZipView ? "zip" : "basic";
     }
 
     @Override
-    public ZipFileAttributes readAttributes() throws IOException {
+    public BasicFileAttributes readAttributes() throws IOException {
         return path.readAttributes();
     }
 
     @Override
     public void setTimes(FileTime lastModifiedTime,

@@ -75,30 +81,37 @@
         throws IOException
     {
         path.setTimes(lastModifiedTime, lastAccessTime, createTime);
     }
 
+    public void setPermissions(Set<PosixFilePermission> perms) throws IOException {
+        path.setPermissions(perms);
+    }
+
+    @SuppressWarnings("unchecked")
     void setAttribute(String attribute, Object value)
         throws IOException
     {
         try {
             if (AttrID.valueOf(attribute) == AttrID.lastModifiedTime)
                 setTimes((FileTime)value, null, null);
             if (AttrID.valueOf(attribute) == AttrID.lastAccessTime)
                 setTimes(null, (FileTime)value, null);
             if (AttrID.valueOf(attribute) == AttrID.creationTime)
                 setTimes(null, null, (FileTime)value);
+            if (AttrID.valueOf(attribute) == AttrID.permissions)
+                setPermissions((Set<PosixFilePermission>)value);
         } catch (IllegalArgumentException x) {
             throw new UnsupportedOperationException("'" + attribute +
                 "' is unknown or read-only attribute");
         }
     }
 
     Map<String, Object> readAttributes(String attributes)
         throws IOException
     {
-        ZipFileAttributes zfas = readAttributes();
+        ZipFileAttributes zfas = (ZipFileAttributes)readAttributes();
         LinkedHashMap<String, Object> map = new LinkedHashMap<>();
         if ("*".equals(attributes)) {
             for (AttrID id : AttrID.values()) {
                 try {
                     map.put(id.name(), attribute(id, zfas));

@@ -113,11 +126,11 @@
             }
         }
         return map;
     }
 
-    private Object attribute(AttrID id, ZipFileAttributes zfas) {
+    Object attribute(AttrID id, ZipFileAttributes zfas) {
         switch (id) {
         case size:
             return zfas.size();
         case creationTime:
             return zfas.creationTime();

@@ -145,10 +158,15 @@
             break;
         case method:
             if (isZipView)
                 return zfas.method();
             break;
+        case permissions:
+            if (isZipView) {
+                return zfas.storedPermissions().orElse(null);
+            }
+            break;
         default:
             break;
         }
         return null;
     }
< prev index next >