You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2014/10/13 18:34:43 UTC

svn commit: r1631461 - in /maven/shared/trunk/maven-shared-utils/src: main/java/org/apache/maven/shared/utils/ main/java/org/apache/maven/shared/utils/io/ test/java/org/apache/maven/shared/utils/io/

Author: krosenvold
Date: Mon Oct 13 16:34:42 2014
New Revision: 1631461

URL: http://svn.apache.org/r1631461
Log:
[MSHARED-364] Use nio in deletefiles when possible

Modified:
    maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/Expand.java
    maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/FileUtils.java
    maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/Java7Support.java
    maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/FileUtilsTest.java

Modified: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/Expand.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/Expand.java?rev=1631461&r1=1631460&r2=1631461&view=diff
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/Expand.java (original)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/Expand.java Mon Oct 13 16:34:42 2014
@@ -226,7 +226,7 @@ class Expand
         }
         else
         {
-            targetFile.delete();
+            FileUtils.delete( targetFile );
         }
 
     }

Modified: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/FileUtils.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/FileUtils.java?rev=1631461&r1=1631460&r2=1631461&view=diff
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/FileUtils.java (original)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/FileUtils.java Mon Oct 13 16:34:42 2014
@@ -19,6 +19,12 @@ package org.apache.maven.shared.utils.io
  * under the License.
  */
 
+import org.apache.maven.shared.utils.Os;
+import org.apache.maven.shared.utils.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.WillClose;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -42,13 +48,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 
-import org.apache.maven.shared.utils.Os;
-import org.apache.maven.shared.utils.StringUtils;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.annotation.WillClose;
-
 /**
  * This class provides basic facilities for manipulating files and file paths.
  * <p/>
@@ -122,7 +121,7 @@ public class FileUtils
      * Non-valid Characters for naming files, folders under Windows: <code>":", "*", "?", "\"", "<", ">", "|"</code>
      *
      * @see <a href="http://support.microsoft.com/?scid=kb%3Ben-us%3B177506&x=12&y=13">
-     *      http://support.microsoft.com/?scid=kb%3Ben-us%3B177506&x=12&y=13</a>
+     * http://support.microsoft.com/?scid=kb%3Ben-us%3B177506&x=12&y=13</a>
      */
     private static final String[] INVALID_CHARACTERS_FOR_WINDOWS_FILE_NAME = { ":", "*", "?", "\"", "<", ">", "|" };
 
@@ -139,7 +138,7 @@ public class FileUtils
      * @return the default excludes pattern as list.
      * @see #getDefaultExcludes()
      */
-    @Nonnull public static List<String>  getDefaultExcludesAsList()
+    @Nonnull public static List<String> getDefaultExcludesAsList()
     {
         return Arrays.asList( getDefaultExcludes() );
     }
@@ -304,7 +303,7 @@ public class FileUtils
     /**
      * @param file the file path
      * @return the file content lines as String[] using the systems default encoding.
-     *         An empty List if the file didn't exist.
+     * An empty List if the file didn't exist.
      * @throws IOException
      */
     @Nonnull public static String[] fileReadArray( @Nonnull File file )
@@ -395,7 +394,6 @@ public class FileUtils
      * @param encoding The encoding of the file.
      * @param data     The content to write to the file.
      * @throws IOException if any
-     * 
      */
     public static void fileWrite( @Nonnull File file, @Nullable String encoding, @Nonnull String data )
         throws IOException
@@ -427,7 +425,6 @@ public class FileUtils
      * @param file The path of the file to write.
      * @param data The content to write to the file.
      * @throws IOException if any
-     * 
      */
     public static void fileWriteArray( @Nonnull File file, @Nullable String... data )
         throws IOException
@@ -442,7 +439,6 @@ public class FileUtils
      * @param encoding The encoding of the file.
      * @param data     The content to write to the file.
      * @throws IOException if any
-     * 
      */
     public static void fileWriteArray( @Nonnull File file, @Nullable String encoding, @Nullable String... data )
         throws IOException
