Moved robust jar unpacking code out of Narya and into Samskivert.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@1807 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -3,9 +3,19 @@
|
|||||||
|
|
||||||
package com.samskivert.util;
|
package com.samskivert.util;
|
||||||
|
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.jar.JarEntry;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
|
import org.apache.commons.io.CopyUtils;
|
||||||
|
|
||||||
import com.samskivert.Log;
|
import com.samskivert.Log;
|
||||||
|
import com.samskivert.io.StreamUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility methods for files.
|
* Utility methods for files.
|
||||||
@@ -44,6 +54,65 @@ public class FileUtil
|
|||||||
return path + newext;
|
return path + newext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpacks the specified jar file intto the specified target directory.
|
||||||
|
*
|
||||||
|
* @return true if the jar file was successfully unpacked, false if an
|
||||||
|
* error occurred that prevented the unpacking. The error will be logged.
|
||||||
|
*/
|
||||||
|
public static boolean unpackJar (JarFile jar, File target)
|
||||||
|
{
|
||||||
|
boolean failure = false;
|
||||||
|
Enumeration entries = jar.entries();
|
||||||
|
while (!failure && entries.hasMoreElements()) {
|
||||||
|
JarEntry entry = (JarEntry)entries.nextElement();
|
||||||
|
File efile = new File(target, entry.getName());
|
||||||
|
|
||||||
|
// if we're unpacking a normal jar file, it will have special path
|
||||||
|
// entries that allow us to create our directories first
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
if (!efile.exists() && !efile.mkdir()) {
|
||||||
|
Log.warning("Failed to create jar entry path [jar=" + jar +
|
||||||
|
", entry=" + entry + "].");
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// but some do not, so we want to ensure that our directories exist
|
||||||
|
// prior to getting down and funky
|
||||||
|
File parent = new File(efile.getParent());
|
||||||
|
if (!parent.exists() && !parent.mkdirs()) {
|
||||||
|
Log.warning("Failed to create jar entry parent [jar=" + jar +
|
||||||
|
", parent=" + parent + "].");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedOutputStream fout = null;
|
||||||
|
InputStream jin = null;
|
||||||
|
try {
|
||||||
|
fout = new BufferedOutputStream(new FileOutputStream(efile));
|
||||||
|
jin = jar.getInputStream(entry);
|
||||||
|
CopyUtils.copy(jin, fout);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.warning("Failure unpacking [jar=" + jar +
|
||||||
|
", entry=" + efile + ", error=" + e + "].");
|
||||||
|
failure = true;
|
||||||
|
} finally {
|
||||||
|
StreamUtil.close(jin);
|
||||||
|
StreamUtil.close(fout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
jar.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.warning("Failed to close jar file [jar=" + jar +
|
||||||
|
", error=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
return !failure;
|
||||||
|
}
|
||||||
|
|
||||||
/** Helper function. */
|
/** Helper function. */
|
||||||
protected static void recursiveWipe (File file, boolean wipeMe)
|
protected static void recursiveWipe (File file, boolean wipeMe)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user