git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270942 13f79535-47bb-0310-9956-ffa450edef68master
@@ -18,14 +18,15 @@ import java.util.Date; | |||||
import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||
import java.util.zip.ZipInputStream; | import java.util.zip.ZipInputStream; | ||||
import org.apache.avalon.excalibur.io.FileUtil; | import org.apache.avalon.excalibur.io.FileUtil; | ||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.avalon.excalibur.io.IOUtil; | |||||
import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.myrmidon.framework.PatternSet; | import org.apache.myrmidon.framework.PatternSet; | ||||
import org.apache.myrmidon.framework.PatternUtil; | import org.apache.myrmidon.framework.PatternUtil; | ||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
import org.apache.tools.ant.taskdefs.MatchingTask; | import org.apache.tools.ant.taskdefs.MatchingTask; | ||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | /** | ||||
* Unzip a file. | * Unzip a file. | ||||
@@ -34,23 +35,24 @@ import org.apache.tools.ant.taskdefs.MatchingTask; | |||||
* @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:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Expand extends MatchingTask | |||||
{// req | |||||
private boolean overwrite = true; | |||||
private ArrayList patternsets = new ArrayList(); | |||||
private ArrayList filesets = new ArrayList(); | |||||
private File dest;//req | |||||
private File source; | |||||
public class Expand | |||||
extends MatchingTask | |||||
{ | |||||
private boolean m_overwrite = true; | |||||
private ArrayList m_patternsets = new ArrayList(); | |||||
private ArrayList m_filesets = new ArrayList(); | |||||
private File m_dest;//req | |||||
private File m_src; | |||||
/** | /** | ||||
* Set the destination directory. File will be unzipped into the destination | * Set the destination directory. File will be unzipped into the destination | ||||
* directory. | * directory. | ||||
* | * | ||||
* @param d Path to the directory. | |||||
* @param dest Path to the directory. | |||||
*/ | */ | ||||
public void setDest( File d ) | |||||
public void setDest( final File dest ) | |||||
{ | { | ||||
this.dest = d; | |||||
m_dest = dest; | |||||
} | } | ||||
/** | /** | ||||
@@ -59,9 +61,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param b The new Overwrite value | * @param b The new Overwrite value | ||||
*/ | */ | ||||
public void setOverwrite( boolean b ) | |||||
public void setOverwrite( final boolean overwrite ) | |||||
{ | { | ||||
overwrite = b; | |||||
m_overwrite = overwrite; | |||||
} | } | ||||
/** | /** | ||||
@@ -69,9 +71,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param s Path to zip-file. | * @param s Path to zip-file. | ||||
*/ | */ | ||||
public void setSrc( File s ) | |||||
public void setSrc( final File src ) | |||||
{ | { | ||||
this.source = s; | |||||
m_src = src; | |||||
} | } | ||||
/** | /** | ||||
@@ -79,9 +81,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param set The feature to be added to the 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 ); | |||||
} | } | ||||
/** | /** | ||||
@@ -89,9 +91,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param set The feature to be added to the Patternset attribute | * @param set The feature to be added to the Patternset attribute | ||||
*/ | */ | ||||
public void addPatternset( PatternSet set ) | |||||
public void addPatternset( final PatternSet set ) | |||||
{ | { | ||||
patternsets.add( set ); | |||||
m_patternsets.add( set ); | |||||
} | } | ||||
/** | /** | ||||
@@ -102,115 +104,121 @@ public class Expand extends MatchingTask | |||||
public void execute() | public void execute() | ||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
if( source == null && filesets.size() == 0 ) | |||||
validate(); | |||||
if( m_src != null ) | |||||
{ | { | ||||
throw new TaskException( "src attribute and/or filesets must be specified" ); | |||||
expandFile( m_src, m_dest ); | |||||
} | } | ||||
if( dest == null ) | |||||
final int size = m_filesets.size(); | |||||
if( size > 0 ) | |||||
{ | { | ||||
throw new TaskException( | |||||
"Dest attribute must be specified" ); | |||||
for( int j = 0; j < size; j++ ) | |||||
{ | |||||
final FileSet fileSet = (FileSet)m_filesets.get( j ); | |||||
final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||||
final File fromDir = fileSet.getDir(); | |||||
final String[] files = scanner.getIncludedFiles(); | |||||
for( int i = 0; i < files.length; ++i ) | |||||
{ | |||||
final File file = new File( fromDir, files[ i ] ); | |||||
expandFile( file, m_dest ); | |||||
} | |||||
} | |||||
} | } | ||||
} | |||||
if( dest.exists() && !dest.isDirectory() ) | |||||
private void validate() | |||||
throws TaskException | |||||
{ | |||||
if( m_src == null && m_filesets.size() == 0 ) | |||||
{ | { | ||||
throw new TaskException( "Dest must be a directory." ); | |||||
final String message = "src attribute and/or filesets must be specified"; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
if( source != null ) | |||||
if( m_dest == null ) | |||||
{ | { | ||||
if( source.isDirectory() ) | |||||
{ | |||||
throw new TaskException( "Src must not be a directory." + | |||||
" Use nested filesets instead." ); | |||||
} | |||||
else | |||||
{ | |||||
expandFile( source, dest ); | |||||
} | |||||
final String message = "Dest attribute must be specified"; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
if( filesets.size() > 0 ) | |||||
if( m_dest.exists() && !m_dest.isDirectory() ) | |||||
{ | { | ||||
for( int j = 0; j < filesets.size(); j++ ) | |||||
{ | |||||
FileSet fs = (FileSet)filesets.get( j ); | |||||
DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs ); | |||||
File fromDir = fs.getDir(); | |||||
final String message = "Dest must be a directory."; | |||||
throw new TaskException( message ); | |||||
} | |||||
String[] files = ds.getIncludedFiles(); | |||||
for( int i = 0; i < files.length; ++i ) | |||||
{ | |||||
File file = new File( fromDir, files[ i ] ); | |||||
expandFile( file, dest ); | |||||
} | |||||
} | |||||
if( m_src != null && m_src.isDirectory() ) | |||||
{ | |||||
final String message = "Src must not be a directory." + | |||||
" Use nested filesets instead."; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* This method is to be overridden by extending unarchival tasks. | * This method is to be overridden by extending unarchival tasks. | ||||
*/ | */ | ||||
protected void expandFile( File srcF, File dir ) | |||||
protected void expandFile( final File src, final File dir ) | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
ZipInputStream zis = null; | ZipInputStream zis = null; | ||||
try | try | ||||
{ | { | ||||
// code from WarExpand | // code from WarExpand | ||||
zis = new ZipInputStream( new FileInputStream( srcF ) ); | |||||
zis = new ZipInputStream( new FileInputStream( src ) ); | |||||
ZipEntry ze = null; | ZipEntry ze = null; | ||||
while( ( ze = zis.getNextEntry() ) != null ) | while( ( ze = zis.getNextEntry() ) != null ) | ||||
{ | { | ||||
extractFile( srcF, dir, zis, | |||||
ze.getName(), | |||||
new Date( ze.getTime() ), | |||||
ze.isDirectory() ); | |||||
final Date date = new Date( ze.getTime() ); | |||||
extractFile( | |||||
dir, | |||||
zis, | |||||
ze.getName(), | |||||
date, | |||||
ze.isDirectory() ); | |||||
} | } | ||||
getLogger().debug( "expand complete" ); | |||||
} | } | ||||
catch( IOException ioe ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
throw new TaskException( "Error while expanding " + srcF.getPath(), ioe ); | |||||
final String message = "Error while expanding " + src.getPath(); | |||||
throw new TaskException( message, ioe ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( zis != null ) | |||||
{ | |||||
try | |||||
{ | |||||
zis.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( zis ); | |||||
} | } | ||||
final String message = "expand complete"; | |||||
getLogger().debug( message ); | |||||
} | } | ||||
protected void extractFile( File srcF, File dir, | |||||
InputStream compressedInputStream, | |||||
String entryName, | |||||
Date entryDate, boolean isDirectory ) | |||||
protected void extractFile( final File dir, | |||||
final InputStream input, | |||||
final String entryName, | |||||
final Date date, | |||||
final boolean isDirectory ) | |||||
throws IOException, TaskException | throws IOException, TaskException | ||||
{ | { | ||||
if( patternsets != null && patternsets.size() > 0 ) | |||||
final int size = m_patternsets.size(); | |||||
if( m_patternsets != null && size > 0 ) | |||||
{ | { | ||||
String name = entryName; | |||||
boolean included = false; | boolean included = false; | ||||
for( int v = 0; v < patternsets.size(); v++ ) | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | { | ||||
PatternSet p = (PatternSet)patternsets.get( v ); | |||||
PatternSet p = (PatternSet)m_patternsets.get( i ); | |||||
final TaskContext context = getContext(); | final TaskContext context = getContext(); | ||||
String[] incls = PatternUtil.getIncludePatterns( p, context ); | String[] incls = PatternUtil.getIncludePatterns( p, context ); | ||||
if( incls != null ) | if( incls != null ) | ||||
{ | { | ||||
for( int w = 0; w < incls.length; w++ ) | |||||
for( int j = 0; j < incls.length; j++ ) | |||||
{ | { | ||||
boolean isIncl = ScannerUtil.match( incls[ w ], name ); | |||||
boolean isIncl = ScannerUtil.match( incls[ j ], entryName ); | |||||
if( isIncl ) | if( isIncl ) | ||||
{ | { | ||||
included = true; | included = true; | ||||
@@ -222,9 +230,9 @@ public class Expand extends MatchingTask | |||||
String[] excls = PatternUtil.getExcludePatterns( p, context1 ); | String[] excls = PatternUtil.getExcludePatterns( p, context1 ); | ||||
if( excls != null ) | if( excls != null ) | ||||
{ | { | ||||
for( int w = 0; w < excls.length; w++ ) | |||||
for( int j = 0; j < excls.length; j++ ) | |||||
{ | { | ||||
boolean isExcl = ScannerUtil.match( excls[ w ], name ); | |||||
boolean isExcl = ScannerUtil.match( excls[ j ], entryName ); | |||||
if( isExcl ) | if( isExcl ) | ||||
{ | { | ||||
included = false; | included = false; | ||||
@@ -233,6 +241,7 @@ public class Expand extends MatchingTask | |||||
} | } | ||||
} | } | ||||
} | } | ||||
if( !included ) | if( !included ) | ||||
{ | { | ||||
//Do not process this file | //Do not process this file | ||||
@@ -243,8 +252,8 @@ public class Expand extends MatchingTask | |||||
File f = FileUtil.resolveFile( dir, entryName ); | File f = FileUtil.resolveFile( dir, entryName ); | ||||
try | try | ||||
{ | { | ||||
if( !overwrite && f.exists() | |||||
&& f.lastModified() >= entryDate.getTime() ) | |||||
if( !m_overwrite && f.exists() | |||||
&& f.lastModified() >= date.getTime() ) | |||||
{ | { | ||||
getLogger().debug( "Skipping " + f + " as it is up-to-date" ); | getLogger().debug( "Skipping " + f + " as it is up-to-date" ); | ||||
return; | return; | ||||
@@ -261,43 +270,23 @@ public class Expand extends MatchingTask | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
byte[] buffer = new byte[ 1024 ]; | |||||
int length = 0; | |||||
FileOutputStream fos = null; | FileOutputStream fos = null; | ||||
try | try | ||||
{ | { | ||||
fos = new FileOutputStream( f ); | fos = new FileOutputStream( f ); | ||||
while( ( length = | |||||
compressedInputStream.read( buffer ) ) >= 0 ) | |||||
{ | |||||
fos.write( buffer, 0, length ); | |||||
} | |||||
fos.close(); | |||||
fos = null; | |||||
IOUtil.copy( input, fos ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( fos != null ) | |||||
{ | |||||
try | |||||
{ | |||||
fos.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( fos ); | |||||
} | } | ||||
} | } | ||||
f.setLastModified( entryDate.getTime() ); | |||||
f.setLastModified( date.getTime() ); | |||||
} | } | ||||
catch( FileNotFoundException ex ) | catch( FileNotFoundException ex ) | ||||
{ | { | ||||
getLogger().warn( "Unable to expand to file " + f.getPath() ); | getLogger().warn( "Unable to expand to file " + f.getPath() ); | ||||
} | } | ||||
} | } | ||||
} | } |
@@ -10,9 +10,10 @@ package org.apache.tools.ant.taskdefs.archive; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileInputStream; | import java.io.FileInputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.aut.tar.TarEntry; | import org.apache.aut.tar.TarEntry; | ||||
import org.apache.aut.tar.TarInputStream; | import org.apache.aut.tar.TarInputStream; | ||||
import org.apache.avalon.excalibur.io.IOUtil; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
/** | /** | ||||
* Untar a file. Heavily based on the Expand task. | * Untar a file. Heavily based on the Expand task. | ||||
@@ -20,45 +21,47 @@ import org.apache.aut.tar.TarInputStream; | |||||
* @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:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Untar extends Expand | |||||
public class Untar | |||||
extends Expand | |||||
{ | { | ||||
protected void expandFile( File srcF, File dir ) | |||||
protected void expandFile( final File src, final File dir ) | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
TarInputStream tis = null; | |||||
try | |||||
if( getLogger().isInfoEnabled() ) | |||||
{ | { | ||||
getLogger().info( "Expanding: " + srcF + " into " + dir ); | |||||
final String message = "Expanding: " + src + " into " + dir; | |||||
getLogger().info( message ); | |||||
} | |||||
tis = new TarInputStream( new FileInputStream( srcF ) ); | |||||
TarEntry te = null; | |||||
TarInputStream input = null; | |||||
FileInputStream fileInput = null; | |||||
try | |||||
{ | |||||
fileInput = new FileInputStream( src ); | |||||
input = new TarInputStream( fileInput ); | |||||
while( ( te = tis.getNextEntry() ) != null ) | |||||
TarEntry entry = null; | |||||
while( ( entry = input.getNextEntry() ) != null ) | |||||
{ | { | ||||
extractFile( srcF, dir, tis, | |||||
te.getName(), | |||||
te.getModTime(), te.isDirectory() ); | |||||
extractFile( dir, | |||||
input, | |||||
entry.getName(), | |||||
entry.getModTime(), | |||||
entry.isDirectory() ); | |||||
} | } | ||||
getLogger().debug( "expand complete" ); | |||||
} | } | ||||
catch( IOException ioe ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
throw new TaskException( "Error while expanding " + srcF.getPath(), ioe ); | |||||
final String message = "Error while expanding " + src.getPath(); | |||||
throw new TaskException( message, ioe ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( tis != null ) | |||||
{ | |||||
try | |||||
{ | |||||
tis.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( fileInput ); | |||||
IOUtil.shutdownStream( input ); | |||||
} | } | ||||
final String message = "expand complete"; | |||||
getLogger().debug( message ); | |||||
} | } | ||||
} | } |
@@ -18,14 +18,15 @@ import java.util.Date; | |||||
import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||
import java.util.zip.ZipInputStream; | import java.util.zip.ZipInputStream; | ||||
import org.apache.avalon.excalibur.io.FileUtil; | import org.apache.avalon.excalibur.io.FileUtil; | ||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.avalon.excalibur.io.IOUtil; | |||||
import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.myrmidon.framework.PatternSet; | import org.apache.myrmidon.framework.PatternSet; | ||||
import org.apache.myrmidon.framework.PatternUtil; | import org.apache.myrmidon.framework.PatternUtil; | ||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
import org.apache.tools.ant.taskdefs.MatchingTask; | import org.apache.tools.ant.taskdefs.MatchingTask; | ||||
import org.apache.tools.ant.types.DirectoryScanner; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
import org.apache.tools.ant.types.ScannerUtil; | |||||
/** | /** | ||||
* Unzip a file. | * Unzip a file. | ||||
@@ -34,23 +35,24 @@ import org.apache.tools.ant.taskdefs.MatchingTask; | |||||
* @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:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Expand extends MatchingTask | |||||
{// req | |||||
private boolean overwrite = true; | |||||
private ArrayList patternsets = new ArrayList(); | |||||
private ArrayList filesets = new ArrayList(); | |||||
private File dest;//req | |||||
private File source; | |||||
public class Expand | |||||
extends MatchingTask | |||||
{ | |||||
private boolean m_overwrite = true; | |||||
private ArrayList m_patternsets = new ArrayList(); | |||||
private ArrayList m_filesets = new ArrayList(); | |||||
private File m_dest;//req | |||||
private File m_src; | |||||
/** | /** | ||||
* Set the destination directory. File will be unzipped into the destination | * Set the destination directory. File will be unzipped into the destination | ||||
* directory. | * directory. | ||||
* | * | ||||
* @param d Path to the directory. | |||||
* @param dest Path to the directory. | |||||
*/ | */ | ||||
public void setDest( File d ) | |||||
public void setDest( final File dest ) | |||||
{ | { | ||||
this.dest = d; | |||||
m_dest = dest; | |||||
} | } | ||||
/** | /** | ||||
@@ -59,9 +61,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param b The new Overwrite value | * @param b The new Overwrite value | ||||
*/ | */ | ||||
public void setOverwrite( boolean b ) | |||||
public void setOverwrite( final boolean overwrite ) | |||||
{ | { | ||||
overwrite = b; | |||||
m_overwrite = overwrite; | |||||
} | } | ||||
/** | /** | ||||
@@ -69,9 +71,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param s Path to zip-file. | * @param s Path to zip-file. | ||||
*/ | */ | ||||
public void setSrc( File s ) | |||||
public void setSrc( final File src ) | |||||
{ | { | ||||
this.source = s; | |||||
m_src = src; | |||||
} | } | ||||
/** | /** | ||||
@@ -79,9 +81,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param set The feature to be added to the 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 ); | |||||
} | } | ||||
/** | /** | ||||
@@ -89,9 +91,9 @@ public class Expand extends MatchingTask | |||||
* | * | ||||
* @param set The feature to be added to the Patternset attribute | * @param set The feature to be added to the Patternset attribute | ||||
*/ | */ | ||||
public void addPatternset( PatternSet set ) | |||||
public void addPatternset( final PatternSet set ) | |||||
{ | { | ||||
patternsets.add( set ); | |||||
m_patternsets.add( set ); | |||||
} | } | ||||
/** | /** | ||||
@@ -102,115 +104,121 @@ public class Expand extends MatchingTask | |||||
public void execute() | public void execute() | ||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
if( source == null && filesets.size() == 0 ) | |||||
validate(); | |||||
if( m_src != null ) | |||||
{ | { | ||||
throw new TaskException( "src attribute and/or filesets must be specified" ); | |||||
expandFile( m_src, m_dest ); | |||||
} | } | ||||
if( dest == null ) | |||||
final int size = m_filesets.size(); | |||||
if( size > 0 ) | |||||
{ | { | ||||
throw new TaskException( | |||||
"Dest attribute must be specified" ); | |||||
for( int j = 0; j < size; j++ ) | |||||
{ | |||||
final FileSet fileSet = (FileSet)m_filesets.get( j ); | |||||
final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||||
final File fromDir = fileSet.getDir(); | |||||
final String[] files = scanner.getIncludedFiles(); | |||||
for( int i = 0; i < files.length; ++i ) | |||||
{ | |||||
final File file = new File( fromDir, files[ i ] ); | |||||
expandFile( file, m_dest ); | |||||
} | |||||
} | |||||
} | } | ||||
} | |||||
if( dest.exists() && !dest.isDirectory() ) | |||||
private void validate() | |||||
throws TaskException | |||||
{ | |||||
if( m_src == null && m_filesets.size() == 0 ) | |||||
{ | { | ||||
throw new TaskException( "Dest must be a directory." ); | |||||
final String message = "src attribute and/or filesets must be specified"; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
if( source != null ) | |||||
if( m_dest == null ) | |||||
{ | { | ||||
if( source.isDirectory() ) | |||||
{ | |||||
throw new TaskException( "Src must not be a directory." + | |||||
" Use nested filesets instead." ); | |||||
} | |||||
else | |||||
{ | |||||
expandFile( source, dest ); | |||||
} | |||||
final String message = "Dest attribute must be specified"; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
if( filesets.size() > 0 ) | |||||
if( m_dest.exists() && !m_dest.isDirectory() ) | |||||
{ | { | ||||
for( int j = 0; j < filesets.size(); j++ ) | |||||
{ | |||||
FileSet fs = (FileSet)filesets.get( j ); | |||||
DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs ); | |||||
File fromDir = fs.getDir(); | |||||
final String message = "Dest must be a directory."; | |||||
throw new TaskException( message ); | |||||
} | |||||
String[] files = ds.getIncludedFiles(); | |||||
for( int i = 0; i < files.length; ++i ) | |||||
{ | |||||
File file = new File( fromDir, files[ i ] ); | |||||
expandFile( file, dest ); | |||||
} | |||||
} | |||||
if( m_src != null && m_src.isDirectory() ) | |||||
{ | |||||
final String message = "Src must not be a directory." + | |||||
" Use nested filesets instead."; | |||||
throw new TaskException( message ); | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* This method is to be overridden by extending unarchival tasks. | * This method is to be overridden by extending unarchival tasks. | ||||
*/ | */ | ||||
protected void expandFile( File srcF, File dir ) | |||||
protected void expandFile( final File src, final File dir ) | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
ZipInputStream zis = null; | ZipInputStream zis = null; | ||||
try | try | ||||
{ | { | ||||
// code from WarExpand | // code from WarExpand | ||||
zis = new ZipInputStream( new FileInputStream( srcF ) ); | |||||
zis = new ZipInputStream( new FileInputStream( src ) ); | |||||
ZipEntry ze = null; | ZipEntry ze = null; | ||||
while( ( ze = zis.getNextEntry() ) != null ) | while( ( ze = zis.getNextEntry() ) != null ) | ||||
{ | { | ||||
extractFile( srcF, dir, zis, | |||||
ze.getName(), | |||||
new Date( ze.getTime() ), | |||||
ze.isDirectory() ); | |||||
final Date date = new Date( ze.getTime() ); | |||||
extractFile( | |||||
dir, | |||||
zis, | |||||
ze.getName(), | |||||
date, | |||||
ze.isDirectory() ); | |||||
} | } | ||||
getLogger().debug( "expand complete" ); | |||||
} | } | ||||
catch( IOException ioe ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
throw new TaskException( "Error while expanding " + srcF.getPath(), ioe ); | |||||
final String message = "Error while expanding " + src.getPath(); | |||||
throw new TaskException( message, ioe ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( zis != null ) | |||||
{ | |||||
try | |||||
{ | |||||
zis.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( zis ); | |||||
} | } | ||||
final String message = "expand complete"; | |||||
getLogger().debug( message ); | |||||
} | } | ||||
protected void extractFile( File srcF, File dir, | |||||
InputStream compressedInputStream, | |||||
String entryName, | |||||
Date entryDate, boolean isDirectory ) | |||||
protected void extractFile( final File dir, | |||||
final InputStream input, | |||||
final String entryName, | |||||
final Date date, | |||||
final boolean isDirectory ) | |||||
throws IOException, TaskException | throws IOException, TaskException | ||||
{ | { | ||||
if( patternsets != null && patternsets.size() > 0 ) | |||||
final int size = m_patternsets.size(); | |||||
if( m_patternsets != null && size > 0 ) | |||||
{ | { | ||||
String name = entryName; | |||||
boolean included = false; | boolean included = false; | ||||
for( int v = 0; v < patternsets.size(); v++ ) | |||||
for( int i = 0; i < size; i++ ) | |||||
{ | { | ||||
PatternSet p = (PatternSet)patternsets.get( v ); | |||||
PatternSet p = (PatternSet)m_patternsets.get( i ); | |||||
final TaskContext context = getContext(); | final TaskContext context = getContext(); | ||||
String[] incls = PatternUtil.getIncludePatterns( p, context ); | String[] incls = PatternUtil.getIncludePatterns( p, context ); | ||||
if( incls != null ) | if( incls != null ) | ||||
{ | { | ||||
for( int w = 0; w < incls.length; w++ ) | |||||
for( int j = 0; j < incls.length; j++ ) | |||||
{ | { | ||||
boolean isIncl = ScannerUtil.match( incls[ w ], name ); | |||||
boolean isIncl = ScannerUtil.match( incls[ j ], entryName ); | |||||
if( isIncl ) | if( isIncl ) | ||||
{ | { | ||||
included = true; | included = true; | ||||
@@ -222,9 +230,9 @@ public class Expand extends MatchingTask | |||||
String[] excls = PatternUtil.getExcludePatterns( p, context1 ); | String[] excls = PatternUtil.getExcludePatterns( p, context1 ); | ||||
if( excls != null ) | if( excls != null ) | ||||
{ | { | ||||
for( int w = 0; w < excls.length; w++ ) | |||||
for( int j = 0; j < excls.length; j++ ) | |||||
{ | { | ||||
boolean isExcl = ScannerUtil.match( excls[ w ], name ); | |||||
boolean isExcl = ScannerUtil.match( excls[ j ], entryName ); | |||||
if( isExcl ) | if( isExcl ) | ||||
{ | { | ||||
included = false; | included = false; | ||||
@@ -233,6 +241,7 @@ public class Expand extends MatchingTask | |||||
} | } | ||||
} | } | ||||
} | } | ||||
if( !included ) | if( !included ) | ||||
{ | { | ||||
//Do not process this file | //Do not process this file | ||||
@@ -243,8 +252,8 @@ public class Expand extends MatchingTask | |||||
File f = FileUtil.resolveFile( dir, entryName ); | File f = FileUtil.resolveFile( dir, entryName ); | ||||
try | try | ||||
{ | { | ||||
if( !overwrite && f.exists() | |||||
&& f.lastModified() >= entryDate.getTime() ) | |||||
if( !m_overwrite && f.exists() | |||||
&& f.lastModified() >= date.getTime() ) | |||||
{ | { | ||||
getLogger().debug( "Skipping " + f + " as it is up-to-date" ); | getLogger().debug( "Skipping " + f + " as it is up-to-date" ); | ||||
return; | return; | ||||
@@ -261,43 +270,23 @@ public class Expand extends MatchingTask | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
byte[] buffer = new byte[ 1024 ]; | |||||
int length = 0; | |||||
FileOutputStream fos = null; | FileOutputStream fos = null; | ||||
try | try | ||||
{ | { | ||||
fos = new FileOutputStream( f ); | fos = new FileOutputStream( f ); | ||||
while( ( length = | |||||
compressedInputStream.read( buffer ) ) >= 0 ) | |||||
{ | |||||
fos.write( buffer, 0, length ); | |||||
} | |||||
fos.close(); | |||||
fos = null; | |||||
IOUtil.copy( input, fos ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( fos != null ) | |||||
{ | |||||
try | |||||
{ | |||||
fos.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( fos ); | |||||
} | } | ||||
} | } | ||||
f.setLastModified( entryDate.getTime() ); | |||||
f.setLastModified( date.getTime() ); | |||||
} | } | ||||
catch( FileNotFoundException ex ) | catch( FileNotFoundException ex ) | ||||
{ | { | ||||
getLogger().warn( "Unable to expand to file " + f.getPath() ); | getLogger().warn( "Unable to expand to file " + f.getPath() ); | ||||
} | } | ||||
} | } | ||||
} | } |
@@ -10,9 +10,10 @@ package org.apache.tools.ant.taskdefs.archive; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileInputStream; | import java.io.FileInputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.aut.tar.TarEntry; | import org.apache.aut.tar.TarEntry; | ||||
import org.apache.aut.tar.TarInputStream; | import org.apache.aut.tar.TarInputStream; | ||||
import org.apache.avalon.excalibur.io.IOUtil; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
/** | /** | ||||
* Untar a file. Heavily based on the Expand task. | * Untar a file. Heavily based on the Expand task. | ||||
@@ -20,45 +21,47 @@ import org.apache.aut.tar.TarInputStream; | |||||
* @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:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Untar extends Expand | |||||
public class Untar | |||||
extends Expand | |||||
{ | { | ||||
protected void expandFile( File srcF, File dir ) | |||||
protected void expandFile( final File src, final File dir ) | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
TarInputStream tis = null; | |||||
try | |||||
if( getLogger().isInfoEnabled() ) | |||||
{ | { | ||||
getLogger().info( "Expanding: " + srcF + " into " + dir ); | |||||
final String message = "Expanding: " + src + " into " + dir; | |||||
getLogger().info( message ); | |||||
} | |||||
tis = new TarInputStream( new FileInputStream( srcF ) ); | |||||
TarEntry te = null; | |||||
TarInputStream input = null; | |||||
FileInputStream fileInput = null; | |||||
try | |||||
{ | |||||
fileInput = new FileInputStream( src ); | |||||
input = new TarInputStream( fileInput ); | |||||
while( ( te = tis.getNextEntry() ) != null ) | |||||
TarEntry entry = null; | |||||
while( ( entry = input.getNextEntry() ) != null ) | |||||
{ | { | ||||
extractFile( srcF, dir, tis, | |||||
te.getName(), | |||||
te.getModTime(), te.isDirectory() ); | |||||
extractFile( dir, | |||||
input, | |||||
entry.getName(), | |||||
entry.getModTime(), | |||||
entry.isDirectory() ); | |||||
} | } | ||||
getLogger().debug( "expand complete" ); | |||||
} | } | ||||
catch( IOException ioe ) | |||||
catch( final IOException ioe ) | |||||
{ | { | ||||
throw new TaskException( "Error while expanding " + srcF.getPath(), ioe ); | |||||
final String message = "Error while expanding " + src.getPath(); | |||||
throw new TaskException( message, ioe ); | |||||
} | } | ||||
finally | finally | ||||
{ | { | ||||
if( tis != null ) | |||||
{ | |||||
try | |||||
{ | |||||
tis.close(); | |||||
} | |||||
catch( IOException e ) | |||||
{ | |||||
} | |||||
} | |||||
IOUtil.shutdownStream( fileInput ); | |||||
IOUtil.shutdownStream( input ); | |||||
} | } | ||||
final String message = "expand complete"; | |||||
getLogger().debug( message ); | |||||
} | } | ||||
} | } |