Browse Source

Move the delete, touch and mkdir tasks into antlib. CLean and refactor each task to make sure is closer to code-normalized. Also make sure all the messages are capable of being i18n'ed

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271115 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 23 years ago
parent
commit
27b4ff64f0
12 changed files with 330 additions and 780 deletions
  1. +4
    -0
      proposal/myrmidon/build.xml
  2. +241
    -0
      proposal/myrmidon/src/java/org/apache/antlib/file/Delete.java
  3. +18
    -9
      proposal/myrmidon/src/java/org/apache/antlib/file/Mkdir.java
  4. +21
    -0
      proposal/myrmidon/src/java/org/apache/antlib/file/Resources.properties
  5. +38
    -25
      proposal/myrmidon/src/java/org/apache/antlib/file/Touch.java
  6. +0
    -248
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Delete.java
  7. +0
    -58
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Mkdir.java
  8. +0
    -190
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Touch.java
  9. +1
    -1
      proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/IContract.java
  10. +6
    -0
      proposal/myrmidon/src/make/sample.ant
  11. +0
    -248
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/file/Delete.java
  12. +1
    -1
      proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/IContract.java

+ 4
- 0
proposal/myrmidon/build.xml View File

@@ -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>


+ 241
- 0
proposal/myrmidon/src/java/org/apache/antlib/file/Delete.java View File

@@ -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 );
}
}
}
}


proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/file/Mkdir.java → proposal/myrmidon/src/java/org/apache/antlib/file/Mkdir.java View File

@@ -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 );
} }
} }

+ 21
- 0
proposal/myrmidon/src/java/org/apache/antlib/file/Resources.properties View File

@@ -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}.

proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/file/Touch.java → proposal/myrmidon/src/java/org/apache/antlib/file/Touch.java View File

@@ -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;

+ 0
- 248
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Delete.java View File

@@ -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 );
}
}
}
}


+ 0
- 58
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Mkdir.java View File

@@ -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 );
}
}
}

+ 0
- 190
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/file/Touch.java View File

@@ -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 );
}
}

+ 1
- 1
proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/optional/IContract.java View File

@@ -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;




+ 6
- 0
proposal/myrmidon/src/make/sample.ant View File

@@ -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>

+ 0
- 248
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/file/Delete.java View File

@@ -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
- 1
proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/optional/IContract.java View File

@@ -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;




Loading…
Cancel
Save