@@ -484,7 +480,7 @@ public class FileUtils
     {
         File file = new File( fileName );
         //noinspection ResultOfMethodCallIgnored
-        file.delete();
+        deleteLegacyStyle( file );
     }
 
     /**
@@ -553,7 +549,7 @@ public class FileUtils
     /**
      * Private helper method for getFilesFromExtension()
      */
-    @Nonnull private static List<String> blendFilesToList( @Nonnull List<String> v, @Nonnull String...files )
+    @Nonnull private static List<String> blendFilesToList( @Nonnull List<String> v, @Nonnull String... files )
     {
         Collections.addAll( v, files );
 
@@ -597,9 +593,9 @@ public class FileUtils
 
         if ( Os.isFamily( Os.FAMILY_WINDOWS ) && !isValidWindowsFileName( file ) )
         {
-            throw new IllegalArgumentException( "The file (" + dir
-                + ") cannot contain any of the following characters: \n"
-                + StringUtils.join( INVALID_CHARACTERS_FOR_WINDOWS_FILE_NAME, " " ) );
+            throw new IllegalArgumentException(
+                "The file (" + dir + ") cannot contain any of the following characters: \n" + StringUtils.join(
+                    INVALID_CHARACTERS_FOR_WINDOWS_FILE_NAME, " " ) );
         }
 
         if ( !file.exists() )
@@ -659,7 +655,7 @@ public class FileUtils
      *
      * @param url File URL.
      * @return The equivalent <code>File</code> object, or <code>null</code> if the URL's protocol
-     *         is not <code>file</code>
+     * is not <code>file</code>
      */
     public @Nullable static File toFile( final @Nullable URL url )
     {
@@ -782,7 +778,8 @@ public class FileUtils
      * @throws IOException                   if <code>source</code> does not exist, the file in
      *                                       <code>destinationDirectory</code> cannot be written to, or an IO error occurs during copying.
      */
-    private static void copyFileToDirectoryIfModified( @Nonnull final File source, @Nonnull final File destinationDirectory )
+    private static void copyFileToDirectoryIfModified( @Nonnull final File source,
+                                                       @Nonnull final File destinationDirectory )
         throws IOException
     {
         if ( destinationDirectory.exists() && !destinationDirectory.isDirectory() )
@@ -805,7 +802,6 @@ public class FileUtils
      * @throws IOException                   if <code>source</code> does not exist, <code>destination</code> cannot be
      *                                       written to, or an IO error occurs during copying.
      * @throws java.io.FileNotFoundException if <code>destination</code> is a directory
-     *
      */
     public static void copyFile( @Nonnull final File source, @Nonnull final File destination )
         throws IOException
@@ -938,7 +934,8 @@ public class FileUtils
      *                     <li>an IO error occurs during copying</li>
      *                     </ul>
      */
-    private static void copyStreamToFile( @Nonnull final @WillClose InputStream source, @Nonnull final File destination )
+    private static void copyStreamToFile( @Nonnull final @WillClose InputStream source,
+                                          @Nonnull final File destination )
         throws IOException
     {
         FileOutputStream output = null;
@@ -1153,6 +1150,50 @@ public class FileUtils
     }
 
     /**
+     * deletes a file.
+     *
+     * @param file The file to delete
+     * @throws IOException If the file cannot be delted.
+     */
+
+
+    public static void delete( File file )
+        throws IOException
+    {
+        if ( Java7Support.isAtLeastJava7() )
+        {
+            Java7Support.delete( file );
+        }
+        else
+        {
+            if ( !file.delete() )
+            {
+                throw new IOException( "Could not delete " + file.getName() );
+            }
+        }
+    }
+
+    public static boolean deleteLegacyStyle( File file )
+    {
+        if ( Java7Support.isAtLeastJava7() )
+        {
+            try
+            {
+                Java7Support.delete( file );
+                return true;
+            }
+            catch ( IOException e )
+            {
+                return false;
+            }
+        }
+        else
+        {
+            return file.delete();
+        }
+    }
+
+    /**
      * Accommodate Windows bug encountered in both Sun and IBM JDKs.
      * Others possible. If the delete does not work, call System.gc(),
      * wait a little and try again.
@@ -1168,7 +1209,7 @@ public class FileUtils
             throw new IOException( "File " + file + " isn't a file." );
         }
 
-        if ( !file.delete() )
+        if ( !deleteLegacyStyle( file ) )
         {
             if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
             {
@@ -1179,11 +1220,11 @@ public class FileUtils
             try
             {
                 Thread.sleep( 10 );
-                return file.delete();
+                return deleteLegacyStyle( file );
             }
             catch ( InterruptedException ex )
             {
-                return file.delete();
+                return deleteLegacyStyle( file );
             }
         }
 
@@ -1258,13 +1299,13 @@ public class FileUtils
         /* try delete the directory before its contents, which will take
          * care of any directories that are really symbolic links.
          */
-        if ( directory.delete() )
+        if ( deleteLegacyStyle( directory) )
         {
             return;
         }
 
         cleanDirectory( directory );
-        if ( !directory.delete() )
+        if ( !deleteLegacyStyle( directory ) )
         {
             final String message = "Directory " + directory + " unable to be deleted.";
             throw new IOException( message );
@@ -1384,7 +1425,8 @@ public class FileUtils
      * @throws IOException
      * @see #getFileNames(File, String, String, boolean)
      */
-    @Nonnull public static List<File> getFiles( @Nonnull File directory, @Nullable String includes, @Nullable String excludes )
+    @Nonnull
+    public static List<File> getFiles( @Nonnull File directory, @Nullable String includes, @Nullable String excludes )
         throws IOException
     {
         return getFiles( directory, includes, excludes, true );
@@ -1401,7 +1443,9 @@ public class FileUtils
      * @throws IOException
      * @see #getFileNames(File, String, String, boolean)
      */
-    @Nonnull public static List<File> getFiles( @Nonnull File directory, @Nullable String includes, @Nullable  String excludes, boolean includeBasedir )
+    @Nonnull
+    public static List<File> getFiles( @Nonnull File directory, @Nullable String includes, @Nullable String excludes,
+                                       boolean includeBasedir )
         throws IOException
     {
         List<String> fileNames = getFileNames( directory, includes, excludes, includeBasedir );
@@ -1427,7 +1471,8 @@ public class FileUtils
      * @return a list of files as String
      * @throws IOException
      */
-    @Nonnull public static List<String> getFileNames( @Nonnull File directory, @Nullable String includes, @Nullable  String excludes, boolean includeBasedir )
+    @Nonnull public static List<String> getFileNames( @Nonnull File directory, @Nullable String includes,
+                                                      @Nullable String excludes, boolean includeBasedir )
         throws IOException
     {
         return getFileNames( directory, includes, excludes, includeBasedir, true );
@@ -1444,8 +1489,9 @@ public class FileUtils
      * @return a list of files as String
      * @throws IOException
      */
-    @Nonnull private static List<String> getFileNames( @Nonnull File directory, @Nullable String includes, @Nullable  String excludes, boolean includeBasedir,
-                                             boolean isCaseSensitive )
+    @Nonnull private static List<String> getFileNames( @Nonnull File directory, @Nullable String includes,
+                                                       @Nullable String excludes, boolean includeBasedir,
+                                                       boolean isCaseSensitive )
         throws IOException
     {
         return getFileAndDirectoryNames( directory, includes, excludes, includeBasedir, isCaseSensitive, true, false );
@@ -1462,8 +1508,8 @@ public class FileUtils
      * @return a list of directories as String
      * @throws IOException
      */
-    @Nonnull public static List<String> getDirectoryNames( @Nonnull File directory, @Nullable String includes, @Nullable String excludes,
-                                                  boolean includeBasedir )
+    @Nonnull public static List<String> getDirectoryNames( @Nonnull File directory, @Nullable String includes,
+                                                           @Nullable String excludes, boolean includeBasedir )
         throws IOException
     {
         return getDirectoryNames( directory, includes, excludes, includeBasedir, true );
@@ -1480,8 +1526,9 @@ public class FileUtils
      * @return a list of directories as String
      * @throws IOException
      */
-    @Nonnull public static List<String> getDirectoryNames( @Nonnull File directory, @Nullable String includes, @Nullable String excludes,
-                                                  boolean includeBasedir, boolean isCaseSensitive )
+    @Nonnull public static List<String> getDirectoryNames( @Nonnull File directory, @Nullable String includes,
+                                                           @Nullable String excludes, boolean includeBasedir,
+                                                           boolean isCaseSensitive )
         throws IOException
     {
         return getFileAndDirectoryNames( directory, includes, excludes, includeBasedir, isCaseSensitive, false, true );
@@ -1499,9 +1546,10 @@ public class FileUtils
      * @param getDirectories  true if get directories
      * @return a list of files as String
      */
-    @Nonnull public static List<String> getFileAndDirectoryNames( File directory, @Nullable String includes, @Nullable String excludes,
-                                                         boolean includeBasedir, boolean isCaseSensitive,
-                                                         boolean getFiles, boolean getDirectories )
+    @Nonnull public static List<String> getFileAndDirectoryNames( File directory, @Nullable String includes,
+                                                                  @Nullable String excludes, boolean includeBasedir,
+                                                                  boolean isCaseSensitive, boolean getFiles,
+                                                                  boolean getDirectories )
     {
         DirectoryScanner scanner = new DirectoryScanner();
 
@@ -1583,8 +1631,8 @@ public class FileUtils
      * @throws IOException if any
      * @see #getFiles(File, String, String)
      */
-    public static void copyDirectory( @Nonnull File sourceDirectory, @Nonnull File destinationDirectory, @Nullable String includes,
-                                      @Nullable  String excludes )
+    public static void copyDirectory( @Nonnull File sourceDirectory, @Nonnull File destinationDirectory,
+                                      @Nullable String includes, @Nullable String excludes )
         throws IOException
     {
         if ( !sourceDirectory.exists() )
@@ -1685,8 +1733,8 @@ public class FileUtils
             {
                 if ( !destination.exists() && !destination.mkdirs() )
                 {
-                    throw new IOException( "Could not create destination directory '" + destination.getAbsolutePath()
-                        + "'." );
+                    throw new IOException(
+                        "Could not create destination directory '" + destination.getAbsolutePath() + "'." );
                 }
 
                 copyDirectoryStructure( file, destination, rootDestinationDirectory, onlyModifiedFiles );
@@ -1714,7 +1762,7 @@ public class FileUtils
     public static void rename( @Nonnull File from, @Nonnull File to )
         throws IOException
     {
-        if ( to.exists() && !to.delete() )
+        if ( to.exists() && !deleteLegacyStyle( to ) )
         {
             throw new IOException( "Failed to delete " + to + " while trying to rename " + from );
         }
@@ -1728,7 +1776,7 @@ public class FileUtils
         if ( !from.renameTo( to ) )
         {
             copyFile( from, to );
-            if ( !from.delete() )
+            if ( !deleteLegacyStyle( from ) )
             {
                 throw new IOException( "Failed to delete " + from + " while trying to rename it." );
             }
@@ -1798,7 +1846,8 @@ public class FileUtils
      * @param wrappers array of {@link FilterWrapper}
      * @throws IOException if an IO error occurs during copying or filtering
      */
-    public static void copyFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding, @Nullable FilterWrapper... wrappers )
+    public static void copyFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding,
+                                 @Nullable FilterWrapper... wrappers )
         throws IOException
     {
         copyFile( from, to, encoding, wrappers, false );
@@ -1819,9 +1868,9 @@ public class FileUtils
      * @param overwrite if true and f wrappers is null or empty, the file will be copy
      *                  enven if to.lastModified() < from.lastModified()
      * @throws IOException if an IO error occurs during copying or filtering
-     * 
      */
-    public static void copyFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding, @Nullable FilterWrapper[] wrappers, boolean overwrite )
+    public static void copyFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding,
+                                 @Nullable FilterWrapper[] wrappers, boolean overwrite )
         throws IOException
     {
         if ( wrappers != null && wrappers.length > 0 )
@@ -1919,9 +1968,8 @@ public class FileUtils
      *
      * @param f not null file
      * @return <code>false</code> if the file path contains any of forbidden Windows characters,
-     *         <code>true</code> if the Os is not Windows or if the file path respect the Windows constraints.
+     * <code>true</code> if the Os is not Windows or if the file path respect the Windows constraints.
      * @see #INVALID_CHARACTERS_FOR_WINDOWS_FILE_NAME
-     * 
      */
     private static boolean isValidWindowsFileName( @Nonnull File f )
     {

Modified: maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/Java7Support.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/Java7Support.java?rev=1631461&r1=1631460&r2=1631461&view=diff
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/Java7Support.java (original)
+++ maven/shared/trunk/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/io/Java7Support.java Mon Oct 13 16:34:42 2014
@@ -20,6 +20,7 @@ package org.apache.maven.shared.utils.io
  */
 
 import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
@@ -35,6 +36,8 @@ public class Java7Support
 
     private static Method isSymbolicLink;
 
+    private static Method delete;
+
     private static Method toPath;
 
     static
@@ -45,6 +48,7 @@ public class Java7Support
             Class<?> files = Thread.currentThread().getContextClassLoader().loadClass( "java.nio.file.Files" );
             Class<?> path = Thread.currentThread().getContextClassLoader().loadClass( "java.nio.file.Path" );
             isSymbolicLink = files.getMethod( "isSymbolicLink", path );
+            delete = files.getMethod( "delete", path );
             toPath = File.class.getMethod( "toPath" );
         }
         catch ( ClassNotFoundException e )
@@ -75,8 +79,37 @@ public class Java7Support
         }
     }
 
+    /**
+     * Performs a nio delete
+     * @param file the file to delete
+     * @throws IOException
+     */
+
+    public static void delete( File file ) throws IOException
+    {
+        try
+        {
+            Object path = toPath.invoke( file );
+            delete.invoke( null, path );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new RuntimeException( e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw (IOException) e.getTargetException();
+        }
+    }
+
     public static boolean isJava7()
     {
         return IS_JAVA7;
     }
+
+    public static boolean isAtLeastJava7()
+    {
+        return IS_JAVA7;
+    }
+
 }

Modified: maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/FileUtilsTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/FileUtilsTest.java?rev=1631461&r1=1631460&r2=1631461&view=diff
==============================================================================
--- maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/FileUtilsTest.java (original)
+++ maven/shared/trunk/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/io/FileUtilsTest.java Mon Oct 13 16:34:42 2014
@@ -36,8 +36,7 @@ import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 import static org.junit.Assume.assumeThat;
 import static org.junit.matchers.JUnitMatchers.containsString;
 import static org.junit.matchers.JUnitMatchers.hasItems;
@@ -423,6 +422,41 @@ public class FileUtilsTest
     }
 
     @Test
+    public void deleteFile()
+        throws Exception
+    {
+        File destination = new File( tempFolder.getRoot(), "copy1.txt" );
+        FileUtils.copyFile( testFile1, destination );
+        FileUtils.delete( destination );
+        assertThat( "Check Exist", destination.exists(), is( false ) );
+    }
+
+    @Test(expected = IOException.class)
+    public void deleteFileNofile()
+        throws Exception
+    {
+        File destination = new File( "abc/cde" );
+        FileUtils.delete( destination );
+    }
+
+    @Test
+    public void deleteFileLegacy()
+        throws Exception
+    {
+        File destination = new File( tempFolder.getRoot(), "copy1.txt" );
+        FileUtils.copyFile( testFile1, destination );
+        assertTrue( FileUtils.deleteLegacyStyle( destination ) );
+    }
+
+    @Test
+    public void deleteFileLegacyNofile()
+        throws Exception
+    {
+        File destination = new File( "abc/cde" );
+        assertFalse( FileUtils.deleteLegacyStyle( destination ) );
+    }
+
+    @Test
     public void copyFile2()
         throws Exception
     {