if (!isDeleted) {
logger.log(Level.WARNING, "Error in deleting file " + tempEar.getAbsolutePath());
}
}
WritableArchive target = archiveFactory.createArchive("jar", tempEar);
Collection<String> directoryEntries = source.getDirectories();
List<String> subModuleEntries = new ArrayList<String>();
List<String> entriesToExclude = new ArrayList<String>();
// first put all the sub module jars to the target archive
for (String directoryEntry : directoryEntries) {
if (directoryEntry.endsWith("_jar") ||
directoryEntry.endsWith("_war") ||
directoryEntry.endsWith("_rar")) {
subModuleEntries.add(directoryEntry);
File moduleJar = processModule(new File(
appDir, directoryEntry), targetParentDir, null);
OutputStream os = null;
InputStream is = new BufferedInputStream(
new FileInputStream(moduleJar));
try {
os = target.putNextEntry(moduleJar.getName());
FileUtils.copy(is, os, moduleJar.length());
} finally {
if (os!=null) {
target.closeEntry();
}
is.close();
}
}
}
// now find all the entries we should exclude to copy to the target
// basically all sub module entries should be excluded
for (String subModuleEntry : subModuleEntries) {
Enumeration<String> ee = source.entries(subModuleEntry);
while (ee.hasMoreElements()) {
String eeEntryName = ee.nextElement();
entriesToExclude.add(eeEntryName);
}
}
// now copy the rest of the entries
Enumeration<String> e = source.entries();
while (e.hasMoreElements()) {
String entryName = e.nextElement();
if (! entriesToExclude.contains(entryName)) {
InputStream sis = source.getEntry(entryName);
if (isSigFile(entryName)) {
logger.log(Level.INFO, "Excluding signature file: "
+ entryName + " from repackaged application: " +
appName + "\n");
continue;
}
if (sis != null) {
InputStream is = new BufferedInputStream(sis);
OutputStream os = null;
try {
os = target.putNextEntry(entryName);
FileUtils.copy(is, os, source.getEntrySize(entryName));
} finally {
if (os!=null) {
target.closeEntry();
}
is.close();
}
}
}
}
// last is manifest if existing.
Manifest m = source.getManifest();
if (m!=null) {
processManifest(m, appName);
OutputStream os = target.putNextEntry(JarFile.MANIFEST_NAME);
m.write(os);
target.closeEntry();
}
source.close();
target.close();
return tempEar;
}