git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@344334 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -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> | ||||
| <gzip src="test.tar" destfile="test.tar.gz"/> | <gzip src="test.tar" destfile="test.tar.gz"/> | ||||
| @@ -42,6 +47,13 @@ file is newer.</p> | |||||
| <blockquote><pre> | <blockquote><pre> | ||||
| <bzip2 src="test.tar" destfile="test.tar.bz2"/> | <bzip2 src="test.tar" destfile="test.tar.bz2"/> | ||||
| </pre></blockquote> | </pre></blockquote> | ||||
| <blockquote><pre> | |||||
| <gzip destfile="archive.tar.gz"> | |||||
| <url url="http://example.org/archive.tar"/> | |||||
| </gzip> | |||||
| </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 © 2000-2005 The Apache Software Foundation. All rights | <p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights | ||||
| Reserved.</p> | Reserved.</p> | ||||
| @@ -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" /> | ||||
| @@ -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" /> | ||||
| @@ -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 | |||||
| * <bzip2>. 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); | |||||
| } | |||||
| } | } | ||||
| @@ -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 | |||||
| * <gzip>. 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); | |||||
| } | |||||
| } | } | ||||
| @@ -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; | |||||
| } | |||||
| } | } | ||||
| @@ -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(); | ||||
| @@ -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(); | ||||