Masoud Kalali has a software engineering degree and has been working on software development projects since 1998. He has experience with a variety of technologies (.NET, J2EE, CORBA, and COM+) on diverse platforms (Solaris, Linux, and Windows). His experience is in software architecture, design, and server-side development.

Masoud has published several articles at Java.net and Dzone. He has authored multiple refcards, published by Dzone, including but not limited to Using XML in Java, Java EE Security and GlassFish v3 refcardz. He is one of the founder members of NetBeans Dream Team and a GlassFish community spotlighted developer. Recently Masoud's new book, GlassFish Security has been published which covers GlassFish v3 security and Java EE 6 security.

Masoud's main area of research and interest includes service-oriented architecture and large scale systems' development and deployment and in his leisure time he enjoys photography, mountaineering and camping. Masoud's can be followed at his Twitter account.

Masoud has posted 82 posts at DZone. You can read more from them at their website. View Full User Profile

Introducing NIO.2 (JSR 203) Part 3: File System Attributes and Permissions support in NIO.2

07.12.2010
| 4115 views |
  • submit to reddit

In two previous entries I covered Introducing NIO.2 (JSR 203) Part 1: What are new features?  and Introducing NIO.2 (JSR 203) Part 2: The Basics  In this entry I will discuss Attributes introduced in NIO.2. Using attributes we can read platform specific attributes of an element in the file system. For example to hide a file system in DOS file system or to check the last access date of a file in a UNIX machine.

Using NIO.2 we can check which attributes are supported in the platform we are running on and then we can decide how to deal with the available attributes. Following sample code shows how we can detect the available attributes and then how to manipulate them.

  FileSystem fs = FileSystems.getDefault();
Path p = fs.getPath("/home/masoud/netbeans-6.9-ml-linux.sh");
//checking available attributes:
Set<String> supportedViews = fs.supportedFileAttributeViews();
//We always have at least one member in the set, the basic view.
BasicFileAttributes ba = p.getFileAttributeView(BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS).readAttributes();
//Printing some basic attributes
System.out.println(p.toString() + " last access: " + ba.lastAccessTime());
System.out.println(p.toString() + " last modified " + ba.lastModifiedTime());
// As I know I am in NIX machine I access the unix attributes.
// If I didnt I should have iterate over the set to determine which
// attributes are supported
if (supportedViews.contains("unix")) {
PosixFileAttributes pat = Attributes.readPosixFileAttributes(p, LinkOption.NOFOLLOW_LINKS);
System.out.println(pat.group().getName());
System.out.println(pat.owner().getName());
}

I placed plethora of comments on the code so reading and understanding it get easier. 

In the next snippet we will see how we can read permissions of file system element. The first step in checking permissions is using the checkAccess method as shown below. the method throw an exception if the permission is not present or it will execute with no exception if the permission is present.

 FileSystem fs = FileSystems.getDefault();
Path p = fs.getPath("/home/masoud/netbeans-6.9-ml-linux.sh");
try {
// A method to check the access permissin
p.checkAccess(AccessMode.EXECUTE);
} catch (IOException ex) {
Logger.getLogger(perm.class.getName()).log(Level.SEVERE, null, ex);
}

// Extracting all permissions of a file and iterating over them.
//I know that I am dealing with NIX fs so I go directly with that attributes
// otherwise we should check which attributes are supported and then we can
// use them.

PosixFileAttributes patts = Attributes.readPosixFileAttributes(p, LinkOption.NOFOLLOW_LINKS);
Set<PosixFilePermission> st = patts.permissions();
for (Iterator<PosixFilePermission> it = st.iterator(); it.hasNext();) {
System.out.println(it.next().toString());
}

// Using PosixFilePermissions to convert permissions to different representations
System.out.println(PosixFilePermissions.toString(st));

As you can see in the code we can use the helper class to convert the permission set to a simpl OS represeted permission of the element. for example the set can be translated to rwx——  if the file has owner read, write and execute permissions attached to it. The helper calss can convert the os represenation of the permission to the permissions set for later use in other nio classess or methods. In the next entry I will conver more on permissions and security by tackling the Access Control List (ACL) support in the nio.2

 

From http://kalali.me/introducing-nio-2-jsr-203-part-3-file-system-attributes-and-permissions-support-in-nio-2/

Published at DZone with permission of its author, Masoud Kalali.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Tags: