diff options
author | Sven Gothel <[email protected]> | 2012-01-05 08:55:06 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-01-05 08:55:06 +0100 |
commit | 9a211fe6cfb4150d97b50325c1778b7f5d3419af (patch) | |
tree | fc37b492bc29a77286ca7b185029d48e96720e56 /src | |
parent | 3eb4fd96cd65e49625663fdb6421a2f1cf2204dc (diff) |
Further fix for bug 537 - Catch IllegalArgumentException in Platform.loadGlueGenRTImpl(), Reuse JarUtil (same methodology) to determine whether we run from JarURL
Diffstat (limited to 'src')
-rw-r--r-- | src/java/com/jogamp/common/os/Platform.java | 30 | ||||
-rw-r--r-- | src/java/com/jogamp/common/util/JarUtil.java | 66 | ||||
-rw-r--r-- | src/java/com/jogamp/common/util/cache/TempJarCache.java | 1 |
3 files changed, 65 insertions, 32 deletions
diff --git a/src/java/com/jogamp/common/os/Platform.java b/src/java/com/jogamp/common/os/Platform.java index 55210ce..bd8523a 100644 --- a/src/java/com/jogamp/common/os/Platform.java +++ b/src/java/com/jogamp/common/os/Platform.java @@ -28,7 +28,6 @@ package com.jogamp.common.os; -import java.io.IOException; import java.net.URL; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -36,7 +35,6 @@ import java.nio.ShortBuffer; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.TimeUnit; -import java.util.jar.JarFile; import com.jogamp.common.nio.Buffers; import com.jogamp.common.util.JarUtil; @@ -204,7 +202,7 @@ public class Platform { os_and_arch = getOSAndArch(OS_TYPE, CPU_ARCH); - USE_TEMP_JAR_CACHE = (OS_TYPE != OSType.ANDROID) && !isRunningFromClassFile() && + USE_TEMP_JAR_CACHE = (OS_TYPE != OSType.ANDROID) && isRunningFromJarURL() && AccessController.doPrivileged(new PrivilegedAction<Boolean>() { public Boolean run() { return Boolean.valueOf(Debug.getBooleanProperty(true, useTempJarCachePropName, true, AccessController.getContext())); @@ -233,20 +231,17 @@ public class Platform { private Platform() {} - /* Used to disable JAR caching if we're not running from a JAR. - * - * If you build JOGL in an IDE like Eclipse, it's possible for other projects in your - * workspace to depend directly on the JOGL class files rather than on the built JAR files. - * This allows you to turn off JAR file creation in your JOGL Ant build to speed up the - * build, and allows Eclipse to resolve dependencies to auto-built class files before - * the Ant build even runs (which is not until after file save). + /** + * Preemptively avoids initializing and using {@link TempJarCache} in case we are <b>not</b> running + * from a Jar URL, ie. plain class files. Used to set {@link USE_TEMP_JAR_CACHE}. + * <p> + * Impact: Less overhead and more robustness. + * </p> * - * @return true if we're running from a class file, false if we're running some other - * way (like from a JAR file). + * @return true if we're running from a Jar URL, otherwise false */ - private static boolean isRunningFromClassFile() { - URL url = Platform.class.getResource( "Platform.class" ); - return( url.getProtocol().equalsIgnoreCase( "file" ) ); + private static boolean isRunningFromJarURL() { + return JarUtil.hasJarURL(Platform.class.getName(), Platform.class.getClassLoader()); } private static boolean queryIsLittleEndianImpl() { @@ -326,8 +321,9 @@ public class Platform { JarUtil.getJarSubURL(Platform.class.getName(), cl) ); final URL nativeJarURL = JarUtil.getJarFileURL(jarUrlRoot, nativeJarName); TempJarCache.bootstrapNativeLib(Platform.class, libBaseName, nativeJarURL, cl); - } catch (IOException ioe) { - ioe.printStackTrace(); + } catch (Exception e0) { + // IllegalArgumentException, IOException + System.err.println("Catched: "+e0.getMessage()); } } DynamicLibraryBundle.GlueJNILibLoader.loadLibrary(libBaseName, false); diff --git a/src/java/com/jogamp/common/util/JarUtil.java b/src/java/com/jogamp/common/util/JarUtil.java index 4beda94..bd63a56 100644 --- a/src/java/com/jogamp/common/util/JarUtil.java +++ b/src/java/com/jogamp/common/util/JarUtil.java @@ -52,30 +52,75 @@ public class JarUtil { private static final boolean DEBUG = Debug.debug("JarUtil"); /** + * Returns <code>true</code> if the Class's <code>"com.jogamp.common.GlueGenVersion"</code> + * is loaded from a JarFile and hence has a Jar URL like + * URL <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code>. + * <p> + * <i>sub_protocol</i> may be "file", "http", etc.. + * </p> + * + * @param clazzBinName "com.jogamp.common.GlueGenVersion" + * @param cl + * @return true if the class is loaded from a Jar file, otherwise false. + * @see {@link #getJarURL(String, ClassLoader)} + */ + public static boolean hasJarURL(String clazzBinName, ClassLoader cl) { + try { + final URL url = getJarURL(clazzBinName, cl); + return null != url; + } catch (Exception e) { /* ignore */ } + return false; + } + + /** * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> * URL <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code> - * Jar basename <code>gluegen-rt.jar</code> will be returned. + * will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> * * @param clazzBinName "com.jogamp.common.GlueGenVersion" * @param cl - * @return "gluegen-rt.jar" + * @return "jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class" * @throws IllegalArgumentException if the URL doesn't match the expected formatting * @throws IOException * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ - public static String getJarBasename(String clazzBinName, ClassLoader cl) throws IllegalArgumentException, IOException { + public static URL getJarURL(String clazzBinName, ClassLoader cl) throws IllegalArgumentException, IOException { URL url = IOUtil.getClassURL(clazzBinName, cl); if(null != url) { String urlS = url.toExternalForm(); if(DEBUG) { - System.out.println("getJarName "+url+", extForm: "+urlS); + System.out.println("getJarURL "+url+", extForm: "+urlS); } if(!urlS.startsWith("jar:")) { throw new IllegalArgumentException("JAR URL doesn't start with 'jar:', got <"+urlS+">"); - } + } + } + return url; + } + + + /** + * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> + * URL <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code> + * Jar basename <code>gluegen-rt.jar</code> will be returned. + * <p> + * <i>sub_protocol</i> may be "file", "http", etc.. + * </p> + * + * @param clazzBinName "com.jogamp.common.GlueGenVersion" + * @param cl + * @return "gluegen-rt.jar" + * @throws IllegalArgumentException if the URL doesn't match the expected formatting + * @throws IOException + * @see {@link IOUtil#getClassURL(String, ClassLoader)} + */ + public static String getJarBasename(String clazzBinName, ClassLoader cl) throws IllegalArgumentException, IOException { + URL url = getJarURL(clazzBinName, cl); + if(null != url) { + String urlS = url.toExternalForm(); urlS = urlS.substring(4, urlS.length()); // exclude 'jar:' // from @@ -130,15 +175,9 @@ public class JarUtil { * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ public static URL getJarSubURL(String clazzBinName, ClassLoader cl) throws IllegalArgumentException, IOException { - URL url = IOUtil.getClassURL(clazzBinName, cl); + URL url = getJarURL(clazzBinName, cl); if(null != url) { String urlS = url.toExternalForm(); - if(DEBUG) { - System.out.println("getJarSubURL "+url+", extForm: "+urlS); - } - if(!urlS.startsWith("jar:")) { - throw new IllegalArgumentException("JAR URL doesn't start with 'jar:', got <"+urlS+">"); - } urlS = urlS.substring(4, urlS.length()); // exclude 'jar:' // from @@ -266,7 +305,6 @@ public class JarUtil { } /** - * * @param clazzBinName com.jogamp.common.util.cache.TempJarCache * @param cl domain * @return JarFile containing the named class within the given ClassLoader @@ -274,7 +312,7 @@ public class JarUtil { * @see {@link #getJarFileURL(String, ClassLoader)} */ public static JarFile getJarFile(String clazzBinName, ClassLoader cl) throws IOException { - return getJarFile(getJarFileURL(clazzBinName, cl), cl); + return getJarFile(getJarFileURL(clazzBinName, cl), cl); } /** diff --git a/src/java/com/jogamp/common/util/cache/TempJarCache.java b/src/java/com/jogamp/common/util/cache/TempJarCache.java index 431971c..dd3e306 100644 --- a/src/java/com/jogamp/common/util/cache/TempJarCache.java +++ b/src/java/com/jogamp/common/util/cache/TempJarCache.java @@ -133,7 +133,6 @@ public class TempJarCache { } */ /** - * * @return true if this class has been properly initialized, ie. is in use, otherwise false. */ public static boolean isInitialized() { |