Submitted by: Stefan Bodewig (bodewig@bost.de) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267665 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1128,6 +1128,11 @@ attribute are just names, they do not contain any path information!</p> | |||||
<td valign="top">the directory from which to jar the files.</td> | <td valign="top">the directory from which to jar the files.</td> | ||||
<td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">compress</td> | |||||
<td valign="top">Not only store data but also compress them, defaults to true</td> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | |||||
<tr> | <tr> | ||||
<td valign="top">items</td> | <td valign="top">items</td> | ||||
<td valign="top">a comma separated list of the files/directories to jar. All | <td valign="top">a comma separated list of the files/directories to jar. All | ||||
@@ -2039,6 +2044,11 @@ attribute are just names, they do not contain any path information!</p> | |||||
<td valign="top">the directory from which to zip the files.</td> | <td valign="top">the directory from which to zip the files.</td> | ||||
<td align="center" valign="top">Yes</td> | <td align="center" valign="top">Yes</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">compress</td> | |||||
<td valign="top">Not only store data but also compress them, defaults to true</td> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | |||||
<tr> | <tr> | ||||
<td valign="top">items</td> | <td valign="top">items</td> | ||||
<td valign="top">a comma separated list of the files/directories to zip. All | <td valign="top">a comma separated list of the files/directories to zip. All | ||||
@@ -81,16 +81,19 @@ public class Jar extends Zip { | |||||
protected void initZipOutputStream(ZipOutputStream zOut) | protected void initZipOutputStream(ZipOutputStream zOut) | ||||
throws IOException, BuildException | throws IOException, BuildException | ||||
{ | { | ||||
zOut.setMethod(ZipOutputStream.DEFLATED); | |||||
// add manifest first | // add manifest first | ||||
if (manifest != null) { | if (manifest != null) { | ||||
ZipEntry ze = new ZipEntry("META-INF/"); | |||||
zOut.putNextEntry(ze); | |||||
super.zipDir(new File(manifest.getParent()), zOut, "META-INF/"); | |||||
super.zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); | super.zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); | ||||
} else { | } else { | ||||
ZipEntry ze = new ZipEntry("META-INF/"); | |||||
zOut.putNextEntry(ze); | |||||
/* | |||||
* We don't store directories at all and this one will cause a lot | |||||
* of problems with STORED Zip-Mode. | |||||
* | |||||
* That's why i've removed it -- Stefan Bodewig | |||||
*/ | |||||
// ZipEntry ze = new ZipEntry("META-INF/"); | |||||
// zOut.putNextEntry(ze); | |||||
String s = "/org/apache/tools/ant/defaultManifest.mf"; | String s = "/org/apache/tools/ant/defaultManifest.mf"; | ||||
InputStream in = this.getClass().getResourceAsStream(s); | InputStream in = this.getClass().getResourceAsStream(s); | ||||
if ( in == null ) | if ( in == null ) | ||||
@@ -105,8 +108,7 @@ public class Jar extends Zip { | |||||
// First add directory to zip entry | // First add directory to zip entry | ||||
if(!vPath.equals("META-INF/")) { | if(!vPath.equals("META-INF/")) { | ||||
// we already added a META-INF | // we already added a META-INF | ||||
ZipEntry ze = new ZipEntry(vPath); | |||||
zOut.putNextEntry(ze); | |||||
super.zipDir(dir, zOut, vPath); | |||||
} | } | ||||
} | } | ||||
@@ -73,6 +73,7 @@ public class Zip extends MatchingTask { | |||||
private File zipFile; | private File zipFile; | ||||
private File baseDir; | private File baseDir; | ||||
private boolean doCompress = true; | |||||
protected String archiveType = "zip"; | protected String archiveType = "zip"; | ||||
/** | /** | ||||
@@ -91,6 +92,13 @@ public class Zip extends MatchingTask { | |||||
baseDir = project.resolveFile(baseDirname); | baseDir = project.resolveFile(baseDirname); | ||||
} | } | ||||
/** | |||||
* Sets whether we want to compress the files or only store them. | |||||
*/ | |||||
public void setCompress(String compress) { | |||||
doCompress = Project.toBoolean(compress); | |||||
} | |||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
if (baseDir == null) { | if (baseDir == null) { | ||||
throw new BuildException("basedir attribute must be set!"); | throw new BuildException("basedir attribute must be set!"); | ||||
@@ -116,6 +124,11 @@ public class Zip extends MatchingTask { | |||||
try { | try { | ||||
ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile)); | ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile)); | ||||
if (doCompress) { | |||||
zOut.setMethod(ZipOutputStream.DEFLATED); | |||||
} else { | |||||
zOut.setMethod(ZipOutputStream.STORED); | |||||
} | |||||
initZipOutputStream(zOut); | initZipOutputStream(zOut); | ||||
for (int i = 0; i < dirs.length; i++) { | for (int i = 0; i < dirs.length; i++) { | ||||
@@ -141,7 +154,6 @@ public class Zip extends MatchingTask { | |||||
protected void initZipOutputStream(ZipOutputStream zOut) | protected void initZipOutputStream(ZipOutputStream zOut) | ||||
throws IOException, BuildException | throws IOException, BuildException | ||||
{ | { | ||||
zOut.setMethod(ZipOutputStream.DEFLATED); | |||||
} | } | ||||
protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | ||||
@@ -153,6 +165,49 @@ public class Zip extends MatchingTask { | |||||
throws IOException | throws IOException | ||||
{ | { | ||||
ZipEntry ze = new ZipEntry(vPath); | ZipEntry ze = new ZipEntry(vPath); | ||||
/* | |||||
* XXX ZipOutputStream.putEntry expects the ZipEntry to know its | |||||
* size and the CRC sum before you start writing the data when using | |||||
* STORED mode. | |||||
* | |||||
* This forces us to process the data twice. | |||||
* | |||||
* I couldn't find any documentation on this, just found out by try | |||||
* and error. | |||||
*/ | |||||
if (!doCompress) { | |||||
long size = 0; | |||||
CRC32 cal = new CRC32(); | |||||
if (!in.markSupported()) { | |||||
// Store data into a byte[] | |||||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||||
byte[] buffer = new byte[8 * 1024]; | |||||
int count = 0; | |||||
do { | |||||
size += count; | |||||
cal.update(buffer, 0, count); | |||||
bos.write(buffer, 0, count); | |||||
count = in.read(buffer, 0, buffer.length); | |||||
} while (count != -1); | |||||
in = new ByteArrayInputStream(bos.toByteArray()); | |||||
} else { | |||||
in.mark(Integer.MAX_VALUE); | |||||
byte[] buffer = new byte[8 * 1024]; | |||||
int count = 0; | |||||
do { | |||||
size += count; | |||||
cal.update(buffer, 0, count); | |||||
count = in.read(buffer, 0, buffer.length); | |||||
} while (count != -1); | |||||
in.reset(); | |||||
} | |||||
ze.setSize(size); | |||||
ze.setCrc(cal.getValue()); | |||||
} | |||||
zOut.putNextEntry(ze); | zOut.putNextEntry(ze); | ||||
byte[] buffer = new byte[8 * 1024]; | byte[] buffer = new byte[8 * 1024]; | ||||