From 3ea58b7374f5451e693f09f9295e210006d1e7ff Mon Sep 17 00:00:00 2001 From: Hiram Chirino Date: Mon, 6 May 2013 09:49:55 -0400 Subject: [PATCH 6/6] Simplify shared lib extraction. --- .../org/fusesource/hawtjni/runtime/Library.java | 79 ++++++++-------------- 1 file changed, 29 insertions(+), 50 deletions(-) diff --git a/hawtjni-runtime/src/main/java/org/fusesource/hawtjni/runtime/Library.java b/hawtjni-runtime/src/main/java/org/fusesource/hawtjni/runtime/Library.java index c23081d..422bd2f 100755 --- a/hawtjni-runtime/src/main/java/org/fusesource/hawtjni/runtime/Library.java +++ b/hawtjni-runtime/src/main/java/org/fusesource/hawtjni/runtime/Library.java @@ -9,13 +9,11 @@ *******************************************************************************/ package org.fusesource.hawtjni.runtime; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Random; import java.util.regex.Pattern; /** @@ -206,16 +204,19 @@ public class Library { private boolean exractAndLoad(ArrayList errors, String version, String customPath, String resourcePath) { URL resource = classLoader.getResource(resourcePath); if( resource !=null ) { - + String libName = name + "-" + getBitModel(); if( version !=null) { libName += "-" + version; } - + String []libNameParts = map(libName).split("\\."); + String prefix = libNameParts[0]+"-"; + String suffix = "."+libNameParts[1]; + if( customPath!=null ) { // Try to extract it to the custom path... - File target = file(customPath, map(libName)); - if( extract(errors, resource, target) ) { + File target = extract(errors, resource, prefix, suffix, file(customPath)); + if( target!=null ) { if( load(errors, target) ) { return true; } @@ -224,8 +225,8 @@ public class Library { // Fall back to extracting to the tmp dir customPath = System.getProperty("java.io.tmpdir"); - File target = file(customPath, map(libName)); - if( extract(errors, resource, target) ) { + File target = extract(errors, resource, prefix, suffix, file(customPath)); + if( target!=null ) { if( load(errors, target) ) { return true; } @@ -259,67 +260,45 @@ public class Library { return libName; } - private boolean extract(ArrayList errors, URL source, File target) { - FileOutputStream os = null; - InputStream is = null; - boolean extracting = false; + private File extract(ArrayList errors, URL source, String prefix, String suffix, File directory) { + File target = null; try { - if (!target.exists() || isStale(source, target) ) { + FileOutputStream os = null; + InputStream is = null; + try { + target = File.createTempFile(prefix, suffix, directory); is = source.openStream(); if (is != null) { byte[] buffer = new byte[4096]; os = new FileOutputStream(target); - extracting = true; int read; while ((read = is.read(buffer)) != -1) { os.write(buffer, 0, read); } - os.close(); - is.close(); chmod("755", target); } + target.deleteOnExit(); + return target; + } finally { + close(os); + close(is); } } catch (Throwable e) { - try { - if (os != null) - os.close(); - } catch (IOException e1) { - } - try { - if (is != null) - is.close(); - } catch (IOException e1) { - } - if (extracting && target.exists()) + if( target!=null ) { target.delete(); + } errors.add(e.getMessage()); - return false; } - return true; + return null; } - private boolean isStale(URL source, File target) { - - if( source.getProtocol().equals("jar") ) { - // unwrap the jar protocol... + static private void close(Closeable file) { + if(file!=null) { try { - String parts[] = source.getFile().split(Pattern.quote("!")); - source = new URL(parts[0]); - } catch (MalformedURLException e) { - return false; - } - } - - File sourceFile=null; - if( source.getProtocol().equals("file") ) { - sourceFile = new File(source.getFile()); - } - if( sourceFile!=null && sourceFile.exists() ) { - if( sourceFile.lastModified() > target.lastModified() ) { - return true; + file.close(); + } catch (Exception ignore) { } } - return false; } private void chmod(String permision, File path) { -- 1.8.1.4