1 /* 2 * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.nio.zipfs; 27 28 import java.nio.file.attribute.*; 29 import java.io.IOException; 30 import java.util.LinkedHashMap; 31 import java.util.Map; 32 33 /* 34 * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal 35 */ 36 37 class ZipFileAttributeView implements BasicFileAttributeView 38 { 39 private static enum AttrID { 40 size, 41 creationTime, 42 lastAccessTime, 43 lastModifiedTime, 44 isDirectory, 45 isRegularFile, 46 isSymbolicLink, 47 isOther, 48 fileKey, 49 compressedSize, 50 crc, 51 method 52 }; 53 54 private final ZipPath path; 55 private final boolean isZipView; 56 57 private ZipFileAttributeView(ZipPath path, boolean isZipView) { 58 this.path = path; 59 this.isZipView = isZipView; 60 } 61 62 @SuppressWarnings("unchecked") // Cast to V 63 static <V extends FileAttributeView> V get(ZipPath path, Class<V> type) { 64 if (type == null) 65 throw new NullPointerException(); 66 if (type == BasicFileAttributeView.class) 67 return (V)new ZipFileAttributeView(path, false); 68 if (type == ZipFileAttributeView.class) 69 return (V)new ZipFileAttributeView(path, true); 70 return null; 71 } 72 73 static ZipFileAttributeView get(ZipPath path, String type) { 74 if (type == null) 75 throw new NullPointerException(); 76 if (type.equals("basic")) 77 return new ZipFileAttributeView(path, false); 78 if (type.equals("zip")) 79 return new ZipFileAttributeView(path, true); 80 return null; 81 } 82 83 @Override 84 public String name() { 85 return isZipView ? "zip" : "basic"; 86 } 87 88 public ZipFileAttributes readAttributes() throws IOException 89 { 90 return path.getAttributes(); 91 } 92 93 @Override 94 public void setTimes(FileTime lastModifiedTime, 95 FileTime lastAccessTime, 96 FileTime createTime) 97 throws IOException 98 { 99 path.setTimes(lastModifiedTime, lastAccessTime, createTime); 100 } 101 102 void setAttribute(String attribute, Object value) 103 throws IOException 104 { 105 try { 106 if (AttrID.valueOf(attribute) == AttrID.lastModifiedTime) 107 setTimes ((FileTime)value, null, null); 108 if (AttrID.valueOf(attribute) == AttrID.lastAccessTime) 109 setTimes (null, (FileTime)value, null); 110 if (AttrID.valueOf(attribute) == AttrID.creationTime) 111 setTimes (null, null, (FileTime)value); 112 return; 113 } catch (IllegalArgumentException x) {} 114 throw new UnsupportedOperationException("'" + attribute + 115 "' is unknown or read-only attribute"); 116 } 117 118 Map<String, Object> readAttributes(String attributes) 119 throws IOException 120 { 121 ZipFileAttributes zfas = readAttributes(); 122 LinkedHashMap<String, Object> map = new LinkedHashMap<>(); 123 if ("*".equals(attributes)) { 124 for (AttrID id : AttrID.values()) { 125 try { 126 map.put(id.name(), attribute(id, zfas)); 127 } catch (IllegalArgumentException x) {} 128 } 129 } else { 130 String[] as = attributes.split(","); 131 for (String a : as) { 132 try { 133 map.put(a, attribute(AttrID.valueOf(a), zfas)); 134 } catch (IllegalArgumentException x) {} 135 } 136 } 137 return map; 138 } 139 140 Object attribute(AttrID id, ZipFileAttributes zfas) { 141 switch (id) { 142 case size: 143 return zfas.size(); 144 case creationTime: 145 return zfas.creationTime(); 146 case lastAccessTime: 147 return zfas.lastAccessTime(); 148 case lastModifiedTime: 149 return zfas.lastModifiedTime(); 150 case isDirectory: 151 return zfas.isDirectory(); 152 case isRegularFile: 153 return zfas.isRegularFile(); 154 case isSymbolicLink: 155 return zfas.isSymbolicLink(); 156 case isOther: 157 return zfas.isOther(); 158 case fileKey: 159 return zfas.fileKey(); 160 case compressedSize: 161 if (isZipView) 162 return zfas.compressedSize(); 163 break; 164 case crc: 165 if (isZipView) 166 return zfas.crc(); 167 break; 168 case method: 169 if (isZipView) 170 return zfas.method(); 171 break; 172 } 173 return null; 174 } 175 }