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 + -
显示快捷键?