git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@329409 13f79535-47bb-0310-9956-ffa450edef68master
@@ -10,13 +10,13 @@ | |||
<h2><a name="unpack">GUnzip/BUnzip2</a></h2> | |||
<h3>Description</h3> | |||
<p>Expands a file packed using GZip or BZip2.</p> | |||
<p>Expands a resource packed using GZip or BZip2.</p> | |||
<p>If <i>dest</i> is a directory the name of the destination file is | |||
the same as <i>src</i> (with the ".gz" or ".bz2" | |||
extension removed if present). If <i>dest</i> is omitted, the parent | |||
dir of <i>src</i> is taken. The file is only expanded if the source | |||
file is newer than the destination file, or when the destination file | |||
resource is newer than the destination file, or when the destination file | |||
does not exist.</p> | |||
<h3>Parameters</h3> | |||
@@ -29,7 +29,7 @@ does not exist.</p> | |||
<tr> | |||
<td valign="top">src</td> | |||
<td valign="top">the file to expand.</td> | |||
<td align="center" valign="top">Yes</td> | |||
<td align="center" valign="top">Yes, or a nested resource collection.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">dest</td> | |||
@@ -37,6 +37,13 @@ does not exist.</p> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
<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> | |||
<blockquote><pre> | |||
<gunzip src="test.tar.gz"/> | |||
@@ -55,6 +62,13 @@ does not exist.</p> | |||
</pre></blockquote> | |||
<p>expands <i>test.tar.gz</i> to <i>subdir/test.tar</i> (assuming | |||
subdir is a directory).</p> | |||
<blockquote><pre> | |||
<gunzip dest="."> | |||
<url url="http://example.org/archive.tar.gz"/> | |||
</gunzip> | |||
</pre></blockquote> | |||
<p>downloads <i>http://example.org/archive.tar.gz</i> and expands it | |||
to <i>archive.tar</i> in the project's basedir on the fly.</p> | |||
<h3>Related tasks</h3> | |||
@@ -6,6 +6,12 @@ | |||
<bunzip2 src="expected/asf-logo-huge.tar.bz2" dest="asf-logo-huge.tar" /> | |||
</target> | |||
<target name="realTestWithResource"> | |||
<bunzip2 dest="asf-logo-huge.tar"> | |||
<file file="expected/asf-logo-huge.tar.bz2"/> | |||
</bunzip2> | |||
</target> | |||
<target name="cleanup"> | |||
<delete file="asf-logo-huge.tar" /> | |||
<delete file="expected/asf-logo-huge.tar" /> | |||
@@ -24,6 +24,12 @@ | |||
<gunzip src="expected/asf-logo.gif.gz" dest="asf-logo.gif" /> | |||
</target> | |||
<target name="realTestWithResource"> | |||
<gunzip dest="asf-logo.gif"> | |||
<file file="expected/asf-logo.gif.gz"/> | |||
</gunzip> | |||
</target> | |||
<target name="testDocumentationClaimsOnCopy"> | |||
<copy todir="."> | |||
<gzipresource> | |||
@@ -19,9 +19,9 @@ package org.apache.tools.ant.taskdefs; | |||
import java.io.BufferedInputStream; | |||
import java.io.FileInputStream; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.util.FileUtils; | |||
import org.apache.tools.bzip2.CBZip2InputStream; | |||
@@ -58,11 +58,11 @@ public class BUnzip2 extends Unpack { | |||
FileOutputStream out = null; | |||
CBZip2InputStream zIn = null; | |||
FileInputStream fis = null; | |||
InputStream fis = null; | |||
BufferedInputStream bis = null; | |||
try { | |||
out = new FileOutputStream(dest); | |||
fis = new FileInputStream(source); | |||
fis = srcResource.getInputStream(); | |||
bis = new BufferedInputStream(fis); | |||
int b = bis.read(); | |||
if (b != 'B') { | |||
@@ -90,4 +90,19 @@ public class BUnzip2 extends Unpack { | |||
} | |||
} | |||
} | |||
/** | |||
* Whether this task can deal with non-file resources. | |||
* | |||
* <p>This implementation returns true only if this task is | |||
* <gunzip>. 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(BUnzip2.class); | |||
} | |||
} |
@@ -17,9 +17,9 @@ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.FileInputStream; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.util.zip.GZIPInputStream; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.util.FileUtils; | |||
@@ -56,10 +56,10 @@ public class GUnzip extends Unpack { | |||
FileOutputStream out = null; | |||
GZIPInputStream zIn = null; | |||
FileInputStream fis = null; | |||
InputStream fis = null; | |||
try { | |||
out = new FileOutputStream(dest); | |||
fis = new FileInputStream(source); | |||
fis = srcResource.getInputStream(); | |||
zIn = new GZIPInputStream(fis); | |||
byte[] buffer = new byte[8 * 1024]; | |||
int count = 0; | |||
@@ -77,4 +77,19 @@ public class GUnzip extends Unpack { | |||
} | |||
} | |||
} | |||
/** | |||
* Whether this task can deal with non-file resources. | |||
* | |||
* <p>This implementation returns true only if this task is | |||
* <gunzip>. 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(GUnzip.class); | |||
} | |||
} |
@@ -21,6 +21,9 @@ package org.apache.tools.ant.taskdefs; | |||
import java.io.File; | |||
import org.apache.tools.ant.BuildException; | |||
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 unpack tasks. | |||
@@ -32,6 +35,7 @@ public abstract class Unpack extends Task { | |||
protected File source; | |||
protected File dest; | |||
protected Resource srcResource; | |||
/** | |||
* @deprecated setSrc(String) is deprecated and is replaced with | |||
@@ -66,7 +70,39 @@ public abstract class Unpack extends Task { | |||
* @param src file to expand | |||
*/ | |||
public void setSrc(File src) { | |||
source = src; | |||
setSrcResource(new FileResource(src)); | |||
} | |||
/** | |||
* The resource to expand; required. | |||
* @param src resource to expand | |||
*/ | |||
public void setSrcResource(Resource src) { | |||
if (!src.isExists()) { | |||
throw new BuildException("the archive doesn't exist"); | |||
} | |||
if (src.isDirectory()) { | |||
throw new BuildException("the archive can't be a directory"); | |||
} | |||
if (src instanceof FileResource) { | |||
source = ((FileResource) src).getFile(); | |||
} else if (!supportsNonFileResources()) { | |||
throw new BuildException("Only FileSystem resources are" | |||
+ " supported."); | |||
} | |||
srcResource = src; | |||
} | |||
/** | |||
* Set the source Archive resource. | |||
* @param a the archive 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()); | |||
} | |||
/** | |||
@@ -78,18 +114,10 @@ public abstract class Unpack extends Task { | |||
} | |||
private void validate() throws BuildException { | |||
if (source == null) { | |||
if (srcResource == null) { | |||
throw new BuildException("No Src specified", getLocation()); | |||
} | |||
if (!source.exists()) { | |||
throw new BuildException("Src doesn't exist", getLocation()); | |||
} | |||
if (source.isDirectory()) { | |||
throw new BuildException("Cannot expand a directory", getLocation()); | |||
} | |||
if (dest == null) { | |||
dest = new File(source.getParent()); | |||
} | |||
@@ -140,4 +168,16 @@ public abstract class Unpack extends Task { | |||
* This is to be overridden by subclasses. | |||
*/ | |||
protected abstract void extract(); | |||
/** | |||
* Whether this task can deal with non-file resources. | |||
* | |||
* <p>This implementation returns false.</p> | |||
* | |||
* @since Ant 1.7 | |||
*/ | |||
protected boolean supportsNonFileResources() { | |||
return false; | |||
} | |||
} |
@@ -42,17 +42,22 @@ public class BUnzip2Test extends BuildFileTest { | |||
executeTarget("cleanup"); | |||
} | |||
public void testRealTest() throws IOException { | |||
executeTarget("realTest"); | |||
public void testRealTest() throws java.io.IOException { | |||
testRealTest("realTest"); | |||
} | |||
public void testRealTestWithResource() throws java.io.IOException { | |||
testRealTest("realTestWithResource"); | |||
} | |||
private void testRealTest(String target) throws java.io.IOException { | |||
executeTarget(target); | |||
assertTrue("File content mismatch after bunzip2", | |||
FILE_UTILS.contentEquals(project.resolveFile("expected/asf-logo-huge.tar"), | |||
project.resolveFile("asf-logo-huge.tar"))); | |||
} | |||
public void testDocumentationClaimsOnCopy() throws java.io.IOException { | |||
executeTarget("testDocumentationClaimsOnCopy"); | |||
assertTrue("File content mismatch after bunzip2", | |||
FILE_UTILS.contentEquals(project.resolveFile("expected/asf-logo-huge.tar"), | |||
project.resolveFile("asf-logo-huge.tar"))); | |||
testRealTest("testDocumentationClaimsOnCopy"); | |||
} | |||
} |
@@ -47,20 +47,24 @@ public class GUnzipTest extends BuildFileTest { | |||
} | |||
public void testRealTest() throws java.io.IOException { | |||
executeTarget("realTest"); | |||
testRealTest("realTest"); | |||
} | |||
public void testRealTestWithResource() throws java.io.IOException { | |||
testRealTest("realTestWithResource"); | |||
} | |||
private void testRealTest(String target) throws java.io.IOException { | |||
executeTarget(target); | |||
assertTrue(FILE_UTILS.contentEquals(project.resolveFile("../asf-logo.gif"), | |||
project.resolveFile("asf-logo.gif"))); | |||
} | |||
public void testTestGzipTask() throws java.io.IOException { | |||
executeTarget("testGzipTask"); | |||
assertTrue(FILE_UTILS.contentEquals(project.resolveFile("../asf-logo.gif"), | |||
project.resolveFile("asf-logo.gif"))); | |||
testRealTest("testGzipTask"); | |||
} | |||
public void testDocumentationClaimsOnCopy() throws java.io.IOException { | |||
executeTarget("testDocumentationClaimsOnCopy"); | |||
assertTrue(FILE_UTILS.contentEquals(project.resolveFile("../asf-logo.gif"), | |||
project.resolveFile("asf-logo.gif"))); | |||
testRealTest("testDocumentationClaimsOnCopy"); | |||
} | |||
} |