6873621: (file) FileStore.supportsFileAttributeView(Class<FileAttributeView> type) returns wrong result

Reviewed-by: andrew
This commit is contained in:
Alan Bateman 2009-09-04 18:15:50 +01:00
parent 58285b80f7
commit 98e07b99bf
6 changed files with 55 additions and 23 deletions

View File

@ -57,9 +57,9 @@ public class Xdd {
Path file = (args.length == 1) ? Path file = (args.length == 1) ?
Paths.get(args[0]) : Paths.get(args[2]); Paths.get(args[0]) : Paths.get(args[2]);
// check that user defined attributes are supported by the file system // check that user defined attributes are supported by the file store
FileStore store = file.getFileStore(); FileStore store = file.getFileStore();
if (!store.supportsFileAttributeView("user")) { if (!store.supportsFileAttributeView(UserDefinedFileAttributeView.class)) {
System.err.format("UserDefinedFileAttributeView not supported on %s\n", store); System.err.format("UserDefinedFileAttributeView not supported on %s\n", store);
System.exit(-1); System.exit(-1);

View File

@ -25,6 +25,7 @@
package sun.nio.fs; package sun.nio.fs;
import java.nio.file.attribute.*;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
@ -113,10 +114,12 @@ class LinuxFileStore
} }
@Override @Override
public boolean supportsFileAttributeView(String name) { public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
// support DosFileAttributeView and UserDefinedAttributeView if extended // support DosFileAttributeView and UserDefinedAttributeView if extended
// attributes enabled // attributes enabled
if (name.equals("dos") || name.equals("user")) { if (type == DosFileAttributeView.class ||
type == UserDefinedFileAttributeView.class)
{
// lookup fstypes.properties // lookup fstypes.properties
FeatureStatus status = checkIfFeaturePresent("user_xattr"); FeatureStatus status = checkIfFeaturePresent("user_xattr");
if (status == FeatureStatus.PRESENT) if (status == FeatureStatus.PRESENT)
@ -142,7 +145,15 @@ class LinuxFileStore
} }
return xattrEnabled; return xattrEnabled;
} }
return super.supportsFileAttributeView(type);
}
@Override
public boolean supportsFileAttributeView(String name) {
if (name.equals("dos"))
return supportsFileAttributeView(DosFileAttributeView.class);
if (name.equals("user"))
return supportsFileAttributeView(UserDefinedFileAttributeView.class);
return super.supportsFileAttributeView(name); return super.supportsFileAttributeView(name);
} }

View File

@ -25,6 +25,7 @@
package sun.nio.fs; package sun.nio.fs;
import java.nio.file.attribute.*;
import java.io.IOException; import java.io.IOException;
import static sun.nio.fs.UnixNativeDispatcher.*; import static sun.nio.fs.UnixNativeDispatcher.*;
@ -72,27 +73,39 @@ class SolarisFileStore
} }
@Override @Override
public boolean supportsFileAttributeView(String name) { public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
if (name.equals("acl")) { if (type == AclFileAttributeView.class) {
// lookup fstypes.properties // lookup fstypes.properties
FeatureStatus status = checkIfFeaturePresent("nfsv4acl"); FeatureStatus status = checkIfFeaturePresent("nfsv4acl");
if (status == FeatureStatus.PRESENT) switch (status) {
return true; case PRESENT : return true;
if (status == FeatureStatus.NOT_PRESENT) case NOT_PRESENT : return false;
return false; default :
// AclFileAttributeView available on ZFS // AclFileAttributeView available on ZFS
return (type().equals("zfs")); return (type().equals("zfs"));
} }
if (name.equals("user")) { }
if (type == UserDefinedFileAttributeView.class) {
// lookup fstypes.properties // lookup fstypes.properties
FeatureStatus status = checkIfFeaturePresent("xattr"); FeatureStatus status = checkIfFeaturePresent("xattr");
if (status == FeatureStatus.PRESENT) switch (status) {
return true; case PRESENT : return true;
if (status == FeatureStatus.NOT_PRESENT) case NOT_PRESENT : return false;
return false; default :
// UserDefinedFileAttributeView available if extended
// attributes supported
return xattrEnabled; return xattrEnabled;
} }
}
return super.supportsFileAttributeView(type);
}
@Override
public boolean supportsFileAttributeView(String name) {
if (name.equals("acl"))
return supportsFileAttributeView(AclFileAttributeView.class);
if (name.equals("user"))
return supportsFileAttributeView(UserDefinedFileAttributeView.class);
return super.supportsFileAttributeView(name); return super.supportsFileAttributeView(name);
} }

View File

@ -145,9 +145,8 @@ abstract class UnixFileStore
{ {
// lookup fstypes.properties // lookup fstypes.properties
FeatureStatus status = checkIfFeaturePresent("posix"); FeatureStatus status = checkIfFeaturePresent("posix");
if (status == FeatureStatus.NOT_PRESENT) // assume supported if UNKNOWN
return false; return (status != FeatureStatus.NOT_PRESENT);
return true;
} }
return false; return false;
} }

View File

@ -153,7 +153,7 @@ class WindowsFileStore
public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) { public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
if (type == null) if (type == null)
throw new NullPointerException(); throw new NullPointerException();
if (type == BasicFileAttributeView.class) if (type == BasicFileAttributeView.class || type == DosFileAttributeView.class)
return true; return true;
if (type == AclFileAttributeView.class || type == FileOwnerAttributeView.class) if (type == AclFileAttributeView.class || type == FileOwnerAttributeView.class)
return ((volInfo.flags() & FILE_PERSISTENT_ACLS) != 0); return ((volInfo.flags() & FILE_PERSISTENT_ACLS) != 0);

View File

@ -22,7 +22,7 @@
*/ */
/* @test /* @test
* @bug 4313887 * @bug 4313887 6873621
* @summary Unit test for java.nio.file.FileStore * @summary Unit test for java.nio.file.FileStore
* @library .. * @library ..
*/ */
@ -67,6 +67,15 @@ public class Basic {
* Test: File and FileStore attributes * Test: File and FileStore attributes
*/ */
assertTrue(store1.supportsFileAttributeView("basic")); assertTrue(store1.supportsFileAttributeView("basic"));
assertTrue(store1.supportsFileAttributeView(BasicFileAttributeView.class));
assertTrue(store1.supportsFileAttributeView("posix") ==
store1.supportsFileAttributeView(PosixFileAttributeView.class));
assertTrue(store1.supportsFileAttributeView("dos") ==
store1.supportsFileAttributeView(DosFileAttributeView.class));
assertTrue(store1.supportsFileAttributeView("acl") ==
store1.supportsFileAttributeView(AclFileAttributeView.class));
assertTrue(store1.supportsFileAttributeView("user") ==
store1.supportsFileAttributeView(UserDefinedFileAttributeView.class));
/** /**
* Test: Enumerate all FileStores * Test: Enumerate all FileStores