Browse Source

add resource support to gzip/bzip2

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@344334 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 19 years ago
parent
commit
5e407c51a7
8 changed files with 146 additions and 38 deletions
  1. +15
    -3
      docs/manual/CoreTasks/pack.html
  2. +6
    -0
      src/etc/testcases/taskdefs/bzip2.xml
  3. +6
    -0
      src/etc/testcases/taskdefs/gzip.xml
  4. +18
    -9
      src/main/org/apache/tools/ant/taskdefs/BZip2.java
  5. +18
    -9
      src/main/org/apache/tools/ant/taskdefs/GZip.java
  6. +74
    -16
      src/main/org/apache/tools/ant/taskdefs/Pack.java
  7. +4
    -0
      src/testcases/org/apache/tools/ant/taskdefs/BZip2Test.java
  8. +5
    -1
      src/testcases/org/apache/tools/ant/taskdefs/GzipTest.java

+ 15
- 3
docs/manual/CoreTasks/pack.html View File

@@ -10,9 +10,9 @@


<h2><a name="pack">GZip/BZip2</a></h2> <h2><a name="pack">GZip/BZip2</a></h2>
<h3>Description</h3> <h3>Description</h3>
<p>Packs a file using the GZip or BZip2 algorithm.
<p>Packs a resource using the GZip or BZip2 algorithm.
The output file is only generated if it doesn't exist or the source The output file is only generated if it doesn't exist or the source
file is newer.</p>
resource is newer.</p>
<h3>Parameters</h3> <h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0"> <table border="1" cellpadding="2" cellspacing="0">
<tr> <tr>
@@ -23,7 +23,7 @@ file is newer.</p>
<tr> <tr>
<td valign="top">src</td> <td valign="top">src</td>
<td valign="top">the file to gzip/bzip.</td> <td valign="top">the file to gzip/bzip.</td>
<td align="center" valign="top">Yes</td>
<td align="center" valign="top">Yes, or a nested resource collection.</td>
</tr> </tr>
<tr> <tr>
<td valign="top">destfile</td> <td valign="top">destfile</td>
@@ -35,6 +35,11 @@ file is newer.</p>
<td valign="top">the <i>deprecated</i> old name of destfile.</td> <td valign="top">the <i>deprecated</i> old name of destfile.</td>
</tr> </tr>
</table> </table>
<h4>any <a href="../CoreTypes/resources.html">resource</a> or single element
resource collection</h4>

<p>The specified resource will be used as src.</p>

<h3>Examples</h3> <h3>Examples</h3>
<blockquote><pre> <blockquote><pre>
&lt;gzip src=&quot;test.tar&quot; destfile=&quot;test.tar.gz&quot;/&gt; &lt;gzip src=&quot;test.tar&quot; destfile=&quot;test.tar.gz&quot;/&gt;
@@ -42,6 +47,13 @@ file is newer.</p>
<blockquote><pre> <blockquote><pre>
&lt;bzip2 src=&quot;test.tar&quot; destfile=&quot;test.tar.bz2&quot;/&gt; &lt;bzip2 src=&quot;test.tar&quot; destfile=&quot;test.tar.bz2&quot;/&gt;
</pre></blockquote> </pre></blockquote>
<blockquote><pre>
&lt;gzip destfile=&quot;archive.tar.gz&quot;&gt;
&lt;url url="http://example.org/archive.tar"/&gt;
&lt;/gzip&gt;
</pre></blockquote>
<p>downloads <i>http://example.org/archive.tar</i> and compresses it
to <i>archive.tar.gz</i> in the project's basedir on the fly.</p>
<hr> <hr>
<p align="center">Copyright &copy; 2000-2005 The Apache Software Foundation. All rights <p align="center">Copyright &copy; 2000-2005 The Apache Software Foundation. All rights
Reserved.</p> Reserved.</p>


+ 6
- 0
src/etc/testcases/taskdefs/bzip2.xml View File

@@ -6,6 +6,12 @@
<bzip2 src="expected/asf-logo-huge.tar" zipfile="asf-logo-huge.tar.bz2" /> <bzip2 src="expected/asf-logo-huge.tar" zipfile="asf-logo-huge.tar.bz2" />
</target> </target>


<target name="realTestWithResource">
<bzip2 zipfile="asf-logo-huge.tar.bz2">
<file file="expected/asf-logo-huge.tar"/>
</bzip2>
</target>

<target name="testDateCheck"> <target name="testDateCheck">
<touch file="asf-logo.gif.bz2"/> <touch file="asf-logo.gif.bz2"/>
<bzip2 src="../asf-logo.gif" zipfile="asf-logo.gif.bz2" /> <bzip2 src="../asf-logo.gif" zipfile="asf-logo.gif.bz2" />


