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>
<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
file is newer.</p>
resource is newer.</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
@@ -23,7 +23,7 @@ file is newer.</p>
<tr>
<td valign="top">src</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>
<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>
</tr>
</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>
<blockquote><pre>
&lt;gzip src=&quot;test.tar&quot; destfile=&quot;test.tar.gz&quot;/&gt;
@@ -42,6 +47,13 @@ file is newer.</p>
<blockquote><pre>
&lt;bzip2 src=&quot;test.tar&quot; destfile=&quot;test.tar.bz2&quot;/&gt;
</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>
<p align="center">Copyright &copy; 2000-2005 The Apache Software Foundation. All rights
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" />
</target>

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

<target name="testDateCheck">
<touch file="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" />
</target>

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

<target name="testDateCheck">
<touch file="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.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.bzip2.CBZip2OutputStream;

/**
@@ -42,19 +43,27 @@ public class BZip2 extends Pack {
bos.write('B');
bos.write('Z');
zOut = new CBZip2OutputStream(bos);
zipFile(source, zOut);
zipResource(getSrcResource(), zOut);
} catch (IOException ioe) {
String msg = "Problem creating bzip2 " + ioe.getMessage();
throw new BuildException(msg, ioe, getLocation());
} 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.util.zip.GZIPOutputStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;

/**
* Compresses a file with the GZIP algorithm. Normally used to compress
@@ -39,19 +40,27 @@ public class GZip extends Pack {
GZIPOutputStream zOut = null;
try {
zOut = new GZIPOutputStream(new FileOutputStream(zipFile));
zipFile(source, zOut);
zipResource(getSrcResource(), zOut);
} catch (IOException ioe) {
String msg = "Problem creating gzip " + ioe.getMessage();
throw new BuildException(msg, ioe, getLocation());
} 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;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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 pack tasks.
@@ -36,6 +37,7 @@ public abstract class Pack extends Task {

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

/**
* the required destination file.
@@ -58,9 +60,37 @@ public abstract class Pack extends Task {
* @param src the source file
*/
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
@@ -76,13 +106,9 @@ public abstract class Pack extends Task {
+ "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 {
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.");
} else if (zipFile.lastModified() < source.lastModified()) {
} else if (zipFile.lastModified() < s.getLastModified()) {
log("Building: " + zipFile.getAbsolutePath());
pack();
} else {
@@ -129,11 +156,22 @@ public abstract class Pack extends Task {
*/
protected void zipFile(File file, OutputStream zOut)
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 {
zipFile(fIn, zOut);
zipFile(rIn, zOut);
} finally {
fIn.close();
rIn.close();
}
}

@@ -141,4 +179,24 @@ public abstract class Pack extends Task {
* subclasses must implement this method to do their compression
*/
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();
}

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

public void testDateCheck(){
executeTarget("testDateCheck");
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");
* 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"));
}

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

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


Loading…
Cancel
Save