diff options
author | Sven Gothel <[email protected]> | 2011-09-14 09:37:28 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-09-14 09:37:28 +0200 |
commit | 0466210ac77e5c19248be1cc5c5b7c2a481ca031 (patch) | |
tree | 16e242310919345ce5461719dc14614556bccffc | |
parent | edc6cc1622bdf7afe09fc7377ea8d8cc0c17f804 (diff) |
IOUtil getResource() - Lookup class package space 1st; Catch all Throwables ; Add DEBUG
Lookup class package space 1st, which favors JAR resources,
hence allows applets to load secure stuff.
Catch all Throwables incl. java.security.AccessControlException
based on java.io.FilePermission. (eg Applets)
Add DEBUG property jogamp.debug.IOUtil, enabling verbose resource location.
-rw-r--r-- | src/java/com/jogamp/common/util/IOUtil.java | 86 |
1 files changed, 67 insertions, 19 deletions
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java index 5b00fb4..79ee62a 100644 --- a/src/java/com/jogamp/common/util/IOUtil.java +++ b/src/java/com/jogamp/common/util/IOUtil.java @@ -35,17 +35,21 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.security.AccessController; import java.net.JarURLConnection; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.ByteBuffer; +import jogamp.common.Debug; + import com.jogamp.common.nio.Buffers; import com.jogamp.common.os.MachineDescription; import com.jogamp.common.os.Platform; public class IOUtil { + private static final boolean DEBUG = Debug.isPropertyDefined("jogamp.debug.IOUtil", true, AccessController.getContext()); + private IOUtil() {} /*** @@ -219,25 +223,39 @@ public class IOUtil { /** * Locating a resource using 'getResource(String path, ClassLoader cl)', - * with the given context's ClassLoader and the resourcePath as is, - * as well with the context's package name-path plus the resourcePath. + * with the + * <ul> + * <li>context's package name-path plus the resourcePath (incl. JAR/Applets)</li> + * <li>context's ClassLoader and the resourcePath as is (filesystem)</li> + * </ul> * * @see #getResource(String, ClassLoader) */ - public static URL getResource(Class context, String resourcePath) { + public static URL getResource(Class<?> context, String resourcePath) { if(null == resourcePath) { return null; } ClassLoader contextCL = (null!=context)?context.getClassLoader():null; - URL url = getResource(resourcePath, contextCL); - if (url == null && null!=context) { - // Try again by scoping the path within the class's package + URL url = null; + if(null != context) { + // scoping the path within the class's package String className = context.getName().replace('.', '/'); int lastSlash = className.lastIndexOf('/'); if (lastSlash >= 0) { String tmpPath = className.substring(0, lastSlash + 1) + resourcePath; url = getResource(tmpPath, contextCL); } + if(DEBUG) { + System.err.println("IOUtil: found <"+resourcePath+"> within class package: "+(null!=url)); + } + } else if(DEBUG) { + System.err.println("IOUtil: null context"); + } + if(null == url) { + url = getResource(resourcePath, contextCL); + if(DEBUG) { + System.err.println("IOUtil: found <"+resourcePath+"> by classloader: "+(null!=url)); + } } return url; } @@ -251,39 +269,55 @@ public class IOUtil { * @see URL#URL(String) * @see File#File(String) */ + @SuppressWarnings("deprecation") public static URL getResource(String resourcePath, ClassLoader cl) { if(null == resourcePath) { return null; } + if(DEBUG) { + System.err.println("IOUtil: locating <"+resourcePath+">, has cl: "+(null!=cl)); + } URL url = null; if (cl != null) { url = cl.getResource(resourcePath); - if(!urlExists(url)) { + if(!urlExists(url, "cl.getResource()")) { url = null; - } - } + } + } if(null == url) { url = ClassLoader.getSystemResource(resourcePath); - if(!urlExists(url)) { + if(!urlExists(url, "cl.getSystemResource()")) { url = null; - } + } } if(null == url) { try { url = new URL(resourcePath); - if(!urlExists(url)) { + if(!urlExists(url, "new URL()")) { url = null; } - } catch (MalformedURLException e) { } + } catch (Throwable e) { + if(DEBUG) { + System.err.println("IOUtil: Catched Exception:"); + e.printStackTrace(); + } + } } if(null == url) { try { File file = new File(resourcePath); if(file.exists()) { url = file.toURL(); - } else { } - } catch (MalformedURLException e) {} + } catch (Throwable e) { + if(DEBUG) { + System.err.println("IOUtil: Catched Exception:"); + e.printStackTrace(); + } + } + if(DEBUG) { + System.err.println("IOUtil: file.exists("+resourcePath+") - "+(null!=url)); + } } return url; } @@ -339,13 +373,27 @@ public class IOUtil { * Returns true, if the URL exists and a connection could be opened. */ public static boolean urlExists(URL url) { + return urlExists(url, "."); + } + + public static boolean urlExists(URL url, String dbgmsg) { boolean v = false; if(null!=url) { try { - URLConnection uc = url.openConnection(); + url.openConnection(); v = true; - } catch (IOException ioe) { } - } + if(DEBUG) { + System.err.println("IOUtil: urlExists("+url+") ["+dbgmsg+"] - true"); + } + } catch (IOException ioe) { + if(DEBUG) { + System.err.println("IOUtil: urlExists("+url+") ["+dbgmsg+"] - false: "+ioe.getMessage()); + } + } + } else if(DEBUG) { + System.err.println("IOUtil: no url - urlExists(null) ["+dbgmsg+"]"); + } + return v; } } |