|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.nio.fs; |
|
|
|
import java.nio.file.attribute.*; |
|
import java.util.*; |
|
import java.io.IOException; |
|
|
|
/** |
|
* Base implementation of BasicFileAttributeView |
|
*/ |
|
|
|
abstract class AbstractBasicFileAttributeView |
|
implements BasicFileAttributeView, DynamicFileAttributeView |
|
{ |
|
private static final String SIZE_NAME = "size"; |
|
private static final String CREATION_TIME_NAME = "creationTime"; |
|
private static final String LAST_ACCESS_TIME_NAME = "lastAccessTime"; |
|
private static final String LAST_MODIFIED_TIME_NAME = "lastModifiedTime"; |
|
private static final String FILE_KEY_NAME = "fileKey"; |
|
private static final String IS_DIRECTORY_NAME = "isDirectory"; |
|
private static final String IS_REGULAR_FILE_NAME = "isRegularFile"; |
|
private static final String IS_SYMBOLIC_LINK_NAME = "isSymbolicLink"; |
|
private static final String IS_OTHER_NAME = "isOther"; |
|
|
|
|
|
static final Set<String> basicAttributeNames = |
|
Util.newSet(SIZE_NAME, |
|
CREATION_TIME_NAME, |
|
LAST_ACCESS_TIME_NAME, |
|
LAST_MODIFIED_TIME_NAME, |
|
FILE_KEY_NAME, |
|
IS_DIRECTORY_NAME, |
|
IS_REGULAR_FILE_NAME, |
|
IS_SYMBOLIC_LINK_NAME, |
|
IS_OTHER_NAME); |
|
|
|
protected AbstractBasicFileAttributeView() { } |
|
|
|
@Override |
|
public String name() { |
|
return "basic"; |
|
} |
|
|
|
@Override |
|
public void setAttribute(String attribute, Object value) |
|
throws IOException |
|
{ |
|
if (attribute.equals(LAST_MODIFIED_TIME_NAME)) { |
|
setTimes((FileTime)value, null, null); |
|
return; |
|
} |
|
if (attribute.equals(LAST_ACCESS_TIME_NAME)) { |
|
setTimes(null, (FileTime)value, null); |
|
return; |
|
} |
|
if (attribute.equals(CREATION_TIME_NAME)) { |
|
setTimes(null, null, (FileTime)value); |
|
return; |
|
} |
|
throw new IllegalArgumentException("'" + name() + ":" + |
|
attribute + "' not recognized"); |
|
} |
|
|
|
|
|
|
|
*/ |
|
static class AttributesBuilder { |
|
private Set<String> names = new HashSet<>(); |
|
private Map<String,Object> map = new HashMap<>(); |
|
private boolean copyAll; |
|
|
|
private AttributesBuilder(Set<String> allowed, String[] requested) { |
|
for (String name: requested) { |
|
if (name.equals("*")) { |
|
copyAll = true; |
|
} else { |
|
if (!allowed.contains(name)) |
|
throw new IllegalArgumentException("'" + name + "' not recognized"); |
|
names.add(name); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
static AttributesBuilder create(Set<String> allowed, String[] requested) { |
|
return new AttributesBuilder(allowed, requested); |
|
} |
|
|
|
|
|
|
|
*/ |
|
boolean match(String name) { |
|
return copyAll || names.contains(name); |
|
} |
|
|
|
void add(String name, Object value) { |
|
map.put(name, value); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
Map<String,Object> unmodifiableMap() { |
|
return Collections.unmodifiableMap(map); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
final void addRequestedBasicAttributes(BasicFileAttributes attrs, |
|
AttributesBuilder builder) |
|
{ |
|
if (builder.match(SIZE_NAME)) |
|
builder.add(SIZE_NAME, attrs.size()); |
|
if (builder.match(CREATION_TIME_NAME)) |
|
builder.add(CREATION_TIME_NAME, attrs.creationTime()); |
|
if (builder.match(LAST_ACCESS_TIME_NAME)) |
|
builder.add(LAST_ACCESS_TIME_NAME, attrs.lastAccessTime()); |
|
if (builder.match(LAST_MODIFIED_TIME_NAME)) |
|
builder.add(LAST_MODIFIED_TIME_NAME, attrs.lastModifiedTime()); |
|
if (builder.match(FILE_KEY_NAME)) |
|
builder.add(FILE_KEY_NAME, attrs.fileKey()); |
|
if (builder.match(IS_DIRECTORY_NAME)) |
|
builder.add(IS_DIRECTORY_NAME, attrs.isDirectory()); |
|
if (builder.match(IS_REGULAR_FILE_NAME)) |
|
builder.add(IS_REGULAR_FILE_NAME, attrs.isRegularFile()); |
|
if (builder.match(IS_SYMBOLIC_LINK_NAME)) |
|
builder.add(IS_SYMBOLIC_LINK_NAME, attrs.isSymbolicLink()); |
|
if (builder.match(IS_OTHER_NAME)) |
|
builder.add(IS_OTHER_NAME, attrs.isOther()); |
|
} |
|
|
|
@Override |
|
public Map<String,Object> readAttributes(String[] requested) |
|
throws IOException |
|
{ |
|
AttributesBuilder builder = |
|
AttributesBuilder.create(basicAttributeNames, requested); |
|
addRequestedBasicAttributes(readAttributes(), builder); |
|
return builder.unmodifiableMap(); |
|
} |
|
} |