Author: midon
Date: Tue Mar 31 21:37:24 2009
New Revision: 760666

URL: http://svn.apache.org/viewvc?rev=760666&view=rev
Log:
ODE-566: sort files lexicographically but with files before sudirectories

Modified:
    
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/fs/FileUtils.java

Modified: 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/fs/FileUtils.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/fs/FileUtils.java?rev=760666&r1=760665&r2=760666&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/fs/FileUtils.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/utils/src/main/java/org/apache/ode/utils/fs/FileUtils.java
 Tue Mar 31 21:37:24 2009
@@ -22,7 +22,7 @@
 import java.io.FileFilter;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Arrays;
+import java.util.TreeSet;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -105,8 +105,28 @@
 
     /**
      * Recursively collect all Files in the given directory and all its
-     * subdirectories, applying the given FileFilter.
-     *
+     * subdirectories, applying the given FileFilter. The FileFilter is also 
applied to the given rootDirectory.
+     * As a result the rootDirectory might be contained in the returned list.
+     * <p>
+     * Returned files are sorted lexicographically but for each directory, 
files come before its sudirectories.
+     * For instance:<br/>
+     * test<br/>
+     * test/alpha.txt<br/>
+     * test/zulu.txt<br/>
+     * test/a<br/>
+     * test/a/alpha.txt<br/>
+     * test/z<br/>
+     * test/z/zulu.txt<br/>
+     * <p>
+     * instead of:<br/>
+     * test<br/>
+     * test/a<br/>
+     * test/a/alpha.txt<br/>
+     * test/alpha.txt<br/>
+     * test/z<br/>
+     * test/z/zulu.txt<br/>
+     * test/zulu.txt<br/>
+     *   lexicographically
      * @param rootDirectory
      *          the top level directory used for the search
      * @param filter
@@ -140,19 +160,23 @@
             collectedFiles.add(parentDir);
         }
 
-        File[] files = parentDir.listFiles();
-        if (files != null) {
-            for (int numFiles = files.length, i = 0; i < numFiles; i++) {
-                File currentFile = files[i];
-
-                if (currentFile.isDirectory()) {
-                    FileUtils.directoryEntriesInPath(collectedFiles, 
currentFile, filter);
+        File[] allFiles = parentDir.listFiles();
+        if (allFiles != null) {
+            TreeSet<File> dirs = new TreeSet<File>();
+            TreeSet<File> acceptedFiles = new TreeSet<File>();
+            for (File f : allFiles) {
+                if (f.isDirectory()) {
+                    dirs.add(f);
                 } else {
-                    if ((filter == null) || ((filter != null) && 
(filter.accept(currentFile)))) {
-                        collectedFiles.add(currentFile);
+                    if ((filter == null) || ((filter != null) && 
(filter.accept(f)))) {
+                        acceptedFiles.add(f);
                     }
                 }
             }
+            collectedFiles.addAll(acceptedFiles);
+            for (File currentFile : dirs) {
+                FileUtils.directoryEntriesInPath(collectedFiles, currentFile, 
filter);
+            }
         }
     }
 
@@ -163,5 +187,8 @@
     public static void main(String[] args) {
         List<File> l = directoryEntriesInPath(new File("/tmp/test"));
         for(File f : l) System.out.println(f);
+        System.out.println("########");
+     TreeSet<File> s= new TreeSet(l);
+        for(File f : s) System.out.println(f);
     }
 }


Reply via email to