I thought I'd expand on why I got so excited about NIO 2.0 and JSR 203 as well as the other changes in Java 7. I can see I have done a bad job of selling the benefits of a refactoring for potential volunteers. Reading through the changes that were introduced in Java 7, it seems to me that Ant was probably an inspiration for a lot of them.

Others come from taking the performance of I/O on Java more seriously. This has the potential to speed Ant up enormously. Projects like Tim Bray's Wide Finder 2[1] showcased just how badly Java performed and benchmarks like that may have been an impetus to focus resources on taking advantage of all the features of the native filesystems. Unfortunately the results of the project are lost due to Oracle's acquisition of Sun, but you can still see the results from the original Wide Finder 1[2] although there isn't even an attempt to do a Java implementation there. I can tell you from memory that the final results on WF2 were several C implementations with innovative I/O using parallel processing at the top, erlang and ruby and scala were up there, but the fastest Java implementation was in the double digits in the list as I recall.

The basics for file handling in Java 7 are provided by Path and the Paths Utility class, along with the FileSystemProvider classes. If Ant 2 were created to make Resource a fundamental element and Path the Resource that represented something on a file system (native file systems, zip/jar file systems, and I expect eventually open source projects will add others like HTTP, FTP, NFS and Samba), I think the LOC count on Ant could be reduced tremendously. Writing patches would be simplified and contributing to Ant would have a lower barrier to entry for new people coming in. Path is immutable which suits Ant well. Path has methods to access elements in a file path, compare, test, normalize, and relativize paths in the ways that Ant has code to do. It has all kinds of features for determining accessibility on the native filesystem and bulk loading file metadata attributes whereas currently it is done one field at a time. Symbolic link identification and handling is a core feature. And converting to and from File objects is trivial.

Add to that the new methods on File. There is also a Files utility helper class. Files covers the most basic tasks in Ant implemented using all the features of the native filesystem to make them as fast as possible: copying; deleting; moving; reading file contents; writing; creating directories, file and links; getting input and output streams. There is also recursion with a method for walking a file tree that creates a FileVisitor interface implementation, either default or custom, with 3 phases: previsit directory, visit file, and postvisit directory. It also provides for a visit file failed method. At each point you can continue, stop, skip subtree, or skip other entries in the current directory. Options control whether symlinks are followed, and cycles are detected.

DirectoryStream includes filters like glob, regex, and custom implementations that could be perfect for implementing Selectors. DirectoryStream uses less resources and works much better with remote resources. It also handles directories that are very large much more efficiently.

Error handling throughout is by exception rather than boolean value as it is now, which I'm sure we all agree is preferable.

Then there is the Watch Service which uses the native eventing service if available, where you can get events in your build when a file is created or deleted, or when a directory is modified. Would we translate it into something for BuildListeners? How would we harness it, scheduling a target and its dependencies when the a watch fired an event?

I could keep going but this is getting rather long. I'll just point out a few resources from other people that are clearer than I am and have more detail: The Java 7 feature list[3] is comprehensive but has little on the impact of features; this Doctor Dobbs post[4] has good code examples for how NIO 2 could be used by Ant; an article listing "8 things I found most useful"[5], all of which are relevant to a simplified Ant implementation, details the NIO 2 changes at #8; interviews with Alan Bateman in text[6], video[7], and podcast[8] are interesting, as is a JavaOne 2011 slide show[9]; Leandro Pezzente sent me a link[10] (thanks, Leandro) that lists some of the other changes to Java 7 to think about, although it only mentions the file system changes that JSR 203 introduces in passing.

[1] http://www.tbray.org/ongoing/When/200x/2008/05/01/Wide-Finder-2
[2] http://www.tbray.org/ongoing/When/200x/2007/10/30/WF-Results
[3] http://openjdk.java.net/projects/jdk7/features/#f250
[4] http://drdobbs.com/blogs/jvm/231600403
[5] http://jaxenter.com/java-7-the-top-8-features-37156.html
[6] http://www.artima.com/lejava/articles/more_new_io.html
[7] http://www.youtube.com/watch?v=yNRS1ssLPdQ
[8] https://blogs.oracle.com/javaspotlight/entry/java_spotlight_episode_59_alan
[9] http://openjdk.java.net/projects/nio/presentations/TS-5052.pdf
[10] http://marxsoftware.blogspot.com/2011/03/jdk-7-new-interfaces-classes-enums-and.html


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
For additional commands, e-mail: dev-h...@ant.apache.org

Reply via email to