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 2015/10/22 18:18:11 UTC

[3/3] jena git commit: JENA-1051: Deal with URL.toString format on Windows.

JENA-1051: Deal with URL.toString format on Windows.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/245214d8
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/245214d8
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/245214d8

Branch: refs/heads/master
Commit: 245214d805486c4cff5a598af2b1e95c75cd5bf0
Parents: 134ba47
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Oct 22 17:15:24 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Oct 22 17:15:24 2015 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/atlas/lib/IRILib.java  | 21 +++++++++++++++++++-
 .../jena/atlas/lib/TestFilenameProcessing.java  |  6 ++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/245214d8/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 dcdd9a4..6c7e8fc 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
@@ -126,7 +126,15 @@ public class IRILib
     private static String plainFilenameToURL(String fn) {
         // No "file:"
         // 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) ;
+        }
+        
         fn = Paths.get(fn).toAbsolutePath().normalize().toString() ;
         
         if ( trailingSlash && ! fn.endsWith("/") )
@@ -135,7 +143,7 @@ public class IRILib
         if ( Sys.isWindows )
         {
             // C:\ => file:///C:/... 
-            if ( fn.length() >= 2 && fn.charAt(1) == ':' )
+            if ( windowsDrive(fn, 0) )
                 // Windows drive letter - already absolute path.
                 // Make "URI" absolute path
                 fn = "/"+fn ;
@@ -148,6 +156,17 @@ public class IRILib
         return "file://"+fn ;
     }
     
+    private static boolean windowsDrive(String fn, int i) {
+        return 
+            fn.length() >= 2+i && 
+            fn.charAt(1+i) == ':' && 
+            isA2Z(fn.charAt(i)) ;    
+    }
+    
+    private static boolean isA2Z(char ch) {
+        return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ;  
+    }
+    
     /** Sanitize a "file:" URL. Must start "file:" */
     private static String normalizeFilenameURI(String fn) {
         if ( ! fn.startsWith("file:/") ) {

http://git-wip-us.apache.org/repos/asf/jena/blob/245214d8/jena-base/src/test/java/org/apache/jena/atlas/lib/TestFilenameProcessing.java
----------------------------------------------------------------------
diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/TestFilenameProcessing.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestFilenameProcessing.java
index 91c783d..f4aa394 100644
--- a/jena-base/src/test/java/org/apache/jena/atlas/lib/TestFilenameProcessing.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestFilenameProcessing.java
@@ -155,6 +155,12 @@ public class TestFilenameProcessing extends BaseTest
         filenameToIRI("file:..", "file://"+x ) ;
     }
     
+    // Windows + URL.toString().
+    // Should be stable on all systems. 
+    @Test public void fileURL_15() {
+        filenameToIRI("file:/C:/path/file", "file:///C:/path/file") ;
+    }
+
     private static void encodeComponent(String string, String result) {
         String r = IRILib.encodeUriComponent(string) ;
         assertEquals(result, r) ;