From 4c835f0337674a0181c43f448d44d961e27b2f54 Mon Sep 17 00:00:00 2001
From: Sven Gothel
Date: Thu, 28 Nov 2013 12:47:46 +0100
Subject: IOUtil.toURL(..) Apply decodeFromURI(uri.getPath()) if file-scheme;
Add IOUtil.decodeURIToFilePath(..) for native usage.
Refine comments, API doc.
toURL(..): Apply space conversion, decodeFromURI(..), on file-scheme path,
ensuring decoded space.
++
Add decodeURIToFilePath(String uriPath) and decodeURIToFilePath(URI uri)
Both methods shall simplify decoding a file-URI for native platform usage.
Tested in TestIOUtilURIHandling
+++
---
src/java/com/jogamp/common/util/IOUtil.java | 86 +++++++++++++++++++++++++----
1 file changed, 74 insertions(+), 12 deletions(-)
(limited to 'src/java/com/jogamp/common/util/IOUtil.java')
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java
index c719310..d6ef87a 100644
--- a/src/java/com/jogamp/common/util/IOUtil.java
+++ b/src/java/com/jogamp/common/util/IOUtil.java
@@ -493,17 +493,26 @@ public class IOUtil {
}
/**
- * Converts an {@link URI} to an {@link URL} while using a non encoded path
- * for file scheme, i.e. file:/
.
+ * Converts an {@link URI} to an {@link URL} while using a non encoded path.
+ *
+ * A file scheme path, i.e. path following file:
, is converted as follows:
+ *
+ File file = new File( {@link #decodeFromURI(String) decodeFromURI}( specificURI.getPath() ) );
+ String uriFilePath = {@link #encodeFilePathToURI(String) encodeFilePathToURI}( file.getPath() );
+ *
+ * above conversion results in a decoded file path appropriate to be used by subsequent file i/o operations (JarFile, zip, ..).
+ *
+ *
* Otherwise the default {@link URL} translation {@link URI#toURL()} is being used.
+ *
*
* The following cases are considered:
*
* - file schema is converted via
new File(uri).getPath()
.
* - jar scheme
*
- * - sub-protocol is being converted as above, if file scheme.
- * - JAR entry is not converted but preserved.
+ * - sub-protocol file scheme is being converted as above, other schema are preserved
+ * - JAR entry is preserved.
*
*
*
@@ -527,18 +536,19 @@ public class IOUtil {
"\t, uri "+uri+PlatformPropsImpl.NEWLINE+
"\t str -> "+specificURI.toString()+PlatformPropsImpl.NEWLINE+
"\t ascii -> "+specificURI.toASCIIString()+PlatformPropsImpl.NEWLINE+
+ "\t ssp -> "+specificURI.getSchemeSpecificPart()+PlatformPropsImpl.NEWLINE+
+ "\t frag -> "+specificURI.getFragment()+PlatformPropsImpl.NEWLINE+
"\t path -> "+specificURI.getPath()+PlatformPropsImpl.NEWLINE+
- "\t decoded.path -> "+decodeFromURI(specificURI.getPath())
- );
+ "\t path.decoded -> "+decodeFromURI( specificURI.getPath() ) );
}
int mode = 0;
if( IOUtil.FILE_SCHEME.equals( specificURI.getScheme() ) ) {
File f;
try {
- f = new File(specificURI);
+ f = new File( decodeFromURI( specificURI.getPath() ) ); // validates uri, uses decoded uri.getPath() and normalizes it
} catch(Exception iae) {
if( DEBUG ) {
- System.err.println("Catched "+iae.getClass().getSimpleName()+": new File("+decodeFromURI(specificURI.getPath())+") failed: "+iae.getMessage());
+ System.err.println("Catched "+iae.getClass().getSimpleName()+": new File("+decodeFromURI( specificURI.getPath() )+") failed: "+iae.getMessage());
iae.printStackTrace();
}
f = null;
@@ -861,17 +871,21 @@ public class IOUtil {
/**
* Reverses escaping of characters as performed via {@link #encodeToURI(String)}.
+ *
*/
public static String decodeFromURI(String s) {
return patternSpaceEnc.matcher(s).replaceAll(" ");
}
private static final Pattern patternSingleBS = Pattern.compile("\\\\{1,}");
+ private static final Pattern patternSingleFS = Pattern.compile("/{1,}");
/**
- * Escapes file path characters not complying w/ RFC 2396 and the {@link URI#URI(String)} ctor.
+ * Encodes file path characters not complying w/ RFC 2396 and the {@link URI#URI(String)} ctor.
*
- * Processes input filePath if {@link File#separatorChar} != '/'
+ * Implementation processes the filePath
if {@link File#separatorChar} != '/'
* as follows:
*
* - backslash -> slash
@@ -879,12 +893,17 @@ public class IOUtil {
*
*
*
+ * Note that this method does not perform space encoding,
+ * which can be utilized via {@link #encodeToURI(String)}.
+ *
+ *
* Even though Oracle's JarURLStreamHandler can handle backslashes and
* erroneous URIs w/ e.g. Windows file 'syntax', other may not (Netbeans).
* See Bug 857 - http://jogamp.org/bugzilla/show_bug.cgi?id=857
*
+ * @see #encodeToURI(String)
*/
- public static String encodeFilePathToURI(String filePath) {
+ public static String encodeFilePathToURI(final String filePath) {
if( !File.separator.equals("/") ) {
final String r = patternSingleBS.matcher(filePath).replaceAll("/");
if( !r.startsWith("/") ) {
@@ -896,6 +915,49 @@ public class IOUtil {
return filePath;
}
+ /**
+ * Decodes uri-file path characters complying w/ RFC 2396 to native file-path.
+ *
+ * Implementation decodes the space-encoding path={@link #decodeFromURI(String) decodeFromURI}(uriPath)
.
+ *
+ *
+ * Then it processes the path
if {@link File#separatorChar} != '/'
+ * as follows:
+ *
+ * - drop a starting slash
+ * - slash -> backslash
+ *
+ *
+ * @see #decodeFromURI(String)
+ */
+ public static String decodeURIToFilePath(final String uriPath) {
+ final String path = IOUtil.decodeFromURI(uriPath);
+ if( !File.separator.equals("/") ) {
+ final String r = patternSingleFS.matcher(path).replaceAll("\\\\");
+ if( r.startsWith("\\") ) {
+ return r.substring(1);
+ } else {
+ return r;
+ }
+ }
+ return path;
+ }
+
+ /**
+ * If uri
is a file scheme,
+ * implementation returns the decoded {@link URI#getPath()} via {@link #decodeURIToFilePath(String)},
+ * otherwise it returns the {@link URI#toASCIIString()} encoded URI.
+ *
+ * @see #decodeFromURI(String)
+ * @see #decodeURIToFilePath(String)
+ */
+ public static String decodeURIIfFilePath(final URI uri) {
+ if( IOUtil.FILE_SCHEME.equals( uri.getScheme() ) ) {
+ return decodeURIToFilePath( uri.getPath() );
+ }
+ return uri.toASCIIString();
+ }
+
/**
* Returns the connected URLConnection, or null if not url is not available
*/
@@ -1206,7 +1268,7 @@ public class IOUtil {
// 1) java.io.tmpdir/jogamp
if( null == tempRootExec && isStringSet(java_io_tmpdir) ) {
- if( Platform.OSType.MACOS == Platform.getOSType() ) {
+ if( Platform.OSType.MACOS == PlatformPropsImpl.OS_TYPE ) {
// Bug 865: Safari >= 6.1 [OSX] May employ xattr on 'com.apple.quarantine' on 'PluginProcess.app'
// We attempt to fix this issue _after_ gluegen native lib is loaded, see JarUtil.fixNativeLibAttribs(File).
tempRootExec = getSubTempDir(new File(java_io_tmpdir), tmpSubDir, false /* executable */, "tempX1");
--
cgit v1.2.3