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]; | ||||