+ 6
- 0
src/etc/testcases/taskdefs/gzip.xml View File

@@ -22,6 +22,12 @@
<gzip src="../asf-logo.gif" zipfile="asf-logo.gif.gz" /> <gzip src="../asf-logo.gif" zipfile="asf-logo.gif.gz" />
</target> </target>


<target name="realTestWithResource">
<gzip zipfile="asf-logo.gif.gz">
<file file="../asf-logo.gif"/>
</gzip>
</target>

<target name="testDateCheck"> <target name="testDateCheck">
<touch file="asf-logo.gif.gz"/> <touch file="asf-logo.gif.gz"/>
<gzip src="../asf-logo.gif" zipfile="asf-logo.gif.gz" /> <gzip src="../asf-logo.gif" zipfile="asf-logo.gif.gz" />


+ 18
- 9
src/main/org/apache/tools/ant/taskdefs/BZip2.java View File

@@ -22,6 +22,7 @@ import java.io.BufferedOutputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.bzip2.CBZip2OutputStream; import org.apache.tools.bzip2.CBZip2OutputStream;


/** /**
@@ -42,19 +43,27 @@ public class BZip2 extends Pack {
bos.write('B'); bos.write('B');
bos.write('Z'); bos.write('Z');
zOut = new CBZip2OutputStream(bos); zOut = new CBZip2OutputStream(bos);
zipFile(source, zOut);
zipResource(getSrcResource(), zOut);
} catch (IOException ioe) { } catch (IOException ioe) {
String msg = "Problem creating bzip2 " + ioe.getMessage(); String msg = "Problem creating bzip2 " + ioe.getMessage();
throw new BuildException(msg, ioe, getLocation()); throw new BuildException(msg, ioe, getLocation());
} finally { } finally {
if (zOut != null) {
try {
// close up
zOut.close();
} catch (IOException e) {
//ignore
}
}
FileUtils.close(zOut);
} }
} }

/**
* Whether this task can deal with non-file resources.
*
* <p>This implementation returns true only if this task is
* &lt;bzip2&gt;. Any subclass of this class that also wants to
* support non-file resources needs to override this method. We
* need to do so for backwards compatibility reasons since we
* can't expect subclasses to support resources.</p>
*
* @since Ant 1.7
*/
protected boolean supportsNonFileResources() {
return getClass().equals(BZip2.class);
}
} }

+ 18
- 9
src/main/org/apache/tools/ant/taskdefs/GZip.java View File

@@ -21,6 +21,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;


/** /**
* Compresses a file with the GZIP algorithm. Normally used to compress * Compresses a file with the GZIP algorithm. Normally used to compress
@@ -39,19 +40,27 @@ public class GZip extends Pack {
GZIPOutputStream zOut = null; GZIPOutputStream zOut = null;
try { try {
zOut = new GZIPOutputStream(new FileOutputStream(zipFile)); zOut = new GZIPOutputStream(new FileOutputStream(zipFile));
zipFile(source, zOut);
zipResource(getSrcResource(), zOut);
} catch (IOException ioe) { } catch (IOException ioe) {
String msg = "Problem creating gzip " + ioe.getMessage(); String msg = "Problem creating gzip " + ioe.getMessage();
throw new BuildException(msg, ioe, getLocation()); throw new BuildException(msg, ioe, getLocation());
} finally { } finally {
if (zOut != null) {
try {
// close up
zOut.close();
} catch (IOException e) {
// do nothing
}
}
FileUtils.close(zOut);
} }
} }

/**
* Whether this task can deal with non-file resources.
*
* <p>This implementation returns true only if this task is
* &lt;gzip&gt;. Any subclass of this class that also wants to
* support non-file resources needs to override this method. We
* need to do so for backwards compatibility reasons since we
* can't expect subclasses to support resources.</p>
*
* @since Ant 1.7
*/
protected boolean supportsNonFileResources() {
return getClass().equals(GZip.class);
}
} }

+ 74
- 16
src/main/org/apache/tools/ant/taskdefs/Pack.java View File

@@ -17,14 +17,15 @@


package org.apache.tools.ant.taskdefs; package org.apache.tools.ant.taskdefs;



import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.FileResource;


/** /**
* Abstract Base class for pack tasks. * Abstract Base class for pack tasks.
@@ -36,6 +37,7 @@ public abstract class Pack extends Task {


protected File zipFile; protected File zipFile;
protected File source; protected File source;
private Resource src;


/** /**
* the required destination file. * the required destination file.
@@ -58,9 +60,37 @@ public abstract class Pack extends Task {
* @param src the source file * @param src the source file
*/ */
public void setSrc(File src) { public void setSrc(File src) {
source = src;
setSrcResource(new FileResource(src));
} }


