|
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 } |