From 2a6a6bb1df175847a7bb84bd741ce3632d6590f6 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Thu, 31 Oct 2013 07:36:34 +0100 Subject: Bug 754 - JarUtil: Add method to generate resource URI from class's Jar URI and resource name (Remove Ubuntu fonts from jogl-all.jar, provide it separately to reduce footprint for the masses.) --- src/java/com/jogamp/common/util/JarUtil.java | 66 ++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'src/java/com/jogamp/common/util/JarUtil.java') diff --git a/src/java/com/jogamp/common/util/JarUtil.java b/src/java/com/jogamp/common/util/JarUtil.java index b5f8850..8897496 100644 --- a/src/java/com/jogamp/common/util/JarUtil.java +++ b/src/java/com/jogamp/common/util/JarUtil.java @@ -472,6 +472,72 @@ public class JarUtil { return null; } + /** + * Locates the {@link JarUtil#getJarFileURI(URI) Jar file URI} of a given resource + * relative to a given class's Jar's URI. + *
+     *   class's jar url path + cutOffInclSubDir + relResPath,
+     * 
+ * Example #1 + *
+     *   classFromJavaJar = com.lighting.Test (in: file:/storage/TestLighting.jar)
+     *   cutOffInclSubDir = lights/
+     *   relResPath       = LightAssets.jar
+     *   Result           : file:/storage/lights/LightAssets.jar
+     * 
+ * Example #2 + *
+     *   classFromJavaJar = com.lighting.Test (in: file:/storage/lights/TestLighting.jar)
+     *   cutOffInclSubDir = lights/
+     *   relResPath       = LightAssets.jar
+     *   Result           : file:/storage/lights/LightAssets.jar
+     * 
+ * + * TODO: Enhance documentation! + * + * @param classFromJavaJar Used to get the root URI for the class's Jar URI. + * @param cutOffInclSubDir The cut off included sub-directory prepending the relative resource path. + * If the root URI includes cutOffInclSubDir, it is no more added to the result. + * @param relResPath The relative resource path. + * @return The resulting resource URI, which is not tested. + * @throws IllegalArgumentException + * @throws IOException + * @throws URISyntaxException + */ + public static URI getRelativeOf(Class classFromJavaJar, String cutOffInclSubDir, String relResPath) throws IllegalArgumentException, IOException, URISyntaxException { + final ClassLoader cl = classFromJavaJar.getClassLoader(); + final URI classJarURI = JarUtil.getJarURI(classFromJavaJar.getName(), cl); + if( DEBUG ) { + System.err.println("JarUtil.getRelativeOf: "+"(classFromJavaJar "+classFromJavaJar+", classJarURI "+classJarURI+ + ", cutOffInclSubDir "+cutOffInclSubDir+", relResPath "+relResPath+"): "); + } + + final URI jarSubURI = JarUtil.getJarSubURI( classJarURI ); + if(null == jarSubURI) { + throw new IllegalArgumentException("JarSubURI is null of: "+classJarURI); + } + final String jarUriRoot_s = IOUtil.getURIDirname( jarSubURI.toString() ); + if( DEBUG ) { + System.err.println("JarUtil.getRelativeOf: "+"uri "+jarSubURI.toString()+" -> "+jarUriRoot_s); + } + + final String resUri_s; + if( jarUriRoot_s.endsWith(cutOffInclSubDir) ) { + resUri_s = jarUriRoot_s+relResPath; + } else { + resUri_s = jarUriRoot_s+cutOffInclSubDir+relResPath; + } + if( DEBUG ) { + System.err.println("JarUtil.getRelativeOf: "+"... -> "+resUri_s); + } + + final URI resURI = JarUtil.getJarFileURI(resUri_s); + if( DEBUG ) { + System.err.println("JarUtil.getRelativeOf: "+"fin "+resURI); + } + return resURI; + } + /** * Return a map from native-lib-base-name to entry-name. */ -- cgit v1.2.3