/**
* The resource to pack; required.
* @param src resource to expand
*/
public void setSrcResource(Resource src) {
if (src.isDirectory()) {
throw new BuildException("the source can't be a directory");
}
if (src instanceof FileResource) {
source = ((FileResource) src).getFile();
} else if (!supportsNonFileResources()) {
throw new BuildException("Only FileSystem resources are"
+ " supported.");
}
this.src = src;
}

/**
* Set the source resource.
* @param a the resource to pack as a single element Resource collection.
*/
public void addConfigured(ResourceCollection a) {
if (a.size() != 1) {
throw new BuildException("only single argument resource collections"
+ " are supported as archives");
}
setSrcResource((Resource) a.iterator().next());
}


/** /**
* validation routine * validation routine
@@ -76,13 +106,9 @@ public abstract class Pack extends Task {
+ "represent a directory!", getLocation()); + "represent a directory!", getLocation());
} }


if (source == null) {
throw new BuildException("src attribute is required", getLocation());
}

if (source.isDirectory()) {
throw new BuildException("Src attribute must not "
+ "represent a directory!", getLocation());
if (getSrcResource() == null) {
throw new BuildException("src attribute or nested resource is"
+ " required", getLocation());
} }
} }


@@ -93,10 +119,11 @@ public abstract class Pack extends Task {
public void execute() throws BuildException { public void execute() throws BuildException {
validate(); validate();


if (!source.exists()) {
log("Nothing to do: " + source.getAbsolutePath()
Resource s = getSrcResource();
if (!s.isExists()) {
log("Nothing to do: " + s.toString()
+ " doesn't exist."); + " doesn't exist.");
} else if (zipFile.lastModified() < source.lastModified()) {
} else if (zipFile.lastModified() < s.getLastModified()) {
log("Building: " + zipFile.getAbsolutePath()); log("Building: " + zipFile.getAbsolutePath());
pack(); pack();
} else { } else {
@@ -129,11 +156,22 @@ public abstract class Pack extends Task {
*/ */
protected void zipFile(File file, OutputStream zOut) protected void zipFile(File file, OutputStream zOut)
throws IOException { throws IOException {
FileInputStream fIn = new FileInputStream(file);
zipResource(new FileResource(file), zOut);
}

/**
* zip a resource to an output stream
* @param resource the resource to zip
* @param zOut the output stream
* @throws IOException on error
*/
protected void zipResource(Resource resource, OutputStream zOut)
throws IOException {
InputStream rIn = resource.getInputStream();
try { try {
zipFile(fIn, zOut);
zipFile(rIn, zOut);
} finally { } finally {
fIn.close();
rIn.close();
} }
} }


@@ -141,4 +179,24 @@ public abstract class Pack extends Task {
* subclasses must implement this method to do their compression * subclasses must implement this method to do their compression
*/ */
protected abstract void pack(); protected abstract void pack();

/**
* The source resource.
*
* @since Ant 1.7
*/
public Resource getSrcResource() {
return src;
}

/**
* Whether this task can deal with non-file resources.
*
* <p>This implementation returns false.</p>
*
* @since Ant 1.7
*/
protected boolean supportsNonFileResources() {
return false;
}
} }

+ 4
- 0
src/testcases/org/apache/tools/ant/taskdefs/BZip2Test.java View File

@@ -95,6 +95,10 @@ public class BZip2Test extends BuildFileTest {
actualIn.close(); actualIn.close();
} }


public void testResource(){
executeTarget("realTestWithResource");
}

public void testDateCheck(){ public void testDateCheck(){
executeTarget("testDateCheck"); executeTarget("testDateCheck");
String log = getLog(); String log = getLog();


+ 5
- 1
src/testcases/org/apache/tools/ant/taskdefs/GzipTest.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2002,2004 The Apache Software Foundation
* Copyright 2000-2002,2004-2005 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -57,6 +57,10 @@ public class GzipTest extends BuildFileTest {
+ log + "'", log.endsWith("asf-logo.gif.gz")); + log + "'", log.endsWith("asf-logo.gif.gz"));
} }


public void testResource(){
executeTarget("realTestWithResource");
}

public void testDateCheck(){ public void testDateCheck(){
executeTarget("testDateCheck"); executeTarget("testDateCheck");
String log = getLog(); String log = getLog();


Loading…
Cancel
Save