git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271242 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,306 +0,0 @@ | |||||
/* | |||||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
* | |||||
* This software is published under the terms of the Apache Software License | |||||
* version 1.1, a copy of which has been included with this distribution in | |||||
* the LICENSE.txt file. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs.file; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.Enumeration; | |||||
import java.util.Iterator; | |||||
import org.apache.avalon.excalibur.io.FileUtil; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.FilterSetCollection; | |||||
import org.apache.tools.ant.util.FileUtils; | |||||
/** | |||||
* Moves a file or directory to a new file or directory. By default, the | |||||
* destination is overwriten when existing. When overwrite is turned off, then | |||||
* files are only moved if the source file is newer than the destination file, | |||||
* or when the destination file does not exist.</p> <p> | |||||
* | |||||
* Source files and directories are only deleted when the file or directory has | |||||
* been copied to the destination successfully. Filtering also works.</p> <p> | |||||
* | |||||
* This implementation is based on Arnout Kuiper's initial design document, the | |||||
* following mailing list discussions, and the copyfile/copydir tasks.</p> | |||||
* | |||||
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com | |||||
* </a> | |||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||||
*/ | |||||
public class Move | |||||
extends Copy | |||||
{ | |||||
public Move() | |||||
{ | |||||
setOverwrite( true ); | |||||
} | |||||
/** | |||||
* Go and delete the directory tree. | |||||
* | |||||
* @param d Description of Parameter | |||||
*/ | |||||
protected void deleteDir( File d ) | |||||
throws TaskException | |||||
{ | |||||
String[] list = d.list(); | |||||
if( list == null ) | |||||
{ | |||||
return; | |||||
}// on an io error list() can return null | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
String s = list[ i ]; | |||||
File f = new File( d, s ); | |||||
if( f.isDirectory() ) | |||||
{ | |||||
deleteDir( f ); | |||||
} | |||||
else | |||||
{ | |||||
throw new TaskException( "UNEXPECTED ERROR - The file " + f.getAbsolutePath() + " should not exist!" ); | |||||
} | |||||
} | |||||
getLogger().debug( "Deleting directory " + d.getAbsolutePath() ); | |||||
if( !d.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to delete directory " + d.getAbsolutePath() ); | |||||
} | |||||
} | |||||
//************************************************************************ | |||||
// protected and private methods | |||||
//************************************************************************ | |||||
protected void doFileOperations() | |||||
throws TaskException | |||||
{ | |||||
//Attempt complete directory renames, if any, first. | |||||
if( getCompleteDirMap().size() > 0 ) | |||||
{ | |||||
Enumeration e = getCompleteDirMap().keys(); | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
File fromDir = (File)e.nextElement(); | |||||
File toDir = (File)getCompleteDirMap().get( fromDir ); | |||||
try | |||||
{ | |||||
final String message = "Attempting to rename dir: " + fromDir + | |||||
" to " + toDir; | |||||
getLogger().debug( message ); | |||||
renameFile( fromDir, toDir, isFiltering(), isForceOverwrite() ); | |||||
} | |||||
catch( final IOException ioe ) | |||||
{ | |||||
final String msg = "Failed to rename dir " + fromDir + | |||||
" to " + toDir + " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
} | |||||
} | |||||
if( getFileCopyMap().size() > 0 ) | |||||
{// files to move | |||||
getLogger().info( "Moving " + getFileCopyMap().size() + " files to " + | |||||
getDestDir().getAbsolutePath() ); | |||||
Enumeration e = getFileCopyMap().keys(); | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
String fromFile = (String)e.nextElement(); | |||||
String toFile = (String)getFileCopyMap().get( fromFile ); | |||||
if( fromFile.equals( toFile ) ) | |||||
{ | |||||
getLogger().debug( "Skipping self-move of " + fromFile ); | |||||
continue; | |||||
} | |||||
boolean moved = false; | |||||
File f = new File( fromFile ); | |||||
if( f.exists() ) | |||||
{//Is this file still available to be moved? | |||||
File d = new File( toFile ); | |||||
try | |||||
{ | |||||
final String message = | |||||
"Attempting to rename: " + fromFile + " to " + toFile; | |||||
getLogger().debug( message ); | |||||
moved = renameFile( f, d, isFiltering(), isForceOverwrite() ); | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
final String msg = "Failed to rename " + fromFile + " to " + | |||||
toFile + " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
if( !moved ) | |||||
{ | |||||
try | |||||
{ | |||||
getLogger().debug( "Moving " + fromFile + " to " + toFile ); | |||||
final FilterSetCollection executionFilters = buildFilterSet(); | |||||
if( isForceOverwrite() ) | |||||
{ | |||||
FileUtil.forceDelete( d ); | |||||
} | |||||
FileUtils.copyFile( f, d, executionFilters ); | |||||
f = new File( fromFile ); | |||||
if( !f.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to delete file " | |||||
+ f.getAbsolutePath() ); | |||||
} | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
String msg = "Failed to copy " + fromFile + " to " | |||||
+ toFile | |||||
+ " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if( isIncludeEmpty() ) | |||||
{ | |||||
Enumeration e = getDirCopyMap().elements(); | |||||
int count = 0; | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
File d = new File( (String)e.nextElement() ); | |||||
if( !d.exists() ) | |||||
{ | |||||
if( !d.mkdirs() ) | |||||
{ | |||||
getLogger().error( "Unable to create directory " + d.getAbsolutePath() ); | |||||
} | |||||
else | |||||
{ | |||||
count++; | |||||
} | |||||
} | |||||
} | |||||
if( count > 0 ) | |||||
{ | |||||
getLogger().info( "Moved " + count + " empty directories to " + getDestDir().getAbsolutePath() ); | |||||
} | |||||
} | |||||
if( getFilesets().size() > 0 ) | |||||
{ | |||||
Iterator e = getFilesets().iterator(); | |||||
while( e.hasNext() ) | |||||
{ | |||||
FileSet fs = (FileSet)e.next(); | |||||
File dir = fs.getDir(); | |||||
if( okToDelete( dir ) ) | |||||
{ | |||||
deleteDir( dir ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Its only ok to delete a directory tree if there are no files in it. | |||||
* | |||||
* @param d Description of Parameter | |||||
* @return Description of the Returned Value | |||||
*/ | |||||
protected boolean okToDelete( File d ) | |||||
{ | |||||
String[] list = d.list(); | |||||
if( list == null ) | |||||
{ | |||||
return false; | |||||
}// maybe io error? | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
String s = list[ i ]; | |||||
File f = new File( d, s ); | |||||
if( f.isDirectory() ) | |||||
{ | |||||
if( !okToDelete( f ) ) | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
return false;// found a file | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
/** | |||||
* Attempts to rename a file from a source to a destination. If overwrite is | |||||
* set to true, this method overwrites existing file even if the destination | |||||
* file is newer. Otherwise, the source file is renamed only if the | |||||
* destination file is older than it. Method then checks if token filtering | |||||
* is used. If it is, this method returns false assuming it is the | |||||
* responsibility to the copyFile method. | |||||
* | |||||
* @param sourceFile Description of Parameter | |||||
* @param destFile Description of Parameter | |||||
* @param filtering Description of Parameter | |||||
* @param overwrite Description of Parameter | |||||
* @return Description of the Returned Value | |||||
* @exception TaskException Description of Exception | |||||
* @throws IOException | |||||
*/ | |||||
protected boolean renameFile( File sourceFile, File destFile, | |||||
boolean filtering, boolean overwrite ) | |||||
throws IOException, TaskException | |||||
{ | |||||
boolean renamed = true; | |||||
if( !filtering ) | |||||
{ | |||||
// ensure that parent dir of dest file exists! | |||||
// not using getParentFile method to stay 1.1 compat | |||||
String parentPath = destFile.getParent(); | |||||
if( parentPath != null ) | |||||
{ | |||||
File parent = new File( parentPath ); | |||||
if( !parent.exists() ) | |||||
{ | |||||
parent.mkdirs(); | |||||
} | |||||
} | |||||
if( destFile.exists() ) | |||||
{ | |||||
if( !destFile.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to remove existing file " | |||||
+ destFile ); | |||||
} | |||||
} | |||||
renamed = sourceFile.renameTo( destFile ); | |||||
} | |||||
else | |||||
{ | |||||
renamed = false; | |||||
} | |||||
return renamed; | |||||
} | |||||
} |
@@ -1,306 +0,0 @@ | |||||
/* | |||||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
* | |||||
* This software is published under the terms of the Apache Software License | |||||
* version 1.1, a copy of which has been included with this distribution in | |||||
* the LICENSE.txt file. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs.file; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.Enumeration; | |||||
import java.util.Iterator; | |||||
import org.apache.avalon.excalibur.io.FileUtil; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.FilterSetCollection; | |||||
import org.apache.tools.ant.util.FileUtils; | |||||
/** | |||||
* Moves a file or directory to a new file or directory. By default, the | |||||
* destination is overwriten when existing. When overwrite is turned off, then | |||||
* files are only moved if the source file is newer than the destination file, | |||||
* or when the destination file does not exist.</p> <p> | |||||
* | |||||
* Source files and directories are only deleted when the file or directory has | |||||
* been copied to the destination successfully. Filtering also works.</p> <p> | |||||
* | |||||
* This implementation is based on Arnout Kuiper's initial design document, the | |||||
* following mailing list discussions, and the copyfile/copydir tasks.</p> | |||||
* | |||||
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com | |||||
* </a> | |||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||||
*/ | |||||
public class Move | |||||
extends Copy | |||||
{ | |||||
public Move() | |||||
{ | |||||
setOverwrite( true ); | |||||
} | |||||
/** | |||||
* Go and delete the directory tree. | |||||
* | |||||
* @param d Description of Parameter | |||||
*/ | |||||
protected void deleteDir( File d ) | |||||
throws TaskException | |||||
{ | |||||
String[] list = d.list(); | |||||
if( list == null ) | |||||
{ | |||||
return; | |||||
}// on an io error list() can return null | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
String s = list[ i ]; | |||||
File f = new File( d, s ); | |||||
if( f.isDirectory() ) | |||||
{ | |||||
deleteDir( f ); | |||||
} | |||||
else | |||||
{ | |||||
throw new TaskException( "UNEXPECTED ERROR - The file " + f.getAbsolutePath() + " should not exist!" ); | |||||
} | |||||
} | |||||
getLogger().debug( "Deleting directory " + d.getAbsolutePath() ); | |||||
if( !d.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to delete directory " + d.getAbsolutePath() ); | |||||
} | |||||
} | |||||
//************************************************************************ | |||||
// protected and private methods | |||||
//************************************************************************ | |||||
protected void doFileOperations() | |||||
throws TaskException | |||||
{ | |||||
//Attempt complete directory renames, if any, first. | |||||
if( getCompleteDirMap().size() > 0 ) | |||||
{ | |||||
Enumeration e = getCompleteDirMap().keys(); | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
File fromDir = (File)e.nextElement(); | |||||
File toDir = (File)getCompleteDirMap().get( fromDir ); | |||||
try | |||||
{ | |||||
final String message = "Attempting to rename dir: " + fromDir + | |||||
" to " + toDir; | |||||
getLogger().debug( message ); | |||||
renameFile( fromDir, toDir, isFiltering(), isForceOverwrite() ); | |||||
} | |||||
catch( final IOException ioe ) | |||||
{ | |||||
final String msg = "Failed to rename dir " + fromDir + | |||||
" to " + toDir + " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
} | |||||
} | |||||
if( getFileCopyMap().size() > 0 ) | |||||
{// files to move | |||||
getLogger().info( "Moving " + getFileCopyMap().size() + " files to " + | |||||
getDestDir().getAbsolutePath() ); | |||||
Enumeration e = getFileCopyMap().keys(); | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
String fromFile = (String)e.nextElement(); | |||||
String toFile = (String)getFileCopyMap().get( fromFile ); | |||||
if( fromFile.equals( toFile ) ) | |||||
{ | |||||
getLogger().debug( "Skipping self-move of " + fromFile ); | |||||
continue; | |||||
} | |||||
boolean moved = false; | |||||
File f = new File( fromFile ); | |||||
if( f.exists() ) | |||||
{//Is this file still available to be moved? | |||||
File d = new File( toFile ); | |||||
try | |||||
{ | |||||
final String message = | |||||
"Attempting to rename: " + fromFile + " to " + toFile; | |||||
getLogger().debug( message ); | |||||
moved = renameFile( f, d, isFiltering(), isForceOverwrite() ); | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
final String msg = "Failed to rename " + fromFile + " to " + | |||||
toFile + " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
if( !moved ) | |||||
{ | |||||
try | |||||
{ | |||||
getLogger().debug( "Moving " + fromFile + " to " + toFile ); | |||||
final FilterSetCollection executionFilters = buildFilterSet(); | |||||
if( isForceOverwrite() ) | |||||
{ | |||||
FileUtil.forceDelete( d ); | |||||
} | |||||
FileUtils.copyFile( f, d, executionFilters ); | |||||
f = new File( fromFile ); | |||||
if( !f.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to delete file " | |||||
+ f.getAbsolutePath() ); | |||||
} | |||||
} | |||||
catch( IOException ioe ) | |||||
{ | |||||
String msg = "Failed to copy " + fromFile + " to " | |||||
+ toFile | |||||
+ " due to " + ioe.getMessage(); | |||||
throw new TaskException( msg, ioe ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if( isIncludeEmpty() ) | |||||
{ | |||||
Enumeration e = getDirCopyMap().elements(); | |||||
int count = 0; | |||||
while( e.hasMoreElements() ) | |||||
{ | |||||
File d = new File( (String)e.nextElement() ); | |||||
if( !d.exists() ) | |||||
{ | |||||
if( !d.mkdirs() ) | |||||
{ | |||||
getLogger().error( "Unable to create directory " + d.getAbsolutePath() ); | |||||
} | |||||
else | |||||
{ | |||||
count++; | |||||
} | |||||
} | |||||
} | |||||
if( count > 0 ) | |||||
{ | |||||
getLogger().info( "Moved " + count + " empty directories to " + getDestDir().getAbsolutePath() ); | |||||
} | |||||
} | |||||
if( getFilesets().size() > 0 ) | |||||
{ | |||||
Iterator e = getFilesets().iterator(); | |||||
while( e.hasNext() ) | |||||
{ | |||||
FileSet fs = (FileSet)e.next(); | |||||
File dir = fs.getDir(); | |||||
if( okToDelete( dir ) ) | |||||
{ | |||||
deleteDir( dir ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Its only ok to delete a directory tree if there are no files in it. | |||||
* | |||||
* @param d Description of Parameter | |||||
* @return Description of the Returned Value | |||||
*/ | |||||
protected boolean okToDelete( File d ) | |||||
{ | |||||
String[] list = d.list(); | |||||
if( list == null ) | |||||
{ | |||||
return false; | |||||
}// maybe io error? | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
String s = list[ i ]; | |||||
File f = new File( d, s ); | |||||
if( f.isDirectory() ) | |||||
{ | |||||
if( !okToDelete( f ) ) | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
return false;// found a file | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
/** | |||||
* Attempts to rename a file from a source to a destination. If overwrite is | |||||
* set to true, this method overwrites existing file even if the destination | |||||
* file is newer. Otherwise, the source file is renamed only if the | |||||
* destination file is older than it. Method then checks if token filtering | |||||
* is used. If it is, this method returns false assuming it is the | |||||
* responsibility to the copyFile method. | |||||
* | |||||
* @param sourceFile Description of Parameter | |||||
* @param destFile Description of Parameter | |||||
* @param filtering Description of Parameter | |||||
* @param overwrite Description of Parameter | |||||
* @return Description of the Returned Value | |||||
* @exception TaskException Description of Exception | |||||
* @throws IOException | |||||
*/ | |||||
protected boolean renameFile( File sourceFile, File destFile, | |||||
boolean filtering, boolean overwrite ) | |||||
throws IOException, TaskException | |||||
{ | |||||
boolean renamed = true; | |||||
if( !filtering ) | |||||
{ | |||||
// ensure that parent dir of dest file exists! | |||||
// not using getParentFile method to stay 1.1 compat | |||||
String parentPath = destFile.getParent(); | |||||
if( parentPath != null ) | |||||
{ | |||||
File parent = new File( parentPath ); | |||||
if( !parent.exists() ) | |||||
{ | |||||
parent.mkdirs(); | |||||
} | |||||
} | |||||
if( destFile.exists() ) | |||||
{ | |||||
if( !destFile.delete() ) | |||||
{ | |||||
throw new TaskException( "Unable to remove existing file " | |||||
+ destFile ); | |||||
} | |||||
} | |||||
renamed = sourceFile.renameTo( destFile ); | |||||
} | |||||
else | |||||
{ | |||||
renamed = false; | |||||
} | |||||
return renamed; | |||||
} | |||||
} |