< prev index next >

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

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

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -23,21 +23,26 @@
  * questions.
  */
 
 package jdk.nio.zipfs;
 
-import java.nio.file.attribute.*;
 import java.io.IOException;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.nio.file.attribute.FileAttributeView;
+import java.nio.file.attribute.FileTime;
+import java.nio.file.attribute.GroupPrincipal;
+import java.nio.file.attribute.PosixFileAttributeView;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.UserPrincipal;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Set;
 
-/*
- * @author  Xueming Shen, Rajendra Gutupalli, Jaya Hangal
+/**
+ * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal
  */
-
-class ZipFileAttributeView implements BasicFileAttributeView
-{
+class ZipFileAttributeView implements PosixFileAttributeView {
     private static enum AttrID {
         size,
         creationTime,
         lastAccessTime,
         lastModifiedTime,

@@ -46,49 +51,67 @@
         isSymbolicLink,
         isOther,
         fileKey,
         compressedSize,
         crc,
-        method
+        method,
+        permissions
     };
 
+    private static enum ViewType {
+        zip,
+        posix,
+        basic
+    }
+
     private final ZipPath path;
-    private final boolean isZipView;
+    private final ViewType type;
 
-    private ZipFileAttributeView(ZipPath path, boolean isZipView) {
+    private ZipFileAttributeView(ZipPath path, ViewType type) {
         this.path = path;
-        this.isZipView = isZipView;
+        this.type = type;
     }
 
     @SuppressWarnings("unchecked") // Cast to V
     static <V extends FileAttributeView> V get(ZipPath path, Class<V> type) {
         if (type == null)
             throw new NullPointerException();
         if (type == BasicFileAttributeView.class)
-            return (V)new ZipFileAttributeView(path, false);
+            return (V)new ZipFileAttributeView(path, ViewType.basic);
+        if (type == PosixFileAttributeView.class)
+            return (V)new ZipFileAttributeView(path, ViewType.posix);
         if (type == ZipFileAttributeView.class)
-            return (V)new ZipFileAttributeView(path, true);
+            return (V)new ZipFileAttributeView(path, ViewType.zip);
         return null;
     }
 
     static ZipFileAttributeView get(ZipPath path, String type) {
         if (type == null)
             throw new NullPointerException();
         if (type.equals("basic"))
-            return new ZipFileAttributeView(path, false);
+            return new ZipFileAttributeView(path, ViewType.basic);
+        if (type.equals("posix"))
+            return new ZipFileAttributeView(path, ViewType.posix);
         if (type.equals("zip"))
-            return new ZipFileAttributeView(path, true);
+            return new ZipFileAttributeView(path, ViewType.zip);
         return null;
     }
 
     @Override
     public String name() {
-        return isZipView ? "zip" : "basic";
+        switch (type) {
+        case zip:
+            return "zip";
+        case posix:
+            return "posix";
+        case basic:
+        default:
+            return "basic";
+        }
     }
 
-    public ZipFileAttributes readAttributes() throws IOException
-    {
+    public ZipFileAttributes readAttributes() throws IOException {
         return path.getAttributes();
     }
 
     @Override
     public void setTimes(FileTime lastModifiedTime,

@@ -102,15 +125,15 @@
     void setAttribute(String attribute, Object value)
         throws IOException
     {
         try {
             if (AttrID.valueOf(attribute) == AttrID.lastModifiedTime)
-                setTimes ((FileTime)value, null, null);
+                setTimes((FileTime)value, null, null);
             if (AttrID.valueOf(attribute) == AttrID.lastAccessTime)
-                setTimes (null, (FileTime)value, null);
+                setTimes(null, (FileTime)value, null);
             if (AttrID.valueOf(attribute) == AttrID.creationTime)
-                setTimes (null, null, (FileTime)value);
+                setTimes(null, null, (FileTime)value);
             return;
         } catch (IllegalArgumentException x) {}
         throw new UnsupportedOperationException("'" + attribute +
             "' is unknown or read-only attribute");
     }

@@ -156,20 +179,49 @@
         case isOther:
             return zfas.isOther();
         case fileKey:
             return zfas.fileKey();
         case compressedSize:
-            if (isZipView)
+            if (type == ViewType.zip)
                 return zfas.compressedSize();
             break;
         case crc:
-            if (isZipView)
+            if (type == ViewType.zip)
                 return zfas.crc();
             break;
         case method:
-            if (isZipView)
+            if (type == ViewType.zip)
                 return zfas.method();
             break;
+        case permissions:
+            if (type == ViewType.zip || type == ViewType.posix) {
+                try {
+                   return zfas.permissions();
+                } catch (UnsupportedOperationException e) {
+                    return null;
+                }
+            }
+            break;
         }
         return null;
     }
+
+    @Override
+    public UserPrincipal getOwner() throws IOException {
+        throw new UnsupportedOperationException("ZipFileSystem does not support getOwner.");
+    }
+
+    @Override
+    public void setOwner(UserPrincipal owner) throws IOException {
+        throw new UnsupportedOperationException("ZipFileSystem does not support setOwner.");
+    }
+
+    @Override
+    public void setPermissions(Set<PosixFilePermission> perms) throws IOException {
+        readAttributes().setPermissions(perms);
+    }
+
+    @Override
+    public void setGroup(GroupPrincipal group) throws IOException {
+        throw new UnsupportedOperationException("ZipFileSystem does not support setGroup.");
+    }
 }
< prev index next >