src/java.base/share/classes/jdk/internal/jrtfs/JrtFileAttributeView.java
Print this page
*** 27,36 ****
--- 27,37 ----
import java.nio.file.LinkOption;
import java.nio.file.attribute.*;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
+ import java.util.Objects;
/**
* File attribute view for jrt file system.
*
* @implNote This class needs to maintain JDK 8 source compatibility.
*** 40,50 ****
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
*/
final class JrtFileAttributeView implements BasicFileAttributeView {
private static enum AttrID {
-
size,
creationTime,
lastAccessTime,
lastModifiedTime,
isDirectory,
--- 41,50 ----
*** 54,91 ****
fileKey,
compressedSize,
extension
};
! private final AbstractJrtPath path;
private final boolean isJrtView;
private final LinkOption[] options;
! private JrtFileAttributeView(AbstractJrtPath path, boolean isJrtView, LinkOption... options) {
this.path = path;
this.isJrtView = isJrtView;
this.options = options;
}
@SuppressWarnings("unchecked") // Cast to V
! static <V extends FileAttributeView> V get(AbstractJrtPath path, Class<V> type, LinkOption... options) {
! if (type == null) {
! throw new NullPointerException();
! }
if (type == BasicFileAttributeView.class) {
return (V) new JrtFileAttributeView(path, false, options);
}
if (type == JrtFileAttributeView.class) {
return (V) new JrtFileAttributeView(path, true, options);
}
return null;
}
! static JrtFileAttributeView get(AbstractJrtPath path, String type, LinkOption... options) {
! if (type == null) {
! throw new NullPointerException();
! }
if (type.equals("basic")) {
return new JrtFileAttributeView(path, false, options);
}
if (type.equals("jrt")) {
return new JrtFileAttributeView(path, true, options);
--- 54,87 ----
fileKey,
compressedSize,
extension
};
! private final JrtPath path;
private final boolean isJrtView;
private final LinkOption[] options;
! private JrtFileAttributeView(JrtPath path, boolean isJrtView, LinkOption... options) {
this.path = path;
this.isJrtView = isJrtView;
this.options = options;
}
@SuppressWarnings("unchecked") // Cast to V
! static <V extends FileAttributeView> V get(JrtPath path, Class<V> type, LinkOption... options) {
! Objects.requireNonNull(type);
if (type == BasicFileAttributeView.class) {
return (V) new JrtFileAttributeView(path, false, options);
}
if (type == JrtFileAttributeView.class) {
return (V) new JrtFileAttributeView(path, true, options);
}
return null;
}
! static JrtFileAttributeView get(JrtPath path, String type, LinkOption... options) {
! Objects.requireNonNull(type);
if (type.equals("basic")) {
return new JrtFileAttributeView(path, false, options);
}
if (type.equals("jrt")) {
return new JrtFileAttributeView(path, true, options);
*** 97,161 ****
public String name() {
return isJrtView ? "jrt" : "basic";
}
@Override
! public AbstractJrtFileAttributes readAttributes() throws IOException {
return path.getAttributes(options);
}
@Override
public void setTimes(FileTime lastModifiedTime,
FileTime lastAccessTime,
! FileTime createTime)
! 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 {
! AbstractJrtFileAttributes jrtfas = readAttributes();
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
if ("*".equals(attributes)) {
for (AttrID id : AttrID.values()) {
! try {
! map.put(id.name(), attribute(id, jrtfas));
! } catch (IllegalArgumentException x) {
! }
}
} else {
String[] as = attributes.split(",");
for (String a : as) {
! try {
! map.put(a, attribute(AttrID.valueOf(a), jrtfas));
! } catch (IllegalArgumentException x) {
! }
}
}
return map;
}
! Object attribute(AttrID id, AbstractJrtFileAttributes jrtfas) {
switch (id) {
case size:
return jrtfas.size();
case creationTime:
return jrtfas.creationTime();
--- 93,170 ----
public String name() {
return isJrtView ? "jrt" : "basic";
}
@Override
! public JrtFileAttributes readAttributes() throws IOException {
return path.getAttributes(options);
}
@Override
public void setTimes(FileTime lastModifiedTime,
FileTime lastAccessTime,
! FileTime createTime) throws IOException {
path.setTimes(lastModifiedTime, lastAccessTime, createTime);
}
! static void setAttribute(JrtPath path, String attribute, Object value)
throws IOException {
! int colonPos = attribute.indexOf(':');
! if (colonPos != -1) { // type = "basic", if no ":"
! String type = attribute.substring(0, colonPos++);
! if (!type.equals("basic") && !type.equals("jrt")) {
! throw new UnsupportedOperationException(
! "view <" + type + "> is not supported");
}
! attribute = attribute.substring(colonPos);
}
! try {
! AttrID id = AttrID.valueOf(attribute);
! if (id == AttrID.lastModifiedTime) {
! path.setTimes((FileTime) value, null, null);
! } else if (id == AttrID.lastAccessTime) {
! path.setTimes(null, (FileTime) value, null);
! } else if (id == AttrID.creationTime) {
! path.setTimes(null, null, (FileTime) value);
}
return;
! } catch (IllegalArgumentException x) {}
throw new UnsupportedOperationException("'" + attribute
+ "' is unknown or read-only attribute");
}
! static Map<String, Object> readAttributes(JrtPath path, String attributes,
! LinkOption... options)
throws IOException {
! int colonPos = attributes.indexOf(':');
! boolean isJrtView = false;
! if (colonPos != -1) { // type = "basic", if no ":"
! String type = attributes.substring(0, colonPos++);
! if (!type.equals("basic") && !type.equals("jrt")) {
! throw new UnsupportedOperationException("view <" + type +
! "> is not supported");
! }
! isJrtView = true;
! attributes = attributes.substring(colonPos);
! }
! JrtFileAttributes jrtfas = path.getAttributes();
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
if ("*".equals(attributes)) {
for (AttrID id : AttrID.values()) {
! map.put(id.name(), attribute(id, jrtfas, isJrtView));
}
} else {
String[] as = attributes.split(",");
for (String a : as) {
! //throw IllegalArgumentException
! map.put(a, attribute(AttrID.valueOf(a), jrtfas, isJrtView));
}
}
return map;
}
! static Object attribute(AttrID id, JrtFileAttributes jrtfas, boolean isJrtView) {
switch (id) {
case size:
return jrtfas.size();
case creationTime:
return jrtfas.creationTime();