| Method from org.apache.tools.ant.launch.Locator Detail: |
public static String decodeUri(String uri) throws UnsupportedEncodingException {
if (uri.indexOf('%") == -1) {
return uri;
}
ByteArrayOutputStream sb = new ByteArrayOutputStream(uri.length());
CharacterIterator iter = new StringCharacterIterator(uri);
for (char c = iter.first(); c != CharacterIterator.DONE;
c = iter.next()) {
if (c == '%") {
char c1 = iter.next();
if (c1 != CharacterIterator.DONE) {
int i1 = Character.digit(c1, WORD);
char c2 = iter.next();
if (c2 != CharacterIterator.DONE) {
int i2 = Character.digit(c2, WORD);
sb.write((char) ((i1 < < NIBBLE) + i2));
}
}
} else {
sb.write(c);
}
}
return sb.toString(URI_ENCODING);
}
Decodes an Uri with % characters.
The URI is escaped |
public static String encodeURI(String path) throws UnsupportedEncodingException {
int i = 0;
int len = path.length();
int ch = 0;
StringBuffer sb = null;
for (; i < len; i++) {
ch = path.charAt(i);
// if it's not an ASCII character, break here, and use UTF-8 encoding
if (ch >= ASCII_SIZE) {
break;
}
if (gNeedEscaping[ch]) {
if (sb == null) {
sb = new StringBuffer(path.substring(0, i));
}
sb.append('%");
sb.append(gAfterEscaping1[ch]);
sb.append(gAfterEscaping2[ch]);
// record the fact that it's escaped
} else if (sb != null) {
sb.append((char) ch);
}
}
// we saw some non-ascii character
if (i < len) {
if (sb == null) {
sb = new StringBuffer(path.substring(0, i));
}
// get UTF-8 bytes for the remaining sub-string
byte[] bytes = null;
byte b;
bytes = path.substring(i).getBytes(URI_ENCODING);
len = bytes.length;
// for each byte
for (i = 0; i < len; i++) {
b = bytes[i];
// for non-ascii character: make it positive, then escape
if (b < 0) {
ch = b + BYTE_SIZE;
sb.append('%");
sb.append(gHexChs[ch > > NIBBLE]);
sb.append(gHexChs[ch & NIBBLE_MASK]);
} else if (gNeedEscaping[b]) {
sb.append('%");
sb.append(gAfterEscaping1[b]);
sb.append(gAfterEscaping2[b]);
} else {
sb.append((char) b);
}
}
}
return sb == null ? path : sb.toString();
}
Encodes an Uri with % characters.
The URI is escaped |
public static URL fileToURL(File file) throws MalformedURLException {
try {
return new URL(encodeURI(file.toURL().toString()));
} catch (UnsupportedEncodingException ex) {
throw new MalformedURLException(ex.toString());
}
}
Convert a File to a URL.
File.toURL() does not encode characters like #.
File.toURI() has been introduced in java 1.4, so
ANT cannot use it (except by reflection)
FileUtils.toURI() cannot be used by Locator.java
Implemented this way.
File.toURL() adds file: and changes '\' to '/' for dos OSes
encodeURI converts characters like ' ' and '#' to %DD |
public static String fromURI(String uri) {
// #buzilla8031: first try Java 1.4.
String result = null;
//result = fromUriJava14(uri);
if (result == null) {
result = fromURIJava13(uri);
}
return result;
}
Constructs a file path from a file: URI.
Will be an absolute path if the given URI is absolute.
Prior to Java 1.4,
swallows '%' that are not followed by two characters.
See dt-sysid
which makes some mention of how
characters not supported by URI Reference syntax should be escaped. |
static String fromURIJava13(String uri) {
// Fallback method for Java 1.3 or earlier.
URL url = null;
try {
url = new URL(uri);
} catch (MalformedURLException emYouEarlEx) {
// Ignore malformed exception
}
if (url == null || !("file".equals(url.getProtocol()))) {
throw new IllegalArgumentException(ERROR_NOT_FILE_URI + uri);
}
StringBuffer buf = new StringBuffer(url.getHost());
if (buf.length() > 0) {
buf.insert(0, File.separatorChar).insert(0, File.separatorChar);
}
String file = url.getFile();
int queryPos = file.indexOf('?");
buf.append((queryPos < 0) ? file : file.substring(0, queryPos));
uri = buf.toString().replace('/", File.separatorChar);
if (File.pathSeparatorChar == ';" && uri.startsWith("\\") && uri.length() > 2
&& Character.isLetter(uri.charAt(1)) && uri.lastIndexOf(':") > -1) {
uri = uri.substring(1);
}
String path = null;
try {
path = decodeUri(uri);
String cwd = System.getProperty("user.dir");
int posi = cwd.indexOf(":");
if ((posi > 0) && path.startsWith(File.separator)) {
path = cwd.substring(0, posi + 1) + path;
}
} catch (UnsupportedEncodingException exc) {
// not sure whether this is clean, but this method is
// declared not to throw exceptions.
throw new IllegalStateException(
"Could not convert URI " + uri + " to path: "
+ exc.getMessage());
}
return path;
}
package-private for testing in same classloader |
public static File getClassSource(Class c) {
String classResource = c.getName().replace('.", '/") + ".class";
return getResourceSource(c.getClassLoader(), classResource);
}
Find the directory or jar file the class has been loaded from. |
public static URL[] getLocationURLs(File location) throws MalformedURLException {
return getLocationURLs(location, new String[]{".jar"});
}
Get an array of URLs representing all of the jar files in the
given location. If the location is a file, it is returned as the only
element of the array. If the location is a directory, it is scanned for
jar files. |
public static URL[] getLocationURLs(File location,
String[] extensions) throws MalformedURLException {
URL[] urls = new URL[0];
if (!location.exists()) {
return urls;
}
if (!location.isDirectory()) {
urls = new URL[1];
String path = location.getPath();
String littlePath = path.toLowerCase(Locale.US);
for (int i = 0; i < extensions.length; ++i) {
if (littlePath.endsWith(extensions[i])) {
urls[0] = fileToURL(location);
break;
}
}
return urls;
}
File[] matches = location.listFiles(
new FilenameFilter() {
public boolean accept(File dir, String name) {
String littleName = name.toLowerCase(Locale.US);
for (int i = 0; i < extensions.length; ++i) {
if (littleName.endsWith(extensions[i])) {
return true;
}
}
return false;
}
});
urls = new URL[matches.length];
for (int i = 0; i < matches.length; ++i) {
urls[i] = fileToURL(matches[i]);
}
return urls;
}
Get an array of URLs representing all of the files of a given set of
extensions in the given location. If the location is a file, it is
returned as the only element of the array. If the location is a
directory, it is scanned for matching files. |
public static File getResourceSource(ClassLoader c,
String resource) {
if (c == null) {
c = Locator.class.getClassLoader();
}
URL url = null;
if (c == null) {
url = ClassLoader.getSystemResource(resource);
} else {
url = c.getResource(resource);
}
if (url != null) {
String u = url.toString();
try {
if (u.startsWith("jar:file:")) {
int pling = u.indexOf("!");
String jarName = u.substring("jar:".length(), pling);
return new File(fromURI(jarName));
} else if (u.startsWith("file:")) {
int tail = u.indexOf(resource);
String dirName = u.substring(0, tail);
return new File(fromURI(dirName));
}
} catch (IllegalArgumentException e) {
//unable to determine the URI for reasons unknown.
return null;
}
}
return null;
}
Find the directory or jar a given resource has been loaded from. |
public static File getToolsJar() {
// firstly check if the tools jar is already in the classpath
boolean toolsJarAvailable = false;
try {
// just check whether this throws an exception
Class.forName("com.sun.tools.javac.Main");
toolsJarAvailable = true;
} catch (Exception e) {
try {
Class.forName("sun.tools.javac.Main");
toolsJarAvailable = true;
} catch (Exception e2) {
// ignore
}
}
if (toolsJarAvailable) {
return null;
}
// couldn't find compiler - try to find tools.jar
// based on java.home setting
String libToolsJar
= File.separator + "lib" + File.separator + "tools.jar";
String javaHome = System.getProperty("java.home");
File toolsJar = new File(javaHome + libToolsJar);
if (toolsJar.exists()) {
// Found in java.home as given
return toolsJar;
}
if (javaHome.toLowerCase(Locale.US).endsWith(File.separator + "jre")) {
javaHome = javaHome.substring(
0, javaHome.length() - "/jre".length());
toolsJar = new File(javaHome + libToolsJar);
}
if (!toolsJar.exists()) {
System.out.println("Unable to locate tools.jar. "
+ "Expected to find it in " + toolsJar.getPath());
return null;
}
return toolsJar;
}
Get the File necessary to load the Sun compiler tools. If the classes
are available to this class, then no additional URL is required and
null is returned. This may be because the classes are explicitly in the
class path or provided by the JVM directly. |