in netbeansintegration/tags/4.1.4/project_templates/UNOClientAppProject/src/com/sun/star/lib/loader/InstallationFinder.java [469:567]
private static String getCanonicalPathFromFileURL( String oooUrl ) {
String prefix = "file://";
if (oooUrl.length() < prefix.length()
|| !oooUrl.substring(0, prefix.length()).toLowerCase().equals(
prefix))
{
return null;
}
StringBuffer buf = new StringBuffer(prefix);
int n = oooUrl.indexOf('/', prefix.length());
if (n < 0) {
n = oooUrl.length();
}
String host = oooUrl.substring(prefix.length(), n);
if (host.length() != 0 && !host.toLowerCase().equals("localhost")) {
return null;
}
buf.append(host);
if (n == oooUrl.length()) {
buf.append('/');
} else {
loop:
while (n < oooUrl.length()) {
buf.append('/');
++n;
int n2 = oooUrl.indexOf('/', n);
if (n2 < 0) {
n2 = oooUrl.length();
}
while (n < n2) {
char c = oooUrl.charAt(n);
switch (c) {
case '%':
byte[] bytes = new byte[(n2 - n) / 3];
int len = 0;
while (oooUrl.length() - n > 2
&& oooUrl.charAt(n) == '%')
{
int d1 = Character.digit(oooUrl.charAt(n + 1), 16);
int d2 = Character.digit(oooUrl.charAt(n + 2), 16);
if (d1 < 0 || d2 < 0) {
break;
}
int d = 16 * d1 + d2;
if (d == '/') {
return null;
}
bytes[len++] = (byte) d;
n += 3;
}
String s;
try {
s = new String(bytes, 0, len, "UTF-8");
} catch (UnsupportedEncodingException e) {
return null;
}
buf.append(s);
break;
case '#':
break loop;
default:
buf.append(c);
++n;
break;
}
}
}
}
URL url;
try {
url = new URL(buf.toString());
} catch (MalformedURLException e) {
return null;
}
String path = url.getFile();
String fragment = url.getRef();
if (fragment != null) {
path += '#' + fragment;
}
String ret = null;
File file = new File( path, SOFFICE );
try {
if ( file.isAbsolute() && file.exists() ) {
try {
// resolve symlink
ret = file.getCanonicalFile().getParent();
} catch ( IOException e ) {
return null;
}
}
} catch ( SecurityException e ) {
return null;
}
return ret;
}