Author: peter_firmstone
Date: Wed Jul 18 13:22:34 2012
New Revision: 1362940

URL: http://svn.apache.org/viewvc?rev=1362940&view=rev
Log:
Another attempt to fix windows file URI issues from afar, if lucky all tests 
should now pass, unless something else has failed.

Modified:
    
river/jtsk/trunk/src/com/sun/jini/start/SharedActivationPolicyPermission.java
    river/jtsk/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java
    river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java
    river/jtsk/trunk/test/src/org/apache/river/impl/net/UriStringTest.java

Modified: 
river/jtsk/trunk/src/com/sun/jini/start/SharedActivationPolicyPermission.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/start/SharedActivationPolicyPermission.java?rev=1362940&r1=1362939&r2=1362940&view=diff
==============================================================================
--- 
river/jtsk/trunk/src/com/sun/jini/start/SharedActivationPolicyPermission.java 
(original)
+++ 
river/jtsk/trunk/src/com/sun/jini/start/SharedActivationPolicyPermission.java 
Wed Jul 18 13:22:34 2012
@@ -153,7 +153,7 @@ public final class SharedActivationPolic
             if (policy.startsWith("file:") || policy.startsWith("FILE:")){
                 String path = null;
                 try {
-                    path = UriString.escapeIllegalCharacters(uncanonicalPath);
+                    path = UriString.parse(uncanonicalPath);
                     path = new File(new URI(path)).getPath();
                 } catch (URISyntaxException ex) {
                     path = uncanonicalPath.replace('/', File.separatorChar);

Modified: 
river/jtsk/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java?rev=1362940&r1=1362939&r2=1362940&view=diff
==============================================================================
--- river/jtsk/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java 
(original)
+++ river/jtsk/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java 
Wed Jul 18 13:22:34 2012
@@ -267,14 +267,26 @@ class DefaultPolicyParser implements Pol
             .build();
     }
     
-    URI getURI(String uri) throws MalformedURLException, URISyntaxException{
+    URI getURI(String uriString) throws MalformedURLException, 
URISyntaxException{
         // We do this to support windows, this is to ensure that drive letter
         // capitalisation is correct and illegal strings are escaped correctly.
-        // It give the native parser a chance to correctly parse and format
-        // platform specific information.
-        String url = new URL(uri).toString();
-        if (url == null || url.equals("")) return new 
URI(UriString.escapeIllegalCharacters(uri));
-        return new URI(UriString.escapeIllegalCharacters(url));
+        String result = UriString.parse(uriString);
+        boolean isFile = result.startsWith("file:") || 
result.startsWith("FILE:");
+        URI uri = new URI(result);
+        if (isFile){
+            if ( result.endsWith("*") || result.endsWith("-")){
+                // We did our best to create a compatible URI,
+                // upper and lower case may cause issues on windows, if the
+                // CodeSource url differs.
+                return uri; 
+            } else {
+                // Since file is system dependant, it will guarantee that
+                // the path is compatible and exists.
+                File file = new File(uri);
+                return file.toURI().normalize();
+            }
+        }
+        return uri;
     }
     
     Segment segment(String s, Properties p) throws ExpansionFailedException{

Modified: river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java?rev=1362940&r1=1362939&r2=1362940&view=diff
==============================================================================
--- river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java (original)
+++ river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java Wed Jul 18 
13:22:34 2012
@@ -18,6 +18,8 @@
 package org.apache.river.impl.net;
 
 import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -31,6 +33,9 @@ import java.util.Map;
  */
 public class UriString {
     
+    // prevents instantiation.
+    private UriString(){};
+    
     private final static Map<Character,String> escaped = new 
HashMap<Character,String>();
     private final static Collection<Character> alpha;
     
@@ -94,22 +99,80 @@ public class UriString {
         }
     }
     
-    public static String escapeIllegalCharacters(String url){
-        boolean isFile = url.startsWith("file:");
+    /**
+     * Finds a character in an array and returns the index at which it exists,
+     * or returns -1 if it doesn't
+     * 
+     * @param array
+     * @param character
+     * @return 
+     */
+    public static int index(char [] array, char character){
+        int l = array.length;
+        for (int i = 0; i < l; i++){
+            if (array[i] == character) return i;
+        }
+        return -1;
+    }
+    
+    public static String parse(String url) {
+        boolean isFile = url.startsWith("file:") || url.startsWith("FILE:");
+        char slash = reserved[1];
         char [] u = url.toCharArray();
-        int l = u.length;
+        int l = u.length; 
         StringBuilder sb = new StringBuilder();
         for (int i=0; i<l; i++){
             if (isFile){
                 // Ensure we use forward slashes
-                if (u[i] == File.separatorChar) u[i] = '/';
+                if (u[i] == File.separatorChar) {
+                    u[i] = '/';
+                    sb.append(u[i]);
+                    continue;
+                }
                 if (i == 5 && url.startsWith(":", 6 )) {
                     // Windows drive letter without leading slashes doesn't 
comply
-                    // with URI spec, fix it here.
-                    if ( alpha.contains(u[i])){
+                    // with URI spec, fix it here
+                    // Ensure that drive letter is upper case only.
+                    int upcase = index(upalpha, u[i]);
+                    int lowcase = index(lowalpha, u[i]);
+                    if ( upcase > 0){
                         sb.append("///");
+                        sb.append(u[i]);
+                        continue;
+                    } else if ( lowcase > 0){
+                        sb.append("///");
+                        sb.append(upalpha[lowcase]);
+                        continue;
+                    }
+                }
+                if (i == 6 && u[5] == '/' && url.startsWith(":", 7) ){
+                    // Ensure drive letter is upper case only.
+                    int upcase = index(upalpha, u[i]);
+                    int lowcase = index(lowalpha, u[i]);
+                    if ( upcase > 0){
+                        sb.append("//");
+                        sb.append(u[i]);
+                        continue;
+                    } else if ( lowcase > 0){
+                        sb.append("//");
+                        sb.append(upalpha[lowcase]);
+                        continue;
+                    }
+                }
+                if (i == 8 && u[5] == slash && u[6] == slash 
+                        && u[7] == slash && url.startsWith(":", 9)){
+                    // Ensure drive letter is upper case only.
+                    int upcase = index(upalpha, u[i]);
+                    int lowcase = index(lowalpha, u[i]);
+                    if ( upcase > 0){
+                        sb.append(u[i]);
+                        continue;
+                    } else if ( lowcase > 0){
+                        sb.append(upalpha[lowcase]);
+                        continue;
                     }
                 }
+                    
             }
             Character c = Character.valueOf(u[i]);
             if (escaped.keySet().contains(c)){

Modified: river/jtsk/trunk/test/src/org/apache/river/impl/net/UriStringTest.java
URL: 
http://svn.apache.org/viewvc/river/jtsk/trunk/test/src/org/apache/river/impl/net/UriStringTest.java?rev=1362940&r1=1362939&r2=1362940&view=diff
==============================================================================
--- river/jtsk/trunk/test/src/org/apache/river/impl/net/UriStringTest.java 
(original)
+++ river/jtsk/trunk/test/src/org/apache/river/impl/net/UriStringTest.java Wed 
Jul 18 13:22:34 2012
@@ -37,14 +37,31 @@ public class UriStringTest {
     }
 
     /**
-     * Test of escapeIllegalCharacters method, of class UriString.
+     * Test of parse method, of class UriString.
      */
     @Test
     public void testEscapeIllegalCharacters() {
         System.out.println("escapeIllegalCharacters");
         String url = " ";
         String expResult = "%20";
-        String result = UriString.escapeIllegalCharacters(url);
+        String result = UriString.parse(url);
+        assertEquals(expResult, result);
+    }
+    
+    @Test
+    public void testWindowsDrives() {
+        System.out.println("windows drive letters");
+        String url = "file:c:/Program Files/java";
+        String expResult = "file:///C:/Program%20Files/java";
+        String result = UriString.parse(url);
+        assertEquals(expResult, result);
+        url = "file:/c:/Program Files/java lib";
+        expResult = "file:///C:/Program%20Files/java%20lib";
+        result = UriString.parse(url);
+        assertEquals(expResult, result);
+        url = "file:///c:/Program Files/java";
+        expResult = "file:///C:/Program%20Files/java";
+        result = UriString.parse(url);
         assertEquals(expResult, result);
     }
 }


Reply via email to