rootdocimpl.java
来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 1,314 行 · 第 1/3 页
JAVA
1,314 行
public ClassDoc tryFetch(String name) { if (null != match(name)) { ClassDoc topLevelClass = null; if (alreadyFetched) { topLevelClass = classDoc; } else { alreadyFetched = true; try { topLevelClass = parser.processSourceFile(classFile, false, sourceEncoding, null); } catch (Exception ignore) { printWarning("Could not parse source file " + classFile); } } if (null == topLevelClass) { return null; } else { return getInnerClass(topLevelClass, innerClassName); } } else { return null; } } public String getName() { if (innerClassName != null) { return name + innerClassName; } else { return name; } } } private class ResolvedImportReflectionClass implements ResolvedImport { private Class clazz; private String name; ResolvedImportReflectionClass(Class clazz) { this.clazz = clazz; String className = clazz.getName(); int ndx = className.lastIndexOf('.'); if (ndx >= 0) { this.name = className.substring(ndx + 1); } else { this.name = className; } } public String toString() { return "ResolvedImportReflectionClass{" + clazz.getName() + "}"; } public String match(String name) { if (this.name.equals(name)) { return clazz.getName(); } else { return null; } } public boolean mismatch(String name) { return null == match(name); } public ClassDoc tryFetch(String name) { if (null != match(name)) { return new ClassDocReflectedImpl(clazz); } // FIXME: inner classes? else { return null; } } public String getName() { return name; } } private class ResolvedImportReflectionPackage implements ResolvedImport { private String packagePrefix; ResolvedImportReflectionPackage(String packagePrefix) { this.packagePrefix = packagePrefix; } public String toString() { return "ResolvedImportReflectionPackage{" + packagePrefix + ".*}"; } public String match(String name) { try { Class clazz = Class.forName(packagePrefix + "." + name); return clazz.getName(); } catch (Exception e) { return null; } } public boolean mismatch(String name) { return null == match(name); } public ClassDoc tryFetch(String name) { try { Class clazz = Class.forName(packagePrefix + name); return ClassDocReflectedImpl.newInstance(clazz); } catch (Exception e) { return null; } } public String getName() { return packagePrefix; } } private List unlocatablePrefixes = new LinkedList(); private ResolvedImport resolveImport(String importSpecifier) { ResolvedImport result = resolveImportFileSystem(importSpecifier); if (null == result && Main.getInstance().isReflectionEnabled()) { result = resolveImportReflection(importSpecifier); } if (null == result) { result = new ResolvedImportNotFound(importSpecifier); } return result; } private ResolvedImport resolveImportReflection(String importSpecifier) { String importedPackageOrClass = importSpecifier; if (importedPackageOrClass.endsWith(".*")) { importedPackageOrClass = importedPackageOrClass.substring(0, importedPackageOrClass.length() - 2); return new ResolvedImportReflectionPackage(importedPackageOrClass); //return null; } else { try { Class importedClass = Class.forName(importSpecifier); return new ResolvedImportReflectionClass(importedClass); } catch (Throwable ignore) { return null; } } } private ResolvedImport resolveImportFileSystem(String importSpecifier) { for (Iterator it = unlocatablePrefixes.iterator(); it.hasNext(); ) { String unlocatablePrefix = (String)it.next(); if (importSpecifier.startsWith(unlocatablePrefix)) { return null; } } String longestUnlocatablePrefix = ""; for (Iterator it=sourcePath.iterator(); it.hasNext(); ) { File _sourcePath = (File)it.next(); StringBuffer packageOrClassPrefix = new StringBuffer(); StringTokenizer st = new StringTokenizer(importSpecifier, "."); while (st.hasMoreTokens() && _sourcePath.isDirectory()) { String token = st.nextToken(); if ("*".equals(token)) { return new ResolvedImportPackageFile(_sourcePath, packageOrClassPrefix.substring(0, packageOrClassPrefix.length() - 1)); } else { packageOrClassPrefix.append(token); packageOrClassPrefix.append('.'); File classFile = new File(_sourcePath, token + ".java"); //System.err.println(" looking for file " + classFile); if (classFile.exists()) { StringBuffer innerClassName = new StringBuffer(); while (st.hasMoreTokens()) { token = st.nextToken(); if (innerClassName.length() > 0) { innerClassName.append('.'); } innerClassName.append(token); } return new ResolvedImportClassFile(classFile, innerClassName.toString(), token, importSpecifier); } else { _sourcePath = new File(_sourcePath, token); } } } if (st.hasMoreTokens()) { if (packageOrClassPrefix.length() > longestUnlocatablePrefix.length()) { longestUnlocatablePrefix = packageOrClassPrefix.toString(); } } } if (longestUnlocatablePrefix.length() > 0) { unlocatablePrefixes.add(longestUnlocatablePrefix); } return null; } private Map resolvedImportCache = new HashMap(); private ResolvedImport getResolvedImport(String importSpecifier) { ResolvedImport result = (ResolvedImport)resolvedImportCache.get(importSpecifier); if (null == result) { result = resolveImport(importSpecifier); resolvedImportCache.put(importSpecifier, result); } return result; } public String resolveClassName(String className, ClassDocImpl context) { Iterator it = context.getImportSpecifierList().iterator(); while (it.hasNext()) { String importSpecifier = (String)it.next(); ResolvedImport resolvedImport = getResolvedImport(importSpecifier); String resolvedScheduledClassName = resolvedImport.match(className); if (null != resolvedScheduledClassName) { return resolvedScheduledClassName; } } return className; } public ClassDoc findScheduledClassFile(String scheduledClassName, ClassDoc scheduledClassContext) throws ParseException, IOException { String resolvedScheduledClassName = null; if (scheduledClassContext instanceof ClassDocImpl) { //((ClassDocImpl)scheduledClassContext).resolveReferencedName(scheduledClassName); Iterator it = ((ClassDocImpl)scheduledClassContext).getImportSpecifierList().iterator(); while (it.hasNext()) { String importSpecifier = (String)it.next(); ResolvedImport resolvedImport = getResolvedImport(importSpecifier); //System.err.println(" looking in import '" + resolvedImport + "'"); resolvedScheduledClassName = resolvedImport.match(scheduledClassName); if (null != resolvedScheduledClassName) { ClassDoc result = resolvedImport.tryFetch(scheduledClassName); if (null != result) { return result; } else { if (!inaccessibleReportedSet.contains(scheduledClassName)) { inaccessibleReportedSet.add(scheduledClassName); printWarning("Error while loading class " + scheduledClassName); } // FIXME: output resolved class name here return null; } } } } else { System.err.println("findScheduledClassFile for '" + scheduledClassName + "' in proxy for " + scheduledClassContext); } // interpret as fully qualified name on file system ResolvedImport fqImport = resolveImportFileSystem(scheduledClassName); if (null != fqImport && fqImport instanceof ResolvedImportClassFile) { return fqImport.tryFetch(((ResolvedImportClassFile)fqImport).getName()); } // use reflection, assume fully qualified class name if (!unlocatableReflectedClassNames.contains(scheduledClassName)) { if (Main.getInstance().isReflectionEnabled()) { try { Class clazz = Class.forName(scheduledClassName); printWarning("Cannot locate class " + scheduledClassName + " on file system, falling back to reflection."); ClassDoc result = new ClassDocReflectedImpl(clazz); return result; } catch (Throwable ignore) { unlocatableReflectedClassNames.add(scheduledClassName); } } else { unlocatableReflectedClassNames.add(scheduledClassName); } } if (null == resolvedScheduledClassName) { resolvedScheduledClassName = scheduledClassName; } if (!unlocatableReportedSet.contains(resolvedScheduledClassName)) { unlocatableReportedSet.add(resolvedScheduledClassName); printWarning("Cannot locate class " + resolvedScheduledClassName + " referenced in class " + scheduledClassContext.qualifiedName()); } return null; } private Set unlocatableReflectedClassNames = new HashSet(); public static boolean recursiveClasses = false; public void addSpecifiedPackageName(String packageName) { specifiedPackageNames.add(packageName); } public void addSpecifiedSourceFile(File sourceFile) { specifiedSourceFiles.add(sourceFile); } public boolean hasSpecifiedPackagesOrClasses() { return !specifiedPackageNames.isEmpty() || !specifiedSourceFiles.isEmpty(); } public void setOptions(String[][] customOptionArr) { this.customOptionArr = customOptionArr; } public void setSourcePath(List sourcePath) { this.sourcePath = sourcePath; } public void finalize() throws Throwable { super.finalize(); } public void flush() { try { rawCommentCache.close(); } catch (IOException e) { printError("Cannot close raw comment cache"); } rawCommentCache = null; customOptionArr = null; specifiedPackageNames = null; classesList = null; classDocMap = null; packageDocMap = null; classes = null; specifiedClasses = null; specifiedPackages = null; scheduledClasses = null; sourcePath = null; parser = null; unlocatableReportedSet = null; inaccessibleReportedSet = null; } public void setSourceEncoding(String sourceEncoding) { this.sourceEncoding = sourceEncoding; } public RootDocImpl() { super(null); } public static String readHtmlBody(File file) throws IOException { FileReader fr=new FileReader(file); long size = file.length(); char[] packageDocBuf=new char[(int)(size)]; int index = 0; int i = fr.read(packageDocBuf, index, (int)size); while (i > 0) { index += i; size -= i; i = fr.read(packageDocBuf, index, (int)size); } fr.close(); // We only need the part between the begin and end body tag. String html = new String(packageDocBuf); int start = html.indexOf("<body"); if (start == -1) start = html.indexOf("<BODY"); int end = html.indexOf("</body>"); if (end == -1) end = html.indexOf("</BODY>"); if (start != -1 && end != -1) { // Start is end of body tag. start = html.indexOf('>', start) + 1; if (start != -1 && start < end) html = html.substring(start, end); } return html.trim(); } public Parser getParser() { return parser; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?