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); } }
