📄 locator.java
字号:
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; } /** * Decodes an Uri with % characters. * The URI is escaped * @param uri String with the uri possibly containing % characters. * @return The decoded Uri * @throws UnsupportedEncodingException if UTF-8 is not available * @since Ant 1.7 */ 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); } /** * Encodes an Uri with % characters. * The URI is escaped * @param path String to encode. * @return The encoded string, according to URI norms * @throws UnsupportedEncodingException if UTF-8 is not available * @since Ant 1.7 */ 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(); } /** * 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 * @param file the file to convert * @return URL the converted File * @throws MalformedURLException on error */ public static URL fileToURL(File file) throws MalformedURLException { try { return new URL(encodeURI(file.toURL().toString())); } catch (UnsupportedEncodingException ex) { throw new MalformedURLException(ex.toString()); } } /** * 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. * * @return the tools jar as a File if required, null otherwise. */ 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 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. * * @param location the location to scan for Jars. * * @return an array of URLs for all jars in the given location. * * @exception MalformedURLException if the URLs for the jars cannot be * formed. */ public static URL[] getLocationURLs(File location) throws MalformedURLException { return getLocationURLs(location, new String[]{".jar"}); } /** * 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. * * @param location the location to scan for files. * @param extensions an array of extension that are to match in the * directory search. * * @return an array of URLs of matching files. * @exception MalformedURLException if the URLs for the files cannot be * formed. */ public static URL[] getLocationURLs(File location, final 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; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -