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