summaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/common/util/IOUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/jogamp/common/util/IOUtil.java')
-rw-r--r--src/java/com/jogamp/common/util/IOUtil.java109
1 files changed, 99 insertions, 10 deletions
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java
index 2f0c77f..2c3c756 100644
--- a/src/java/com/jogamp/common/util/IOUtil.java
+++ b/src/java/com/jogamp/common/util/IOUtil.java
@@ -56,14 +56,22 @@ import com.jogamp.common.os.Platform;
public class IOUtil {
public static final boolean DEBUG = Debug.debug("IOUtil");
- public static final String JAR_SCHEME = "jar";
+ /** {@value} */
+ public static final String SCHEME_SEPARATOR = ":";
+ /** {@value} */
public static final String FILE_SCHEME = "file";
+ /** {@value} */
public static final String HTTP_SCHEME = "http";
+ /** {@value} */
public static final String HTTPS_SCHEME = "https";
+ /** {@value} */
+ public static final String JAR_SCHEME = "jar";
+ /** A JAR subprotocol is separeted from the JAR entry w/ this separator {@value}. Even if no class is specified '!/' must follow!. */
+ public static final String JAR_SCHEME_SEPARATOR = "!";
- /** Std. temporary directory property key <code>java.io.tmpdir</code> */
- public static final String java_io_tmpdir_propkey = "java.io.tmpdir";
- public static final String user_home_propkey = "user.home";
+ /** Std. temporary directory property key <code>java.io.tmpdir</code>. */
+ private static final String java_io_tmpdir_propkey = "java.io.tmpdir";
+ private static final String user_home_propkey = "user.home";
private static final String XDG_CACHE_HOME_envkey = "XDG_CACHE_HOME";
/** Subdirectory within platform's temporary root directory where all JogAmp related temp files are being stored: {@code jogamp} */
@@ -300,7 +308,7 @@ public class IOUtil {
public static URI toURISimple(String protocol, String file, boolean isDirectory) throws URISyntaxException {
return new URI(protocol, null, slashify(file, true, isDirectory), null);
}
-
+
/**
* Returns the lowercase suffix of the given file name (the text
* after the last '.' in the file name). Returns null if the file
@@ -333,7 +341,14 @@ public class IOUtil {
}
return toLowerCase(filename.substring(lastDot + 1));
}
+ private static String toLowerCase(String arg) {
+ if (arg == null) {
+ return null;
+ }
+ return arg.toLowerCase();
+ }
+
/***
* @param file
* @param allowOverwrite
@@ -402,14 +417,88 @@ public class IOUtil {
return fname;
}
- private static String toLowerCase(String arg) {
- if (arg == null) {
- return null;
+ /**
+ * The URI's <code><i>protocol</i>:/some/path/gluegen-rt.jar</code>
+ * parent dirname URI <code><i>protocol</i>:/some/path/</code> will be returned.
+ * <p>
+ * <i>protocol</i> may be "file", "http", etc..
+ * </p>
+ *
+ * @param uri "<i>protocol</i>:/some/path/gluegen-rt.jar"
+ * @return "<i>protocol</i>:/some/path/"
+ * @throws IllegalArgumentException if the URI doesn't match the expected formatting, or is null
+ * @throws URISyntaxException
+ */
+ public static URI getDirname(URI uri) throws IllegalArgumentException, URISyntaxException {
+ if(null == uri) {
+ throw new IllegalArgumentException("URI is null");
}
-
- return arg.toLowerCase();
+ String uriS = uri.toString();
+ if( DEBUG ) {
+ System.out.println("getURIDirname "+uri+", extForm: "+uriS);
+ }
+ // from
+ // file:/some/path/gluegen-rt.jar _or_ rsrc:gluegen-rt.jar
+ // to
+ // file:/some/path/ _or_ rsrc:
+ int idx = uriS.lastIndexOf('/');
+ if(0 > idx) {
+ // no abs-path, check for protocol terminator ':'
+ idx = uriS.lastIndexOf(':');
+ if(0 > idx) {
+ throw new IllegalArgumentException("URI does not contain protocol terminator ':', in <"+uri+">");
+ }
+ }
+ uriS = uriS.substring(0, idx+1); // exclude jar name, include terminal '/' or ':'
+
+ if( DEBUG ) {
+ System.out.println("getJarURIDirname res: "+uriS);
+ }
+ return new URI(uriS);
}
+ /**
+ * Converts an {@link URI} to an {@link URL} while using a non encoded path
+ * for <i>file scheme</i>, i.e. <code>file:/</code>.
+ * Otherwise the default {@link URL} translation {@link URI#toURL()} is being used.
+ * <p>
+ * The folloing cases are considered:
+ * <ul>
+ * <li><i>file schema</i> is converted via <code>new File(uri).getPath()</code>.</li>
+ * <li><i>jar scheme</i>
+ * <ul>
+ * <li>subprotocol is being converted as above, if <i>file scheme</i>.</li>
+ * <li>JAR entry is not converted but preserved.</li>
+ * </ul></li>
+ * </ul>
+ * </p>
+ * @param uri
+ * @return
+ * @throws IOException
+ * @throws IllegalArgumentException
+ * @throws URISyntaxException
+ */
+ public static URL toURL(URI uri) throws IOException, IllegalArgumentException, URISyntaxException {
+ final URL url;
+ final String uriSchema = uri.getScheme();
+ final boolean isJAR = IOUtil.JAR_SCHEME.equals(uriSchema);
+ final URI specificURI = isJAR ? JarUtil.getJarSubURI(uri) : uri;
+ if( IOUtil.FILE_SCHEME.equals( specificURI.getScheme() ) ) {
+ final File f = new File(specificURI);
+ if( specificURI == uri ) {
+ url = new URL(IOUtil.FILE_SCHEME+IOUtil.SCHEME_SEPARATOR+f.getPath());
+ // url = f.toURI().toURL(); // Doesn't work, since it uses encoded path!
+ } else {
+ final String post = isJAR ? IOUtil.JAR_SCHEME_SEPARATOR + JarUtil.getJarEntry(uri) : "";
+ final String urlS = uriSchema+IOUtil.SCHEME_SEPARATOR+IOUtil.FILE_SCHEME+IOUtil.SCHEME_SEPARATOR+f.getPath()+post;
+ url = new URL(urlS);
+ }
+ } else {
+ url = uri.toURL();
+ }
+ return url;
+ }
+
/***
*
* RESOURCE LOCATION STUFF