@@ -17,8 +17,7 @@
*/
*/
package org.apache.tools.ant.taskdefs;
package org.apache.tools.ant.taskdefs;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.File;
import java.io.IOException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStream;
@@ -1077,7 +1076,7 @@ public class Zip extends MatchingTask {
if (keepCompression) {
if (keepCompression) {
doCompress = (ze.getMethod() == ZipEntry.DEFLATED);
doCompress = (ze.getMethod() == ZipEntry.DEFLATED);
}
}
try (InputStream is = zf.getInputStream(ze)) {
try (final Buffered InputStream is = new BufferedInputStream( zf.getInputStream(ze) )) {
zipFile(is, zOut, prefix + name, ze.getTime(),
zipFile(is, zOut, prefix + name, ze.getTime(),
fromArchive, mode, ze.getExtraFields(true));
fromArchive, mode, ze.getExtraFields(true));
} finally {
} finally {
@@ -1085,7 +1084,7 @@ public class Zip extends MatchingTask {
}
}
}
}
} else {
} else {
try (InputStream is = r.getInputStream()) {
try (final Buffered InputStream is = new BufferedInputStream( r.getInputStream() )) {
zipFile(is, zOut, prefix + name, r.getLastModified(),
zipFile(is, zOut, prefix + name, r.getLastModified(),
fromArchive, mode, r instanceof ZipResource
fromArchive, mode, r instanceof ZipResource
? ((ZipResource) r).getExtraFields() : null);
? ((ZipResource) r).getExtraFields() : null);
@@ -1776,7 +1775,7 @@ public class Zip extends MatchingTask {
* @since Ant 1.5.2
* @since Ant 1.5.2
* @throws IOException on error
* @throws IOException on error
*/
*/
protected void zipFile(InputStream in, final ZipOutputStream zOut, final String vPath,
protected void zipFile(final InputStream in, final ZipOutputStream zOut, final String vPath,
final long lastModified, final File fromArchive, final int mode)
final long lastModified, final File fromArchive, final int mode)
throws IOException {
throws IOException {
// fromArchive is used in subclasses overriding this method
// fromArchive is used in subclasses overriding this method
@@ -1806,7 +1805,12 @@ public class Zip extends MatchingTask {
final ZipEntry ze = new ZipEntry(vPath);
final ZipEntry ze = new ZipEntry(vPath);
ze.setTime(fixedModTime != null ? modTimeMillis : lastModified);
ze.setTime(fixedModTime != null ? modTimeMillis : lastModified);
ze.setMethod(doCompress ? ZipEntry.DEFLATED : ZipEntry.STORED);
ze.setMethod(doCompress ? ZipEntry.DEFLATED : ZipEntry.STORED);
// if the input stream doesn't support mark/reset ability, we wrap it in a
// stream that adds that support.
// Note: We do *not* close this newly created wrapping input stream, since
// we don't "own" the underlying input stream that's passed to us and closing
// that is the responsibility of the caller.
final InputStream markableInputStream = in.markSupported() ? in : new BufferedInputStream(in);
/*
/*
* ZipOutputStream.putNextEntry expects the ZipEntry to
* ZipOutputStream.putNextEntry expects the ZipEntry to
* know its size and the CRC sum before you start writing
* know its size and the CRC sum before you start writing
@@ -1817,31 +1821,15 @@ public class Zip extends MatchingTask {
if (!zOut.isSeekable() && !doCompress) {
if (!zOut.isSeekable() && !doCompress) {
long size = 0;
long size = 0;
final CRC32 cal = new CRC32();
final CRC32 cal = new CRC32();
if (!in.markSupported()) {
// Store data into a byte[]
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final byte[] buffer = new byte[BUFFER_SIZE];
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);
final byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
do {
size += count;
cal.update(buffer, 0, count);
count = in.read(buffer, 0, buffer.length);
} while (count != -1);
in.reset();
}
markableInputStream.mark(Integer.MAX_VALUE);
final byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
do {
size += count;
cal.update(buffer, 0, count);
count = markableInputStream.read(buffer, 0, buffer.length);
} while (count != -1);
markableInputStream.reset();
ze.setSize(size);
ze.setSize(size);
ze.setCrc(cal.getValue());
ze.setCrc(cal.getValue());
}
}
@@ -1860,7 +1848,7 @@ public class Zip extends MatchingTask {
if (count != 0) {
if (count != 0) {
zOut.write(buffer, 0, count);
zOut.write(buffer, 0, count);
}
}
count = in .read(buffer, 0, buffer.length);
count = markableInputStream .read(buffer, 0, buffer.length);
} while (count != -1);
} while (count != -1);
}
}
addedFiles.add(vPath);
addedFiles.add(vPath);
@@ -1916,9 +1904,9 @@ public class Zip extends MatchingTask {
getLocation());
getLocation());
}
}
try (InputStream fIn = Files.newInputStream(file.toPath( ))) {
try (final BufferedInputStream bIn = new BufferedInputStream(Files.newInputStream(file.toPath() ))) {
// ZIPs store time with a granularity of 2 seconds, round up
// ZIPs store time with a granularity of 2 seconds, round up
zipFile(f In, zOut, vPath,
zipFile(b In, zOut, vPath,
file.lastModified() + (roundUp ? ROUNDUP_MILLIS : 0),
file.lastModified() + (roundUp ? ROUNDUP_MILLIS : 0),
null, mode);
null, mode);
}
}