git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271115 13f79535-47bb-0310-9956-ffa450edef68master
@@ -358,6 +358,10 @@ Legal: | |||||
<property name="antlib.name" value="core"/> | <property name="antlib.name" value="core"/> | ||||
</ant> | </ant> | ||||
<ant antfile="antlib.xml"> | |||||
<property name="antlib.name" value="file"/> | |||||
</ant> | |||||
<ant antfile="antlib.xml"> | <ant antfile="antlib.xml"> | ||||
<property name="antlib.name" value="archive"/> | <property name="antlib.name" value="archive"/> | ||||
</ant> | </ant> | ||||
@@ -0,0 +1,241 @@ | |||||
/* | |||||
* 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.antlib.file; | |||||
import java.io.File; | |||||
import java.util.ArrayList; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.myrmidon.api.AbstractTask; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | |||||
* Deletes a file or directory, or set of files defined by a fileset. | |||||
* | |||||
* @ant:task name="delete" | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||||
* @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a> | |||||
* @author <a href="mailto:tad1@cornell.edu">Tom Dimock</a> | |||||
* @author <a href="mailto:glennm@ca.ibm.com">Glenn McAllister</a> | |||||
* @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public class Delete | |||||
extends AbstractTask | |||||
{ | |||||
private final static Resources REZ = | |||||
ResourceManager.getPackageResources( Delete.class ); | |||||
private final ArrayList filesets = new ArrayList(); | |||||
private File m_dir; | |||||
private File m_file; | |||||
private boolean m_includeEmpty;// by default, remove matching empty dirs | |||||
/** | |||||
* Set the directory from which files are to be deleted | |||||
* | |||||
* @param dir the directory path. | |||||
*/ | |||||
public void setDir( final File dir ) | |||||
{ | |||||
m_dir = dir; | |||||
} | |||||
/** | |||||
* Set the name of a single file to be removed. | |||||
* | |||||
* @param file the file to be deleted | |||||
*/ | |||||
public void setFile( final File file ) | |||||
{ | |||||
m_file = file; | |||||
} | |||||
/** | |||||
* Adds a set of files (nested fileset attribute). | |||||
*/ | |||||
public void addFileset( FileSet set ) | |||||
{ | |||||
filesets.add( set ); | |||||
} | |||||
/** | |||||
* Delete the file(s). | |||||
*/ | |||||
public void execute() | |||||
throws TaskException | |||||
{ | |||||
validate(); | |||||
// delete the single file | |||||
if( null != m_file && m_file.exists() ) | |||||
{ | |||||
deleteFile( m_file ); | |||||
} | |||||
// delete the directory | |||||
if( m_dir != null && m_dir.exists() && m_dir.isDirectory() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-dir.notice", m_dir.getAbsolutePath() ); | |||||
getLogger().info( message ); | |||||
deleteDir( m_dir ); | |||||
} | |||||
// delete the files in the filesets | |||||
final int size = filesets.size(); | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | |||||
final FileSet fileSet = (FileSet)filesets.get( i ); | |||||
final DirectoryScanner scanner = | |||||
ScannerUtil.getDirectoryScanner( fileSet ); | |||||
final String[] files = scanner.getIncludedFiles(); | |||||
final String[] dirs = scanner.getIncludedDirectories(); | |||||
removeFiles( fileSet.getDir(), files, dirs ); | |||||
} | |||||
} | |||||
private void validate() | |||||
throws TaskException | |||||
{ | |||||
if( null == m_file && null == m_dir && 0 == filesets.size() ) | |||||
{ | |||||
final String message = REZ.getString( "delete.nofiles.error" ); | |||||
throw new TaskException( message ); | |||||
} | |||||
if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.bad-file.error", m_file.getAbsolutePath() ); | |||||
throw new TaskException( message ); | |||||
} | |||||
if( null != m_file && !m_file.exists() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.missing-file.error", m_file.getAbsolutePath() ); | |||||
getLogger().debug( message ); | |||||
} | |||||
} | |||||
private void deleteDir( final File baseDir ) | |||||
throws TaskException | |||||
{ | |||||
final File[] list = baseDir.listFiles(); | |||||
if( list != null ) | |||||
{ | |||||
deleteFiles( list ); | |||||
} | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-dir.notice", m_dir.getAbsolutePath() ); | |||||
getLogger().debug( message ); | |||||
} | |||||
if( !baseDir.delete() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-dir.error", m_dir.getAbsolutePath() ); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
private void deleteFiles( final File[] list ) | |||||
throws TaskException | |||||
{ | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
final File file = list[ i ]; | |||||
if( file.isDirectory() ) | |||||
{ | |||||
deleteDir( file ); | |||||
} | |||||
else | |||||
{ | |||||
deleteFile( file ); | |||||
} | |||||
} | |||||
} | |||||
private void deleteFile( final File file ) | |||||
throws TaskException | |||||
{ | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-file.notice", file.getAbsolutePath() ); | |||||
getLogger().debug( message ); | |||||
} | |||||
if( !file.delete() ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-file.error", file.getAbsolutePath() ); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
/** | |||||
* remove an array of files in a directory, and a list of subdirectories | |||||
* which will only be deleted if 'includeEmpty' is true | |||||
* | |||||
* @param d directory to work from | |||||
* @param files array of files to delete; can be of zero length | |||||
* @param dirs array of directories to delete; can of zero length | |||||
*/ | |||||
protected void removeFiles( final File baseDir, | |||||
final String[] files, | |||||
final String[] dirs ) | |||||
throws TaskException | |||||
{ | |||||
if( files.length > 0 ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.delete-file.error", | |||||
new Integer( files.length ), | |||||
baseDir.getAbsolutePath() ); | |||||
getLogger().info( message ); | |||||
for( int i = 0; i < files.length; i++ ) | |||||
{ | |||||
final File file = new File( baseDir, files[ i ] ); | |||||
deleteFile( file ); | |||||
} | |||||
} | |||||
if( dirs.length > 0 && m_includeEmpty ) | |||||
{ | |||||
int dirCount = 0; | |||||
for( int j = dirs.length - 1; j >= 0; j-- ) | |||||
{ | |||||
final File dir = new File( baseDir, dirs[ j ] ); | |||||
final String[] dirFiles = dir.list(); | |||||
if( null == dirFiles || 0 == dirFiles.length ) | |||||
{ | |||||
deleteDir( dir ); | |||||
dirCount++; | |||||
} | |||||
} | |||||
if( dirCount > 0 ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "delete.summary.notice", | |||||
new Integer( dirCount ), | |||||
baseDir.getAbsolutePath() ); | |||||
getLogger().info( message ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -5,20 +5,28 @@ | |||||
* version 1.1, a copy of which has been included with this distribution in | * version 1.1, a copy of which has been included with this distribution in | ||||
* the LICENSE.txt file. | * the LICENSE.txt file. | ||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs.file; | |||||
package org.apache.antlib.file; | |||||
import java.io.File; | import java.io.File; | ||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.myrmidon.api.AbstractTask; | import org.apache.myrmidon.api.AbstractTask; | ||||
import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
/** | /** | ||||
* Creates a given directory. | |||||
* Creates specified directory. | |||||
* | * | ||||
* @ant:task name="mkdir" | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||||
* @author duncan@x180.com | * @author duncan@x180.com | ||||
* @version $Revision$ $Date$ | |||||
*/ | */ | ||||
public class Mkdir | public class Mkdir | ||||
extends AbstractTask | extends AbstractTask | ||||
{ | { | ||||
private final static Resources REZ = | |||||
ResourceManager.getPackageResources( Mkdir.class ); | |||||
private File m_dir; | private File m_dir; | ||||
public void setDir( final File dir ) | public void setDir( final File dir ) | ||||
@@ -29,16 +37,16 @@ public class Mkdir | |||||
public void execute() | public void execute() | ||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
if( m_dir == null ) | |||||
if( null == m_dir ) | |||||
{ | { | ||||
final String message = "dir attribute is required"; | |||||
final String message = REZ.getString( "mkdir.missing-dir.error" ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
if( m_dir.isFile() ) | if( m_dir.isFile() ) | ||||
{ | { | ||||
final String message = "Unable to create directory as a file " + | |||||
"already exists with that name: " + m_dir.getAbsolutePath(); | |||||
final String message = | |||||
REZ.getString( "mkdir.file-exists.error", m_dir.getAbsolutePath() ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
@@ -47,11 +55,12 @@ public class Mkdir | |||||
final boolean result = m_dir.mkdirs(); | final boolean result = m_dir.mkdirs(); | ||||
if( !result ) | if( !result ) | ||||
{ | { | ||||
final String message = "Directory " + m_dir.getAbsolutePath() + " creation was not " + | |||||
"successful for an unknown reason"; | |||||
final String message = | |||||
REZ.getString( "mkdir.nocreate.error", m_dir.getAbsolutePath() ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
final String message = "Created dir: " + m_dir.getAbsolutePath(); | |||||
final String message = | |||||
REZ.getString( "mkdir.create.notice", m_dir.getAbsolutePath() ); | |||||
getLogger().info( message ); | getLogger().info( message ); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,21 @@ | |||||
mkdir.missing-dir.error=dir attribute is required. | |||||
mkdir.file-exists.error=Unable to create directory as a file already exists with that name: "{0}". | |||||
mkdir.nocreate.error=Failed to create directory {0} due to an unknown reason. | |||||
mkdir.create.notice=Created dir: {0} | |||||
touch.neg-time.error=Date of {0} results in negative milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT). | |||||
touch.no-files.error=Specify at least one source - a file or a fileset. | |||||
touch.use-fileset.error=Use a fileset to touch directories. | |||||
touch.readonly-file.error=Can not change modification date of read-only file {0}. | |||||
touch.no-touch.error=Could not create file {0} due to {1}. | |||||
touch.create.notice=Creating {0}. | |||||
delete.nofiles.error=At least one of the file or dir attributes, or a fileset element, must be set. | |||||
delete.bad-file.error=Directory {0} cannot be removed using the file attribute. Use dir instead. | |||||
delete.missing-file.error=Could not find file {0} to delete. | |||||
delete.delete-dir.notice=Deleting directory {0}. | |||||
delete.delete-dir.error=Unable to delete directory {0}. | |||||
delete.delete-file.notice=Deleting {0}. | |||||
delete.delete-file.error=Unable to delete file {0}. | |||||
delete.delete-file.error=Deleting {0} files from {1}. | |||||
delete.summary.notice=Deleted {0,choice,0#zero directories|1#1 directory|2<{0} directories} from {1}. |
@@ -5,7 +5,7 @@ | |||||
* version 1.1, a copy of which has been included with this distribution in | * version 1.1, a copy of which has been included with this distribution in | ||||
* the LICENSE.txt file. | * the LICENSE.txt file. | ||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs.file; | |||||
package org.apache.antlib.file; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
@@ -14,6 +14,8 @@ import java.text.DateFormat; | |||||
import java.text.ParseException; | import java.text.ParseException; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Locale; | import java.util.Locale; | ||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.myrmidon.api.AbstractTask; | import org.apache.myrmidon.api.AbstractTask; | ||||
import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
import org.apache.tools.ant.types.DirectoryScanner; | import org.apache.tools.ant.types.DirectoryScanner; | ||||
@@ -21,30 +23,34 @@ import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | import org.apache.tools.ant.types.ScannerUtil; | ||||
/** | /** | ||||
* Touch a file and/or fileset(s) -- corresponds to the Unix touch command. <p> | |||||
* Touch a file and/or fileset(s) -- corresponds to the Unix touch command. | |||||
* | * | ||||
* If the file to touch doesn't exist, an empty one is created. </p> <p> | |||||
* | |||||
* Note: Setting the modification time of files is not supported in JDK 1.1.</p> | |||||
* If the file to touch doesn't exist, an empty one is created. </p> | |||||
* | * | ||||
* @ant:task name="touch" | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
* @author <a href="mailto:mj@servidium.com">Michael J. Sikorsky</a> | * @author <a href="mailto:mj@servidium.com">Michael J. Sikorsky</a> | ||||
* @author <a href="mailto:shaw@servidium.com">Robert Shaw</a> | * @author <a href="mailto:shaw@servidium.com">Robert Shaw</a> | ||||
* @version $Revision$ $Date$ | |||||
*/ | */ | ||||
public class Touch | public class Touch | ||||
extends AbstractTask | extends AbstractTask | ||||
{ | { | ||||
private final static Resources REZ = | |||||
ResourceManager.getPackageResources( Touch.class ); | |||||
private long m_millis = -1; | private long m_millis = -1; | ||||
private String m_dateTime; | |||||
private String m_datetime; | |||||
private ArrayList m_filesets = new ArrayList(); | private ArrayList m_filesets = new ArrayList(); | ||||
private File m_file; | private File m_file; | ||||
/** | /** | ||||
* Date in the format MM/DD/YYYY HH:MM AM_PM. | * Date in the format MM/DD/YYYY HH:MM AM_PM. | ||||
*/ | */ | ||||
public void setDatetime( String dateTime ) | |||||
public void setDatetime( final String datetime ) | |||||
{ | { | ||||
m_dateTime = dateTime; | |||||
m_datetime = datetime; | |||||
} | } | ||||
/** | /** | ||||
@@ -82,7 +88,7 @@ public class Touch | |||||
{ | { | ||||
validate(); | validate(); | ||||
if( m_dateTime != null ) | |||||
if( m_datetime != null ) | |||||
{ | { | ||||
final DateFormat format = | final DateFormat format = | ||||
DateFormat.getDateTimeInstance( DateFormat.SHORT, | DateFormat.getDateTimeInstance( DateFormat.SHORT, | ||||
@@ -90,11 +96,10 @@ public class Touch | |||||
Locale.US ); | Locale.US ); | ||||
try | try | ||||
{ | { | ||||
final long millis = format.parse( m_dateTime ).getTime(); | |||||
final long millis = format.parse( m_datetime ).getTime(); | |||||
if( 0 > millis ) | if( 0 > millis ) | ||||
{ | { | ||||
final String message = "Date of " + m_dateTime + " results in negative " + | |||||
"milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT)."; | |||||
final String message = REZ.getString( "touch.neg-time.error", m_datetime ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
setMillis( millis ); | setMillis( millis ); | ||||
@@ -113,13 +118,13 @@ public class Touch | |||||
{ | { | ||||
if( null == m_file && 0 == m_filesets.size() ) | if( null == m_file && 0 == m_filesets.size() ) | ||||
{ | { | ||||
final String message = "Specify at least one source - a file or a fileset."; | |||||
final String message = REZ.getString( "touch.no-files.error" ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
if( null != m_file && m_file.exists() && m_file.isDirectory() ) | if( null != m_file && m_file.exists() && m_file.isDirectory() ) | ||||
{ | { | ||||
final String message = "Use a fileset to touch directories."; | |||||
final String message = REZ.getString( "touch.use-fileset.error" ); | |||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
} | } | ||||
} | } | ||||
@@ -132,11 +137,16 @@ public class Touch | |||||
m_millis = System.currentTimeMillis(); | m_millis = System.currentTimeMillis(); | ||||
} | } | ||||
if( m_file != null ) | |||||
if( null != m_file ) | |||||
{ | { | ||||
if( !m_file.exists() ) | if( !m_file.exists() ) | ||||
{ | { | ||||
getLogger().info( "Creating " + m_file ); | |||||
if( getLogger().isInfoEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "touch.create.notice", m_file ); | |||||
getLogger().info( message ); | |||||
} | |||||
try | try | ||||
{ | { | ||||
FileOutputStream fos = new FileOutputStream( m_file ); | FileOutputStream fos = new FileOutputStream( m_file ); | ||||
@@ -145,7 +155,7 @@ public class Touch | |||||
} | } | ||||
catch( final IOException ioe ) | catch( final IOException ioe ) | ||||
{ | { | ||||
final String message = "Could not create " + m_file; | |||||
final String message = REZ.getString( "touch.no-touch.error", m_file, ioe ); | |||||
throw new TaskException( message, ioe ); | throw new TaskException( message, ioe ); | ||||
} | } | ||||
} | } | ||||
@@ -157,21 +167,23 @@ public class Touch | |||||
final int size = m_filesets.size(); | final int size = m_filesets.size(); | ||||
for( int i = 0; i < size; i++ ) | for( int i = 0; i < size; i++ ) | ||||
{ | { | ||||
final FileSet fs = (FileSet)m_filesets.get( i ); | |||||
final DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs ); | |||||
final File fromDir = fs.getDir(); | |||||
final FileSet fileSet = (FileSet)m_filesets.get( i ); | |||||
final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||||
final File fromDir = fileSet.getDir(); | |||||
final String[] srcFiles = ds.getIncludedFiles(); | |||||
final String[] srcDirs = ds.getIncludedDirectories(); | |||||
final String[] srcFiles = scanner.getIncludedFiles(); | |||||
final String[] srcDirs = scanner.getIncludedDirectories(); | |||||
for( int j = 0; j < srcFiles.length; j++ ) | for( int j = 0; j < srcFiles.length; j++ ) | ||||
{ | { | ||||
touch( new File( fromDir, srcFiles[ j ] ) ); | |||||
final File file = new File( fromDir, srcFiles[ j ] ); | |||||
touch( file ); | |||||
} | } | ||||
for( int j = 0; j < srcDirs.length; j++ ) | for( int j = 0; j < srcDirs.length; j++ ) | ||||
{ | { | ||||
touch( new File( fromDir, srcDirs[ j ] ) ); | |||||
final File file = new File( fromDir, srcDirs[ j ] ); | |||||
touch( file ); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -181,7 +193,8 @@ public class Touch | |||||
{ | { | ||||
if( !file.canWrite() ) | if( !file.canWrite() ) | ||||
{ | { | ||||
throw new TaskException( "Can not change modification date of read-only file " + file ); | |||||
final String message = REZ.getString( "touch.readonly-file.error", file ); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; | final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; |
@@ -1,248 +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.util.ArrayList; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | |||||
* Deletes a file or directory, or set of files defined by a fileset. The | |||||
* original delete task would delete a file, or a set of files using the | |||||
* include/exclude syntax. The deltree task would delete a directory tree. This | |||||
* task combines the functionality of these two originally distinct tasks. <p> | |||||
* | |||||
* Currently Delete extends MatchingTask. This is intend <i>only</i> to provide | |||||
* backwards compatibility for a release. The future position is to use nested | |||||
* filesets exclusively.</p> | |||||
* | |||||
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org"> | |||||
* stefano@apache.org</a> | |||||
* @author Tom Dimock <a href="mailto:tad1@cornell.edu">tad1@cornell.edu</a> | |||||
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com | |||||
* </a> | |||||
* @author Jon S. Stevens <a href="mailto:jon@latchkey.com">jon@latchkey.com</a> | |||||
*/ | |||||
public class Delete | |||||
extends Task | |||||
{ | |||||
private final ArrayList filesets = new ArrayList(); | |||||
private File m_dir; | |||||
private File m_file; | |||||
private boolean includeEmpty;// by default, remove matching empty dirs | |||||
/** | |||||
* Set the directory from which files are to be deleted | |||||
* | |||||
* @param dir the directory path. | |||||
*/ | |||||
public void setDir( final File dir ) | |||||
{ | |||||
m_dir = dir; | |||||
} | |||||
/** | |||||
* Set the name of a single file to be removed. | |||||
* | |||||
* @param file the file to be deleted | |||||
*/ | |||||
public void setFile( final File file ) | |||||
{ | |||||
m_file = file; | |||||
} | |||||
/** | |||||
* Adds a set of files (nested fileset attribute). | |||||
* | |||||
* @param set The feature to be added to the Fileset attribute | |||||
*/ | |||||
public void addFileset( FileSet set ) | |||||
{ | |||||
filesets.add( set ); | |||||
} | |||||
/** | |||||
* Delete the file(s). | |||||
* | |||||
* @exception TaskException Description of Exception | |||||
*/ | |||||
public void execute() | |||||
throws TaskException | |||||
{ | |||||
if( m_file == null && m_dir == null && filesets.size() == 0 ) | |||||
{ | |||||
final String message = "At least one of the file or dir attributes, " + | |||||
"or a fileset element, must be set."; | |||||
throw new TaskException( message ); | |||||
} | |||||
// delete the single file | |||||
if( null != m_file ) | |||||
{ | |||||
if( m_file.exists() ) | |||||
{ | |||||
if( m_file.isDirectory() ) | |||||
{ | |||||
final String message = "Directory " + m_file.getAbsolutePath() + | |||||
" cannot be removed using the file attribute. Use dir instead."; | |||||
getLogger().info( message ); | |||||
} | |||||
else | |||||
{ | |||||
getLogger().info( "Deleting: " + m_file.getAbsolutePath() ); | |||||
if( !m_file.delete() ) | |||||
{ | |||||
final String message = "Unable to delete file " + m_file.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
final String message = | |||||
"Could not find file " + m_file.getAbsolutePath() + " to delete."; | |||||
getLogger().debug( message ); | |||||
} | |||||
} | |||||
// delete the directory | |||||
if( m_dir != null && m_dir.exists() && m_dir.isDirectory() ) | |||||
{ | |||||
getLogger().info( "Deleting directory " + m_dir.getAbsolutePath() ); | |||||
removeDir( m_dir ); | |||||
} | |||||
// delete the files in the filesets | |||||
final int size = filesets.size(); | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | |||||
final FileSet fileSet = (FileSet)filesets.get( i ); | |||||
try | |||||
{ | |||||
final DirectoryScanner scanner = | |||||
ScannerUtil.getDirectoryScanner( fileSet ); | |||||
String[] files = scanner.getIncludedFiles(); | |||||
String[] dirs = scanner.getIncludedDirectories(); | |||||
removeFiles( fileSet.getDir(), files, dirs ); | |||||
} | |||||
catch( TaskException be ) | |||||
{ | |||||
// directory doesn't exist or is not readable | |||||
throw be; | |||||
} | |||||
} | |||||
} | |||||
//************************************************************************ | |||||
// protected and private methods | |||||
//************************************************************************ | |||||
protected void removeDir( final File baseDir ) | |||||
throws TaskException | |||||
{ | |||||
final File[] list = baseDir.listFiles(); | |||||
if( list != null ) | |||||
{ | |||||
deleteFiles( list ); | |||||
} | |||||
getLogger().debug( "Deleting directory " + baseDir.getAbsolutePath() ); | |||||
if( !baseDir.delete() ) | |||||
{ | |||||
String message = "Unable to delete directory " + m_dir.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
private void deleteFiles( final File[] list ) | |||||
throws TaskException | |||||
{ | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
final File file = list[ i ]; | |||||
if( file.isDirectory() ) | |||||
{ | |||||
removeDir( file ); | |||||
} | |||||
else | |||||
{ | |||||
getLogger().debug( "Deleting " + file.getAbsolutePath() ); | |||||
if( !file.delete() ) | |||||
{ | |||||
String message = "Unable to delete file " + file.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* remove an array of files in a directory, and a list of subdirectories | |||||
* which will only be deleted if 'includeEmpty' is true | |||||
* | |||||
* @param d directory to work from | |||||
* @param files array of files to delete; can be of zero length | |||||
* @param dirs array of directories to delete; can of zero length | |||||
*/ | |||||
protected void removeFiles( final File baseDir, | |||||
final String[] files, | |||||
final String[] dirs ) | |||||
throws TaskException | |||||
{ | |||||
if( files.length > 0 ) | |||||
{ | |||||
final String message = "Deleting " + files.length + " files from " + baseDir.getAbsolutePath(); | |||||
getLogger().info( message ); | |||||
for( int i = 0; i < files.length; i++ ) | |||||
{ | |||||
final File file = new File( baseDir, files[ i ] ); | |||||
getLogger().debug( "Deleting " + file.getAbsolutePath() ); | |||||
if( !file.delete() ) | |||||
{ | |||||
String message2 = "Unable to delete file " + file.getAbsolutePath(); | |||||
throw new TaskException( message2 ); | |||||
} | |||||
} | |||||
} | |||||
if( dirs.length > 0 && includeEmpty ) | |||||
{ | |||||
int dirCount = 0; | |||||
for( int j = dirs.length - 1; j >= 0; j-- ) | |||||
{ | |||||
File dir = new File( baseDir, dirs[ j ] ); | |||||
String[] dirFiles = dir.list(); | |||||
if( dirFiles == null || dirFiles.length == 0 ) | |||||
{ | |||||
getLogger().debug( "Deleting " + dir.getAbsolutePath() ); | |||||
if( !dir.delete() ) | |||||
{ | |||||
final String message = | |||||
"Unable to delete directory " + dir.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
else | |||||
{ | |||||
dirCount++; | |||||
} | |||||
} | |||||
} | |||||
if( dirCount > 0 ) | |||||
{ | |||||
final String message = "Deleted " + dirCount + " director" + | |||||
( dirCount == 1 ? "y" : "ies" ) + " from " + baseDir.getAbsolutePath(); | |||||
getLogger().info( message ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -1,58 +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 org.apache.myrmidon.api.AbstractTask; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
/** | |||||
* Creates a given directory. | |||||
* | |||||
* @author duncan@x180.com | |||||
*/ | |||||
public class Mkdir | |||||
extends AbstractTask | |||||
{ | |||||
private File m_dir; | |||||
public void setDir( final File dir ) | |||||
{ | |||||
m_dir = dir; | |||||
} | |||||
public void execute() | |||||
throws TaskException | |||||
{ | |||||
if( m_dir == null ) | |||||
{ | |||||
final String message = "dir attribute is required"; | |||||
throw new TaskException( message ); | |||||
} | |||||
if( m_dir.isFile() ) | |||||
{ | |||||
final String message = "Unable to create directory as a file " + | |||||
"already exists with that name: " + m_dir.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
if( !m_dir.exists() ) | |||||
{ | |||||
final boolean result = m_dir.mkdirs(); | |||||
if( !result ) | |||||
{ | |||||
final String message = "Directory " + m_dir.getAbsolutePath() + " creation was not " + | |||||
"successful for an unknown reason"; | |||||
throw new TaskException( message ); | |||||
} | |||||
final String message = "Created dir: " + m_dir.getAbsolutePath(); | |||||
getLogger().info( message ); | |||||
} | |||||
} | |||||
} |
@@ -1,190 +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.FileOutputStream; | |||||
import java.io.IOException; | |||||
import java.text.DateFormat; | |||||
import java.text.ParseException; | |||||
import java.util.ArrayList; | |||||
import java.util.Locale; | |||||
import org.apache.myrmidon.api.AbstractTask; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | |||||
* Touch a file and/or fileset(s) -- corresponds to the Unix touch command. <p> | |||||
* | |||||
* If the file to touch doesn't exist, an empty one is created. </p> <p> | |||||
* | |||||
* Note: Setting the modification time of files is not supported in JDK 1.1.</p> | |||||
* | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
* @author <a href="mailto:mj@servidium.com">Michael J. Sikorsky</a> | |||||
* @author <a href="mailto:shaw@servidium.com">Robert Shaw</a> | |||||
*/ | |||||
public class Touch | |||||
extends AbstractTask | |||||
{ | |||||
private long m_millis = -1; | |||||
private String m_dateTime; | |||||
private ArrayList m_filesets = new ArrayList(); | |||||
private File m_file; | |||||
/** | |||||
* Date in the format MM/DD/YYYY HH:MM AM_PM. | |||||
*/ | |||||
public void setDatetime( String dateTime ) | |||||
{ | |||||
m_dateTime = dateTime; | |||||
} | |||||
/** | |||||
* Sets a single source file to touch. If the file does not exist an empty | |||||
* file will be created. | |||||
*/ | |||||
public void setFile( final File file ) | |||||
{ | |||||
m_file = file; | |||||
} | |||||
/** | |||||
* Milliseconds since 01/01/1970 00:00 am. | |||||
*/ | |||||
public void setMillis( final long millis ) | |||||
{ | |||||
m_millis = millis; | |||||
} | |||||
/** | |||||
* Adds a set of files (nested fileset attribute). | |||||
*/ | |||||
public void addFileset( final FileSet set ) | |||||
{ | |||||
m_filesets.add( set ); | |||||
} | |||||
/** | |||||
* Execute the touch operation. | |||||
* | |||||
* @exception TaskException Description of Exception | |||||
*/ | |||||
public void execute() | |||||
throws TaskException | |||||
{ | |||||
validate(); | |||||
if( m_dateTime != null ) | |||||
{ | |||||
final DateFormat format = | |||||
DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||||
DateFormat.SHORT, | |||||
Locale.US ); | |||||
try | |||||
{ | |||||
final long millis = format.parse( m_dateTime ).getTime(); | |||||
if( 0 > millis ) | |||||
{ | |||||
final String message = "Date of " + m_dateTime + " results in negative " + | |||||
"milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT)."; | |||||
throw new TaskException( message ); | |||||
} | |||||
setMillis( millis ); | |||||
} | |||||
catch( final ParseException pe ) | |||||
{ | |||||
throw new TaskException( pe.getMessage(), pe ); | |||||
} | |||||
} | |||||
touch(); | |||||
} | |||||
private void validate() | |||||
throws TaskException | |||||
{ | |||||
if( null == m_file && 0 == m_filesets.size() ) | |||||
{ | |||||
final String message = "Specify at least one source - a file or a fileset."; | |||||
throw new TaskException( message ); | |||||
} | |||||
if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||||
{ | |||||
final String message = "Use a fileset to touch directories."; | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
private void touch() | |||||
throws TaskException | |||||
{ | |||||
if( m_millis < 0 ) | |||||
{ | |||||
m_millis = System.currentTimeMillis(); | |||||
} | |||||
if( m_file != null ) | |||||
{ | |||||
if( !m_file.exists() ) | |||||
{ | |||||
getLogger().info( "Creating " + m_file ); | |||||
try | |||||
{ | |||||
FileOutputStream fos = new FileOutputStream( m_file ); | |||||
fos.write( new byte[ 0 ] ); | |||||
fos.close(); | |||||
} | |||||
catch( final IOException ioe ) | |||||
{ | |||||
final String message = "Could not create " + m_file; | |||||
throw new TaskException( message, ioe ); | |||||
} | |||||
} | |||||
touch( m_file ); | |||||
} | |||||
// deal with the filesets | |||||
final int size = m_filesets.size(); | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | |||||
final FileSet fs = (FileSet)m_filesets.get( i ); | |||||
final DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs ); | |||||
final File fromDir = fs.getDir(); | |||||
final String[] srcFiles = ds.getIncludedFiles(); | |||||
final String[] srcDirs = ds.getIncludedDirectories(); | |||||
for( int j = 0; j < srcFiles.length; j++ ) | |||||
{ | |||||
touch( new File( fromDir, srcFiles[ j ] ) ); | |||||
} | |||||
for( int j = 0; j < srcDirs.length; j++ ) | |||||
{ | |||||
touch( new File( fromDir, srcDirs[ j ] ) ); | |||||
} | |||||
} | |||||
} | |||||
private void touch( final File file ) | |||||
throws TaskException | |||||
{ | |||||
if( !file.canWrite() ) | |||||
{ | |||||
throw new TaskException( "Can not change modification date of read-only file " + file ); | |||||
} | |||||
final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; | |||||
file.setLastModified( time ); | |||||
} | |||||
} |
@@ -20,7 +20,7 @@ import org.apache.tools.ant.taskdefs.Java; | |||||
import org.apache.tools.ant.taskdefs.Javac; | import org.apache.tools.ant.taskdefs.Javac; | ||||
import org.apache.tools.ant.taskdefs.MatchingTask; | import org.apache.tools.ant.taskdefs.MatchingTask; | ||||
import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter; | import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter; | ||||
import org.apache.tools.ant.taskdefs.file.Mkdir; | |||||
import org.apache.antlib.file.Mkdir; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | import org.apache.tools.ant.types.DirectoryScanner; | ||||
import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
@@ -195,4 +195,10 @@ Legal: | |||||
<log message="Ungzipped file!"/> | <log message="Ungzipped file!"/> | ||||
</target> | </target> | ||||
<target name="file-test"> | |||||
<mkdir dir="/tmp/deleteme"/> | |||||
<touch file="/tmp/deleteme/touch-test"/> | |||||
<delete dir="/tmp/deleteme"/> | |||||
</target> | |||||
</project> | </project> |
@@ -1,248 +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.util.ArrayList; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | |||||
* Deletes a file or directory, or set of files defined by a fileset. The | |||||
* original delete task would delete a file, or a set of files using the | |||||
* include/exclude syntax. The deltree task would delete a directory tree. This | |||||
* task combines the functionality of these two originally distinct tasks. <p> | |||||
* | |||||
* Currently Delete extends MatchingTask. This is intend <i>only</i> to provide | |||||
* backwards compatibility for a release. The future position is to use nested | |||||
* filesets exclusively.</p> | |||||
* | |||||
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org"> | |||||
* stefano@apache.org</a> | |||||
* @author Tom Dimock <a href="mailto:tad1@cornell.edu">tad1@cornell.edu</a> | |||||
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com | |||||
* </a> | |||||
* @author Jon S. Stevens <a href="mailto:jon@latchkey.com">jon@latchkey.com</a> | |||||
*/ | |||||
public class Delete | |||||
extends Task | |||||
{ | |||||
private final ArrayList filesets = new ArrayList(); | |||||
private File m_dir; | |||||
private File m_file; | |||||
private boolean includeEmpty;// by default, remove matching empty dirs | |||||
/** | |||||
* Set the directory from which files are to be deleted | |||||
* | |||||
* @param dir the directory path. | |||||
*/ | |||||
public void setDir( final File dir ) | |||||
{ | |||||
m_dir = dir; | |||||
} | |||||
/** | |||||
* Set the name of a single file to be removed. | |||||
* | |||||
* @param file the file to be deleted | |||||
*/ | |||||
public void setFile( final File file ) | |||||
{ | |||||
m_file = file; | |||||
} | |||||
/** | |||||
* Adds a set of files (nested fileset attribute). | |||||
* | |||||
* @param set The feature to be added to the Fileset attribute | |||||
*/ | |||||
public void addFileset( FileSet set ) | |||||
{ | |||||
filesets.add( set ); | |||||
} | |||||
/** | |||||
* Delete the file(s). | |||||
* | |||||
* @exception TaskException Description of Exception | |||||
*/ | |||||
public void execute() | |||||
throws TaskException | |||||
{ | |||||
if( m_file == null && m_dir == null && filesets.size() == 0 ) | |||||
{ | |||||
final String message = "At least one of the file or dir attributes, " + | |||||
"or a fileset element, must be set."; | |||||
throw new TaskException( message ); | |||||
} | |||||
// delete the single file | |||||
if( null != m_file ) | |||||
{ | |||||
if( m_file.exists() ) | |||||
{ | |||||
if( m_file.isDirectory() ) | |||||
{ | |||||
final String message = "Directory " + m_file.getAbsolutePath() + | |||||
" cannot be removed using the file attribute. Use dir instead."; | |||||
getLogger().info( message ); | |||||
} | |||||
else | |||||
{ | |||||
getLogger().info( "Deleting: " + m_file.getAbsolutePath() ); | |||||
if( !m_file.delete() ) | |||||
{ | |||||
final String message = "Unable to delete file " + m_file.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
final String message = | |||||
"Could not find file " + m_file.getAbsolutePath() + " to delete."; | |||||
getLogger().debug( message ); | |||||
} | |||||
} | |||||
// delete the directory | |||||
if( m_dir != null && m_dir.exists() && m_dir.isDirectory() ) | |||||
{ | |||||
getLogger().info( "Deleting directory " + m_dir.getAbsolutePath() ); | |||||
removeDir( m_dir ); | |||||
} | |||||
// delete the files in the filesets | |||||
final int size = filesets.size(); | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | |||||
final FileSet fileSet = (FileSet)filesets.get( i ); | |||||
try | |||||
{ | |||||
final DirectoryScanner scanner = | |||||
ScannerUtil.getDirectoryScanner( fileSet ); | |||||
String[] files = scanner.getIncludedFiles(); | |||||
String[] dirs = scanner.getIncludedDirectories(); | |||||
removeFiles( fileSet.getDir(), files, dirs ); | |||||
} | |||||
catch( TaskException be ) | |||||
{ | |||||
// directory doesn't exist or is not readable | |||||
throw be; | |||||
} | |||||
} | |||||
} | |||||
//************************************************************************ | |||||
// protected and private methods | |||||
//************************************************************************ | |||||
protected void removeDir( final File baseDir ) | |||||
throws TaskException | |||||
{ | |||||
final File[] list = baseDir.listFiles(); | |||||
if( list != null ) | |||||
{ | |||||
deleteFiles( list ); | |||||
} | |||||
getLogger().debug( "Deleting directory " + baseDir.getAbsolutePath() ); | |||||
if( !baseDir.delete() ) | |||||
{ | |||||
String message = "Unable to delete directory " + m_dir.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
private void deleteFiles( final File[] list ) | |||||
throws TaskException | |||||
{ | |||||
for( int i = 0; i < list.length; i++ ) | |||||
{ | |||||
final File file = list[ i ]; | |||||
if( file.isDirectory() ) | |||||
{ | |||||
removeDir( file ); | |||||
} | |||||
else | |||||
{ | |||||
getLogger().debug( "Deleting " + file.getAbsolutePath() ); | |||||
if( !file.delete() ) | |||||
{ | |||||
String message = "Unable to delete file " + file.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* remove an array of files in a directory, and a list of subdirectories | |||||
* which will only be deleted if 'includeEmpty' is true | |||||
* | |||||
* @param d directory to work from | |||||
* @param files array of files to delete; can be of zero length | |||||
* @param dirs array of directories to delete; can of zero length | |||||
*/ | |||||
protected void removeFiles( final File baseDir, | |||||
final String[] files, | |||||
final String[] dirs ) | |||||
throws TaskException | |||||
{ | |||||
if( files.length > 0 ) | |||||
{ | |||||
final String message = "Deleting " + files.length + " files from " + baseDir.getAbsolutePath(); | |||||
getLogger().info( message ); | |||||
for( int i = 0; i < files.length; i++ ) | |||||
{ | |||||
final File file = new File( baseDir, files[ i ] ); | |||||
getLogger().debug( "Deleting " + file.getAbsolutePath() ); | |||||
if( !file.delete() ) | |||||
{ | |||||
String message2 = "Unable to delete file " + file.getAbsolutePath(); | |||||
throw new TaskException( message2 ); | |||||
} | |||||
} | |||||
} | |||||
if( dirs.length > 0 && includeEmpty ) | |||||
{ | |||||
int dirCount = 0; | |||||
for( int j = dirs.length - 1; j >= 0; j-- ) | |||||
{ | |||||
File dir = new File( baseDir, dirs[ j ] ); | |||||
String[] dirFiles = dir.list(); | |||||
if( dirFiles == null || dirFiles.length == 0 ) | |||||
{ | |||||
getLogger().debug( "Deleting " + dir.getAbsolutePath() ); | |||||
if( !dir.delete() ) | |||||
{ | |||||
final String message = | |||||
"Unable to delete directory " + dir.getAbsolutePath(); | |||||
throw new TaskException( message ); | |||||
} | |||||
else | |||||
{ | |||||
dirCount++; | |||||
} | |||||
} | |||||
} | |||||
if( dirCount > 0 ) | |||||
{ | |||||
final String message = "Deleted " + dirCount + " director" + | |||||
( dirCount == 1 ? "y" : "ies" ) + " from " + baseDir.getAbsolutePath(); | |||||
getLogger().info( message ); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -20,7 +20,7 @@ import org.apache.tools.ant.taskdefs.Java; | |||||
import org.apache.tools.ant.taskdefs.Javac; | import org.apache.tools.ant.taskdefs.Javac; | ||||
import org.apache.tools.ant.taskdefs.MatchingTask; | import org.apache.tools.ant.taskdefs.MatchingTask; | ||||
import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter; | import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter; | ||||
import org.apache.tools.ant.taskdefs.file.Mkdir; | |||||
import org.apache.antlib.file.Mkdir; | |||||
import org.apache.tools.ant.types.DirectoryScanner; | import org.apache.tools.ant.types.DirectoryScanner; | ||||
import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||