git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270494 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -14,9 +14,9 @@ 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.myrmidon.api.AbstractTask; | |||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
| /** | /** | ||||
| @@ -30,53 +30,45 @@ import org.apache.tools.ant.types.FileSet; | |||||
| * @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> | ||||
| */ | */ | ||||
| public class Touch extends Task | |||||
| {// required | |||||
| private long millis = -1; | |||||
| private ArrayList filesets = new ArrayList(); | |||||
| private String dateTime; | |||||
| private File file; | |||||
| 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. | * Date in the format MM/DD/YYYY HH:MM AM_PM. | ||||
| * | |||||
| * @param dateTime The new Datetime value | |||||
| */ | */ | ||||
| public void setDatetime( String dateTime ) | public void setDatetime( String dateTime ) | ||||
| { | { | ||||
| this.dateTime = dateTime; | |||||
| m_dateTime = dateTime; | |||||
| } | } | ||||
| /** | /** | ||||
| * Sets a single source file to touch. If the file does not exist an empty | * Sets a single source file to touch. If the file does not exist an empty | ||||
| * file will be created. | * file will be created. | ||||
| * | |||||
| * @param file The new File value | |||||
| */ | */ | ||||
| public void setFile( File file ) | |||||
| public void setFile( final File file ) | |||||
| { | { | ||||
| this.file = file; | |||||
| m_file = file; | |||||
| } | } | ||||
| /** | /** | ||||
| * Milliseconds since 01/01/1970 00:00 am. | * Milliseconds since 01/01/1970 00:00 am. | ||||
| * | |||||
| * @param millis The new Millis value | |||||
| */ | */ | ||||
| public void setMillis( long millis ) | |||||
| public void setMillis( final long millis ) | |||||
| { | { | ||||
| this.millis = millis; | |||||
| m_millis = millis; | |||||
| } | } | ||||
| /** | /** | ||||
| * Adds a set of files (nested fileset attribute). | * Adds a set of files (nested fileset attribute). | ||||
| * | |||||
| * @param set The feature to be added to the Fileset attribute | |||||
| */ | */ | ||||
| public void addFileset( FileSet set ) | |||||
| public void addFileset( final FileSet set ) | |||||
| { | { | ||||
| filesets.add( set ); | |||||
| m_filesets.add( set ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -87,32 +79,26 @@ public class Touch extends Task | |||||
| public void execute() | public void execute() | ||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| if( file == null && filesets.size() == 0 ) | |||||
| { | |||||
| throw | |||||
| new TaskException( "Specify at least one source - a file or a fileset." ); | |||||
| } | |||||
| validate(); | |||||
| if( file != null && file.exists() && file.isDirectory() ) | |||||
| if( m_dateTime != null ) | |||||
| { | { | ||||
| throw new TaskException( "Use a fileset to touch directories." ); | |||||
| } | |||||
| if( dateTime != null ) | |||||
| { | |||||
| DateFormat df = DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||||
| DateFormat.SHORT, | |||||
| Locale.US ); | |||||
| final DateFormat format = | |||||
| DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||||
| DateFormat.SHORT, | |||||
| Locale.US ); | |||||
| try | try | ||||
| { | { | ||||
| setMillis( df.parse( dateTime ).getTime() ); | |||||
| if( millis < 0 ) | |||||
| final long millis = format.parse( m_dateTime ).getTime(); | |||||
| if( 0 > millis ) | |||||
| { | { | ||||
| throw new TaskException( "Date of " + dateTime | |||||
| + " results in negative milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT)." ); | |||||
| 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( ParseException pe ) | |||||
| catch( final ParseException pe ) | |||||
| { | { | ||||
| throw new TaskException( pe.getMessage(), pe ); | throw new TaskException( pe.getMessage(), pe ); | ||||
| } | } | ||||
| @@ -121,53 +107,61 @@ public class Touch extends Task | |||||
| touch(); | touch(); | ||||
| } | } | ||||
| /** | |||||
| * Does the actual work. Entry point for Untar and Expand as well. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void 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 | throws TaskException | ||||
| { | { | ||||
| if( file != null ) | |||||
| if( m_millis < 0 ) | |||||
| { | |||||
| m_millis = System.currentTimeMillis(); | |||||
| } | |||||
| if( m_file != null ) | |||||
| { | { | ||||
| if( !file.exists() ) | |||||
| if( !m_file.exists() ) | |||||
| { | { | ||||
| getLogger().info( "Creating " + file ); | |||||
| getLogger().info( "Creating " + m_file ); | |||||
| try | try | ||||
| { | { | ||||
| FileOutputStream fos = new FileOutputStream( file ); | |||||
| FileOutputStream fos = new FileOutputStream( m_file ); | |||||
| fos.write( new byte[ 0 ] ); | fos.write( new byte[ 0 ] ); | ||||
| fos.close(); | fos.close(); | ||||
| } | } | ||||
| catch( IOException ioe ) | |||||
| catch( final IOException ioe ) | |||||
| { | { | ||||
| throw new TaskException( "Could not create " + file, ioe ); | |||||
| final String message = "Could not create " + m_file; | |||||
| throw new TaskException( message, ioe ); | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| boolean resetMillis = false; | |||||
| if( millis < 0 ) | |||||
| { | |||||
| resetMillis = true; | |||||
| millis = System.currentTimeMillis(); | |||||
| } | |||||
| if( file != null ) | |||||
| { | |||||
| touch( file ); | |||||
| touch( m_file ); | |||||
| } | } | ||||
| // deal with the filesets | // deal with the filesets | ||||
| for( int i = 0; i < filesets.size(); i++ ) | |||||
| final int size = m_filesets.size(); | |||||
| for( int i = 0; i < size; i++ ) | |||||
| { | { | ||||
| FileSet fs = (FileSet)filesets.get( i ); | |||||
| DirectoryScanner ds = fs.getDirectoryScanner( getProject() ); | |||||
| File fromDir = fs.getDir( getProject() ); | |||||
| final FileSet fs = (FileSet)m_filesets.get( i ); | |||||
| final DirectoryScanner ds = fs.getDirectoryScanner( null ); | |||||
| final File fromDir = fs.getDir( null ); | |||||
| String[] srcFiles = ds.getIncludedFiles(); | |||||
| String[] srcDirs = ds.getIncludedDirectories(); | |||||
| final String[] srcFiles = ds.getIncludedFiles(); | |||||
| final String[] srcDirs = ds.getIncludedDirectories(); | |||||
| for( int j = 0; j < srcFiles.length; j++ ) | for( int j = 0; j < srcFiles.length; j++ ) | ||||
| { | { | ||||
| @@ -179,14 +173,9 @@ public class Touch extends Task | |||||
| touch( new File( fromDir, srcDirs[ j ] ) ); | touch( new File( fromDir, srcDirs[ j ] ) ); | ||||
| } | } | ||||
| } | } | ||||
| if( resetMillis ) | |||||
| { | |||||
| millis = -1; | |||||
| } | |||||
| } | } | ||||
| protected void touch( File file ) | |||||
| private void touch( final File file ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| if( !file.canWrite() ) | if( !file.canWrite() ) | ||||
| @@ -194,7 +183,7 @@ public class Touch extends Task | |||||
| throw new TaskException( "Can not change modification date of read-only file " + file ); | throw new TaskException( "Can not change modification date of read-only file " + file ); | ||||
| } | } | ||||
| final long time = ( millis < 0 ) ? System.currentTimeMillis() : millis; | |||||
| final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; | |||||
| file.setLastModified( time ); | file.setLastModified( time ); | ||||
| } | } | ||||
| } | } | ||||
| @@ -14,9 +14,9 @@ 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.myrmidon.api.AbstractTask; | |||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
| /** | /** | ||||
| @@ -30,53 +30,45 @@ import org.apache.tools.ant.types.FileSet; | |||||
| * @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> | ||||
| */ | */ | ||||
| public class Touch extends Task | |||||
| {// required | |||||
| private long millis = -1; | |||||
| private ArrayList filesets = new ArrayList(); | |||||
| private String dateTime; | |||||
| private File file; | |||||
| 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. | * Date in the format MM/DD/YYYY HH:MM AM_PM. | ||||
| * | |||||
| * @param dateTime The new Datetime value | |||||
| */ | */ | ||||
| public void setDatetime( String dateTime ) | public void setDatetime( String dateTime ) | ||||
| { | { | ||||
| this.dateTime = dateTime; | |||||
| m_dateTime = dateTime; | |||||
| } | } | ||||
| /** | /** | ||||
| * Sets a single source file to touch. If the file does not exist an empty | * Sets a single source file to touch. If the file does not exist an empty | ||||
| * file will be created. | * file will be created. | ||||
| * | |||||
| * @param file The new File value | |||||
| */ | */ | ||||
| public void setFile( File file ) | |||||
| public void setFile( final File file ) | |||||
| { | { | ||||
| this.file = file; | |||||
| m_file = file; | |||||
| } | } | ||||
| /** | /** | ||||
| * Milliseconds since 01/01/1970 00:00 am. | * Milliseconds since 01/01/1970 00:00 am. | ||||
| * | |||||
| * @param millis The new Millis value | |||||
| */ | */ | ||||
| public void setMillis( long millis ) | |||||
| public void setMillis( final long millis ) | |||||
| { | { | ||||
| this.millis = millis; | |||||
| m_millis = millis; | |||||
| } | } | ||||
| /** | /** | ||||
| * Adds a set of files (nested fileset attribute). | * Adds a set of files (nested fileset attribute). | ||||
| * | |||||
| * @param set The feature to be added to the Fileset attribute | |||||
| */ | */ | ||||
| public void addFileset( FileSet set ) | |||||
| public void addFileset( final FileSet set ) | |||||
| { | { | ||||
| filesets.add( set ); | |||||
| m_filesets.add( set ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -87,32 +79,26 @@ public class Touch extends Task | |||||
| public void execute() | public void execute() | ||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| if( file == null && filesets.size() == 0 ) | |||||
| { | |||||
| throw | |||||
| new TaskException( "Specify at least one source - a file or a fileset." ); | |||||
| } | |||||
| validate(); | |||||
| if( file != null && file.exists() && file.isDirectory() ) | |||||
| if( m_dateTime != null ) | |||||
| { | { | ||||
| throw new TaskException( "Use a fileset to touch directories." ); | |||||
| } | |||||
| if( dateTime != null ) | |||||
| { | |||||
| DateFormat df = DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||||
| DateFormat.SHORT, | |||||
| Locale.US ); | |||||
| final DateFormat format = | |||||
| DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||||
| DateFormat.SHORT, | |||||
| Locale.US ); | |||||
| try | try | ||||
| { | { | ||||
| setMillis( df.parse( dateTime ).getTime() ); | |||||
| if( millis < 0 ) | |||||
| final long millis = format.parse( m_dateTime ).getTime(); | |||||
| if( 0 > millis ) | |||||
| { | { | ||||
| throw new TaskException( "Date of " + dateTime | |||||
| + " results in negative milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT)." ); | |||||
| 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( ParseException pe ) | |||||
| catch( final ParseException pe ) | |||||
| { | { | ||||
| throw new TaskException( pe.getMessage(), pe ); | throw new TaskException( pe.getMessage(), pe ); | ||||
| } | } | ||||
| @@ -121,53 +107,61 @@ public class Touch extends Task | |||||
| touch(); | touch(); | ||||
| } | } | ||||
| /** | |||||
| * Does the actual work. Entry point for Untar and Expand as well. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void 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 | throws TaskException | ||||
| { | { | ||||
| if( file != null ) | |||||
| if( m_millis < 0 ) | |||||
| { | |||||
| m_millis = System.currentTimeMillis(); | |||||
| } | |||||
| if( m_file != null ) | |||||
| { | { | ||||
| if( !file.exists() ) | |||||
| if( !m_file.exists() ) | |||||
| { | { | ||||
| getLogger().info( "Creating " + file ); | |||||
| getLogger().info( "Creating " + m_file ); | |||||
| try | try | ||||
| { | { | ||||
| FileOutputStream fos = new FileOutputStream( file ); | |||||
| FileOutputStream fos = new FileOutputStream( m_file ); | |||||
| fos.write( new byte[ 0 ] ); | fos.write( new byte[ 0 ] ); | ||||
| fos.close(); | fos.close(); | ||||
| } | } | ||||
| catch( IOException ioe ) | |||||
| catch( final IOException ioe ) | |||||
| { | { | ||||
| throw new TaskException( "Could not create " + file, ioe ); | |||||
| final String message = "Could not create " + m_file; | |||||
| throw new TaskException( message, ioe ); | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| boolean resetMillis = false; | |||||
| if( millis < 0 ) | |||||
| { | |||||
| resetMillis = true; | |||||
| millis = System.currentTimeMillis(); | |||||
| } | |||||
| if( file != null ) | |||||
| { | |||||
| touch( file ); | |||||
| touch( m_file ); | |||||
| } | } | ||||
| // deal with the filesets | // deal with the filesets | ||||
| for( int i = 0; i < filesets.size(); i++ ) | |||||
| final int size = m_filesets.size(); | |||||
| for( int i = 0; i < size; i++ ) | |||||
| { | { | ||||
| FileSet fs = (FileSet)filesets.get( i ); | |||||
| DirectoryScanner ds = fs.getDirectoryScanner( getProject() ); | |||||
| File fromDir = fs.getDir( getProject() ); | |||||
| final FileSet fs = (FileSet)m_filesets.get( i ); | |||||
| final DirectoryScanner ds = fs.getDirectoryScanner( null ); | |||||
| final File fromDir = fs.getDir( null ); | |||||
| String[] srcFiles = ds.getIncludedFiles(); | |||||
| String[] srcDirs = ds.getIncludedDirectories(); | |||||
| final String[] srcFiles = ds.getIncludedFiles(); | |||||
| final String[] srcDirs = ds.getIncludedDirectories(); | |||||
| for( int j = 0; j < srcFiles.length; j++ ) | for( int j = 0; j < srcFiles.length; j++ ) | ||||
| { | { | ||||
| @@ -179,14 +173,9 @@ public class Touch extends Task | |||||
| touch( new File( fromDir, srcDirs[ j ] ) ); | touch( new File( fromDir, srcDirs[ j ] ) ); | ||||
| } | } | ||||
| } | } | ||||
| if( resetMillis ) | |||||
| { | |||||
| millis = -1; | |||||
| } | |||||
| } | } | ||||
| protected void touch( File file ) | |||||
| private void touch( final File file ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| if( !file.canWrite() ) | if( !file.canWrite() ) | ||||
| @@ -194,7 +183,7 @@ public class Touch extends Task | |||||
| throw new TaskException( "Can not change modification date of read-only file " + file ); | throw new TaskException( "Can not change modification date of read-only file " + file ); | ||||
| } | } | ||||
| final long time = ( millis < 0 ) ? System.currentTimeMillis() : millis; | |||||
| final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; | |||||
| file.setLastModified( time ); | file.setLastModified( time ); | ||||
| } | } | ||||
| } | } | ||||