You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2017/07/14 17:03:53 UTC
jena git commit: Converting IRIs to filenames needs to handle /C:/
cases on MS-Windows.
Repository: jena
Updated Branches:
refs/heads/master b6d83d7e6 -> c5fbfdc1b
Converting IRIs to filenames needs to handle /C:/ cases on MS-Windows.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/c5fbfdc1
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/c5fbfdc1
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/c5fbfdc1
Branch: refs/heads/master
Commit: c5fbfdc1bff0b91a8dbf1696df5ab41abcb0c6cb
Parents: b6d83d7
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jul 14 18:03:34 2017 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jul 14 18:03:34 2017 +0100
----------------------------------------------------------------------
.../java/org/apache/jena/atlas/lib/IRILib.java | 31 +++++++++++++++-----
1 file changed, 24 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/c5fbfdc1/jena-base/src/main/java/org/apache/jena/atlas/lib/IRILib.java
----------------------------------------------------------------------
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/IRILib.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/IRILib.java
index 6c7e8fc..18f3b94 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/IRILib.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/IRILib.java
@@ -27,6 +27,8 @@ import org.apache.jena.base.Sys ;
/** Operations related to IRIs */
public class IRILib
{
+ // Tests - see also TestFilenameProcessing
+
// http://www.w3.org/TR/xpath-functions/#func-encode-for-uri
// Encodes delimiters.
@@ -119,6 +121,12 @@ public class IRILib
fn = iri.substring("file://".length()) ;
else
fn = iri.substring("file:".length()) ;
+ // MS Windows: we can have
+ // file:///C:/path or file:/C:/path
+ // At this point, we have a filename of /C:/
+ // so need strip the leading "/"
+ fn = fixupWindows(fn);
+
return decode(fn) ;
}
@@ -128,13 +136,10 @@ public class IRILib
// Make Absolute filename.
boolean trailingSlash = fn.endsWith("/") ;
- if ( Sys.isWindows ) {
- // Can be "/C:/" on windows :-(
- // This happens because of URL.toString.
- if ( fn.length() >= 3 && fn.charAt(0) == '/' && windowsDrive(fn, 1))
- fn = fn.substring(1) ;
- }
-
+
+ // To get Path.toAbsolutePath to work, we need to convert /C:/ to C:/
+ // then back again.
+ fn = fixupWindows(fn) ;
fn = Paths.get(fn).toAbsolutePath().normalize().toString() ;
if ( trailingSlash && ! fn.endsWith("/") )
@@ -156,6 +161,18 @@ public class IRILib
return "file://"+fn ;
}
+ // Case of Windows /C:/ which can come from URL.toString
+ // giving file:/C:/ and decoding file:///C:/
+ private static String fixupWindows(String fn) {
+ if ( Sys.isWindows &&
+ fn.length() >= 3 && fn.charAt(0) == '/' && windowsDrive(fn, 1))
+ fn = fn.substring(1) ;
+ return fn;
+ }
+
+ /** Does filename {@code fn} look like a windows-drive rooted file path?
+ * The test is can we find "C:" at location {@code i}.
+ */
private static boolean windowsDrive(String fn, int i) {
return
fn.length() >= 2+i &&