commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Standish (JIRA)" <j...@apache.org>
Subject [jira] [Created] (IO-452) FileUtils.isSymlink returns false for broken symlinks.
Date Sun, 13 Jul 2014 19:30:05 GMT
David Standish created IO-452:
---------------------------------

             Summary: FileUtils.isSymlink returns false for broken symlinks.
                 Key: IO-452
                 URL: https://issues.apache.org/jira/browse/IO-452
             Project: Commons IO
          Issue Type: Improvement
          Components: Utilities
    Affects Versions: 2.5
         Environment: java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1)
OpenJDK Server VM (build 24.51-b03, mixed mode)
Linux weeble 3.13.0-30-generic #55-Ubuntu SMP Fri Jul 4 21:43:42 UTC 2014 i686 i686 i686 GNU/Linux

            Reporter: David Standish
            Priority: Minor


FileUtils.isSymlink returns false for broken symlinks.

In contrast, java 7 java.nio.file.Files.isSymbolicLink() returns true for broken symlink.

One possible work around for java 6 and below is to use the fact that File.exists() returns
false for a broken symlink and the fact that the file is found in its parents directory listing.

I don't have a compelling argument for fixing this, here is a candidate patch.

{code}
someguy@weeble:~/prog/java/commons-io/commons-io$ svn diff src/main/java/org/apache/commons/io/FileUtils.java

Index: src/main/java/org/apache/commons/io/FileUtils.java
===================================================================
--- src/main/java/org/apache/commons/io/FileUtils.java  (revision 1609743)
+++ src/main/java/org/apache/commons/io/FileUtils.java  (working copy)
@@ -3068,10 +3068,41 @@
         }
 
         if (fileInCanonicalDir.getCanonicalFile().equals(fileInCanonicalDir.getAbsoluteFile()))
{
-            return false;
+            return isBrokenSymlink(file);
         } else {
             return true;
         }
     }
 
+    /**
+     * Determines if the specified file is possibly a broken symbolic link.
+     * 
+     * @param file the file to check
+     * @return true if the file is a Symbolic Link
+     * @throws IOException if an IO error occurs while checking the file
+     */
+    private static boolean isBrokenSymlink(final File file) throws IOException {
+        // if file exists then if it is a symlink it's not broken   
+        if ( file.exists() ) {
+            return false;
+        }
+        // a broken symlink will show up in the list of files of its parent directory
+        final File canon = file.getCanonicalFile();
+        File parentDir = canon.getParentFile();
+        if ( parentDir == null || ! parentDir.exists() ) {
+            return false;
+        }
+        
+        // is it worthwhile to create a FileFilterUtil method for this?
+        // is it worthwhile to create an "identity"  IOFileFilter for this?
+        File[] fileInDir = parentDir.listFiles(
+            new FileFilter() {
+                public boolean accept( File aFile ) {
+                    return aFile.equals(canon);
+                }
+                }
+            );
+        return fileInDir.length > 0;
+    }
+
 }
{code}
{code}
someguy@weeble:~/prog/java/commons-io/commons-io$ svn diff src/test/java/org/apache/commons/io/FileUtilsCleanSymlinksTestCase.java

Index: src/test/java/org/apache/commons/io/FileUtilsCleanSymlinksTestCase.java
===================================================================
--- src/test/java/org/apache/commons/io/FileUtilsCleanSymlinksTestCase.java     (revision
1609743)
+++ src/test/java/org/apache/commons/io/FileUtilsCleanSymlinksTestCase.java     (working copy)
@@ -203,6 +203,25 @@
         assertFalse(FileUtils.isSymlink(randomFile));
     }
 
+    public void testIdentifiesBrokenSymlinkFile() throws Exception {
+        if (System.getProperty("os.name").startsWith("Win")) {
+            // cant create symlinks in windows.
+            return;
+        }
+
+        final File noexistFile = new File(top, "noexist");
+        final File symlinkFile = new File(top, "fakeinner");
+        final File badSymlinkInPathFile = new File(symlinkFile, "fakeinner");
+        final File noexistParentFile = new File("noexist", "file");
+        
+        setupSymlink(noexistFile, symlinkFile);
+
+        assertTrue(FileUtils.isSymlink(symlinkFile));
+        assertFalse(FileUtils.isSymlink(noexistFile));
+        assertFalse(FileUtils.isSymlink(noexistParentFile));
+        assertFalse(FileUtils.isSymlink(badSymlinkInPathFile));
+    }
+
     public void testCorrectlyIdentifySymlinkWithParentSymLink() throws Exception {
         if (System.getProperty("os.name").startsWith("Win")) {
             // cant create symlinks in windows.
{code}




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message