@@ -92,6 +92,9 @@ public class Jar extends Zip {
/** The index file name. */
private static final String INDEX_NAME = "META-INF/INDEX.LIST";
/** The mainfest file name. */
private static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";
/** merged manifests added through addConfiguredManifest */
private Manifest configuredManifest;
/** shadow of the above if upToDate check alters the value */
@@ -163,35 +166,6 @@ public class Jar extends Zip {
*/
public void setDestFile(File jarFile) {
super.setDestFile(jarFile);
if (jarFile.exists()) {
ZipFile zf = null;
try {
zf = new ZipFile(jarFile);
// must not use getEntry as "well behaving" applications
// must accept the manifest in any capitalization
Enumeration enum = zf.entries();
while (enum.hasMoreElements()) {
ZipEntry ze = (ZipEntry) enum.nextElement();
if (ze.getName().equalsIgnoreCase("META-INF/MANIFEST.MF")) {
originalManifest =
getManifest(new InputStreamReader(zf
.getInputStream(ze)));
}
}
} catch (Throwable t) {
log("error while reading original manifest: " + t.getMessage(),
Project.MSG_WARN);
} finally {
if (zf != null) {
try {
zf.close();
} catch (IOException e) {
// XXX - log an error? throw an exception?
}
}
}
}
}
/**
@@ -258,6 +232,33 @@ public class Jar extends Zip {
return newManifest;
}
private Manifest getManifestFromJar(File jarFile) throws IOException {
ZipFile zf = null;
try {
zf = new ZipFile(jarFile);
// must not use getEntry as "well behaving" applications
// must accept the manifest in any capitalization
Enumeration enum = zf.entries();
while (enum.hasMoreElements()) {
ZipEntry ze = (ZipEntry) enum.nextElement();
if (ze.getName().equalsIgnoreCase(MANIFEST_NAME)) {
return getManifest(new InputStreamReader(zf
.getInputStream(ze)));
}
}
return null;
} finally {
if (zf != null) {
try {
zf.close();
} catch (IOException e) {
// XXX - log an error? throw an exception?
}
}
}
}
private Manifest getManifest(Reader r) {
Manifest newManifest = null;
@@ -321,10 +322,6 @@ public class Jar extends Zip {
private Manifest createManifest()
throws BuildException {
try {
if (!isInUpdateMode()) {
originalManifest = null;
}
Manifest finalManifest = Manifest.getDefaultManifest();
if (manifest == null) {
@@ -343,7 +340,9 @@ public class Jar extends Zip {
* merge with null argument is a no-op
*/
finalManifest.merge(originalManifest);
if (isInUpdateMode()) {
finalManifest.merge(originalManifest);
}
finalManifest.merge(filesetManifest);
finalManifest.merge(configuredManifest);
finalManifest.merge(manifest, !mergeManifestsMain);
@@ -373,7 +372,7 @@ public class Jar extends Zip {
ByteArrayInputStream bais =
new ByteArrayInputStream(baos.toByteArray());
super.zipFile(bais, zOut, "META-INF/MANIFEST.MF" ,
super.zipFile(bais, zOut, MANIFEST_NAME ,
System.currentTimeMillis(), null,
ZipFileSet.DEFAULT_FILE_MODE);
super.initZipOutputStream(zOut);
@@ -448,7 +447,7 @@ public class Jar extends Zip {
protected void zipFile(InputStream is, ZipOutputStream zOut, String vPath,
long lastModified, File fromArchive, int mode)
throws IOException {
if ("META-INF/MANIFEST.MF" .equalsIgnoreCase(vPath)) {
if (MANIFEST_NAME .equalsIgnoreCase(vPath)) {
if (! doubleFilePass || (doubleFilePass && skipWriting)) {
filesetManifest(fromArchive, is);
}
@@ -536,45 +535,32 @@ public class Jar extends Zip {
throws BuildException {
// need to handle manifest as a special check
if (configuredManifest != null || manifestFile == null) {
java.util.zip.ZipFile theZipFile = null;
if (zipFile.exists()) {
// if it doesn't exist, it will get created anyway, don't
// bother with any up-to-date checks.
try {
theZipFile = new java.util.zip.ZipFile(zipFile);
java.util.zip.ZipEntry entry =
theZipFile.getEntry("META-INF/MANIFEST.MF");
if (entry == null) {
originalManifest = getManifestFromJar(zipFile);
if (originalManifest == null) {
log("Updating jar since the current jar has no manifest",
Project.MSG_VERBOSE);
needsUpdate = true;
} else {
Manifest currentManifest =
new Manifest(new InputStreamReader(theZipFile
.getInputStream(entry)));
Manifest newManifest = createManifest();
if (!currentManifest.equals(newManifest)) {
log("Updating jar since jar manifest has changed",
Manifest mf = createManifest();
if (!mf.equals(originalManifest)) {
log("Updating jar since jar manifest has changed",
Project.MSG_VERBOSE);
needsUpdate = true;
}
}
} catch (Exception e) {
// any problems and we will rebuild
log("Updating jar since cannot read current jar manifest: "
+ e.getClass().getName() + " - " + e.getMessage(),
Project.MSG_VERBOSE);
} catch (Throwable t) {
log("error while reading original manifest: " + t.getMessage(),
Project.MSG_WARN);
needsUpdate = true;
} finally {
if (theZipFile != null) {
try {
theZipFile.close();
} catch (IOException e) {
//ignore
}
}
}
} else if (manifestFile.lastModified() > zipFile.lastModified()) {
log("Updating jar since manifestFile is newer than the archive",
Project.MSG_VERBOSE);
} else {
// no existing archive
needsUpdate = true;
}