< prev index next >

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

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

*** 1,7 **** /* ! * 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 --- 1,7 ---- /* ! * Copyright (c) 2009, 2019, 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
*** 26,43 **** package jdk.nio.zipfs; import java.io.IOException; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.FileAttributeView; import java.nio.file.attribute.FileTime; import java.util.LinkedHashMap; import java.util.Map; /** * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal */ ! class ZipFileAttributeView implements BasicFileAttributeView { private static enum AttrID { size, creationTime, lastAccessTime, lastModifiedTime, --- 26,49 ---- package jdk.nio.zipfs; import java.io.IOException; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.FileAttributeView; + import java.nio.file.attribute.FileOwnerAttributeView; 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 */ ! class ZipFileAttributeView implements PosixFileAttributeView { private static enum AttrID { size, creationTime, lastAccessTime, lastModifiedTime,
*** 46,92 **** isSymbolicLink, isOther, fileKey, compressedSize, crc, ! method }; private final ZipPath path; ! private final boolean isZipView; ! private ZipFileAttributeView(ZipPath path, boolean isZipView) { this.path = path; ! this.isZipView = isZipView; } @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); if (type == ZipFileAttributeView.class) ! return (V)new ZipFileAttributeView(path, true); ! return null; } static ZipFileAttributeView get(ZipPath path, String type) { if (type == null) throw new NullPointerException(); ! if (type.equals("basic")) ! return new ZipFileAttributeView(path, false); ! if (type.equals("zip")) ! return new ZipFileAttributeView(path, true); ! return null; } @Override public String name() { ! return isZipView ? "zip" : "basic"; } public ZipFileAttributes readAttributes() throws IOException { return path.getAttributes(); } @Override --- 52,122 ---- isSymbolicLink, isOther, fileKey, compressedSize, crc, ! method, ! storedPermissions, ! owner, ! group, ! permissions }; + private static enum ViewType { + basic, + owner, + posix, + zip + } + private final ZipPath path; ! private final ViewType type; ! private ZipFileAttributeView(ZipPath path, ViewType type) { this.path = path; ! this.type = type; } @SuppressWarnings("unchecked") // Cast to V static <V extends FileAttributeView> V get(ZipPath path, Class<V> type) { if (type == BasicFileAttributeView.class) ! return (V)new ZipFileAttributeView(path, ViewType.basic); if (type == ZipFileAttributeView.class) ! return (V)new ZipFileAttributeView(path, ViewType.zip); ! if (path.zfs.supportPosix) { ! if (type == PosixFileAttributeView.class) ! return (V)new ZipFileAttributeView(path, ViewType.posix); ! if (type == FileOwnerAttributeView.class) ! return (V)new ZipFileAttributeView(path, ViewType.owner); ! } ! if (type == null) ! throw new NullPointerException(); ! throw new UnsupportedOperationException(); } static ZipFileAttributeView get(ZipPath path, String type) { if (type == null) throw new NullPointerException(); ! if (type.equals(ViewType.basic.name())) ! return new ZipFileAttributeView(path, ViewType.basic); ! if (type.equals(ViewType.zip.name())) ! return new ZipFileAttributeView(path, ViewType.zip); ! if (path.zfs.supportPosix) { ! if (type.equals(ViewType.posix.name())) ! return new ZipFileAttributeView(path, ViewType.posix); ! if (type.equals(ViewType.owner.name())) ! return new ZipFileAttributeView(path, ViewType.owner); ! } ! throw new UnsupportedOperationException("view <" + type + "> is not supported"); } @Override public String name() { ! return type.name(); } + @Override public ZipFileAttributes readAttributes() throws IOException { return path.getAttributes(); } @Override
*** 96,119 **** throws IOException { path.setTimes(lastModifiedTime, lastAccessTime, createTime); } 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); return; ! } catch (IllegalArgumentException x) {} ! throw new UnsupportedOperationException("'" + attribute + ! "' is unknown or read-only attribute"); } Map<String, Object> readAttributes(String attributes) throws IOException { --- 126,174 ---- throws IOException { path.setTimes(lastModifiedTime, lastAccessTime, createTime); } + @Override + public UserPrincipal getOwner() throws IOException { + return readAttributes().owner(); + } + + @Override + public void setOwner(UserPrincipal owner) throws IOException { + path.setOwner(owner); + } + + @Override + public void setPermissions(Set<PosixFilePermission> perms) throws IOException { + path.setPermissions(perms); + } + + @Override + public void setGroup(GroupPrincipal group) throws IOException { + path.setGroup(group); + } + + @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 || + AttrID.valueOf(attribute) == AttrID.storedPermissions) + setPermissions((Set<PosixFilePermission>)value); return; ! } catch (IllegalArgumentException x) { ! throw new UnsupportedOperationException("'" + attribute + ! "' is unknown or read-only attribute"); ! } } Map<String, Object> readAttributes(String attributes) throws IOException {
*** 134,144 **** } } return map; } ! Object attribute(AttrID id, ZipFileAttributes zfas) { switch (id) { case size: return zfas.size(); case creationTime: return zfas.creationTime(); --- 189,199 ---- } } return map; } ! private Object attribute(AttrID id, ZipFileAttributes zfas) { switch (id) { case size: return zfas.size(); case creationTime: return zfas.creationTime();
*** 154,174 **** return zfas.isSymbolicLink(); case isOther: return zfas.isOther(); case fileKey: return zfas.fileKey(); case compressedSize: ! if (isZipView) return zfas.compressedSize(); break; case crc: ! if (isZipView) return zfas.crc(); break; case method: ! if (isZipView) return zfas.method(); break; } return null; } } --- 209,252 ---- return zfas.isSymbolicLink(); case isOther: return zfas.isOther(); case fileKey: return zfas.fileKey(); + case owner: + if (type== ViewType.owner || type == ViewType.posix || type == ViewType.zip) { + return zfas.owner(); + } + break; + case group: + if (type == ViewType.posix || type == ViewType.zip) { + return zfas.group(); + } + break; + case permissions: + if (type == ViewType.posix || type == ViewType.zip) { + return zfas.permissions(); + } + break; case compressedSize: ! if (type == ViewType.zip) { return zfas.compressedSize(); + } break; case crc: ! if (type == ViewType.zip) { return zfas.crc(); + } break; case method: ! if (type == ViewType.zip) { return zfas.method(); + } + break; + case storedPermissions: + if (type == ViewType.zip) { + return zfas.storedPermissions().orElse(null); + } break; } return null; } }
< prev index next >