src/share/classes/com/sun/tools/javadoc/DocletInvoker.java

changeset 1413
bdcef2ef52d2
parent 1411
467f4f754368
child 2525
2eb010b6cb22
     1.1 --- a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java	Thu Nov 15 19:54:20 2012 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java	Thu Nov 15 23:07:24 2012 -0800
     1.3 @@ -32,7 +32,12 @@
     1.4  import java.net.URL;
     1.5  import java.net.URLClassLoader;
     1.6  
     1.7 +import javax.tools.DocumentationTool;
     1.8 +import javax.tools.JavaFileManager;
     1.9 +
    1.10  import com.sun.javadoc.*;
    1.11 +import com.sun.tools.javac.file.Locations;
    1.12 +import com.sun.tools.javac.util.ClientCodeException;
    1.13  import com.sun.tools.javac.util.List;
    1.14  import static com.sun.javadoc.LanguageVersion.*;
    1.15  
    1.16 @@ -57,6 +62,12 @@
    1.17  
    1.18      private final Messager messager;
    1.19  
    1.20 +    /**
    1.21 +     * In API mode, exceptions thrown while calling the doclet are
    1.22 +     * propagated using ClientCodeException.
    1.23 +     */
    1.24 +    private final boolean apiMode;
    1.25 +
    1.26      private static class DocletInvokeException extends Exception {
    1.27          private static final long serialVersionUID = 0;
    1.28      }
    1.29 @@ -71,24 +82,38 @@
    1.30          }
    1.31      }
    1.32  
    1.33 -    public DocletInvoker(Messager messager,
    1.34 +    public DocletInvoker(Messager messager, Class<?> docletClass, boolean apiMode) {
    1.35 +        this.messager = messager;
    1.36 +        this.docletClass = docletClass;
    1.37 +        docletClassName = docletClass.getName();
    1.38 +        appClassLoader = null;
    1.39 +        this.apiMode = apiMode;
    1.40 +    }
    1.41 +
    1.42 +    public DocletInvoker(Messager messager, JavaFileManager fileManager,
    1.43                           String docletClassName, String docletPath,
    1.44 -                         ClassLoader docletParentClassLoader) {
    1.45 +                         ClassLoader docletParentClassLoader,
    1.46 +                         boolean apiMode) {
    1.47          this.messager = messager;
    1.48          this.docletClassName = docletClassName;
    1.49 +        this.apiMode = apiMode;
    1.50  
    1.51 -        // construct class loader
    1.52 -        String cpString = null;   // make sure env.class.path defaults to dot
    1.53 +        if (fileManager != null && fileManager.hasLocation(DocumentationTool.Location.DOCLET_PATH)) {
    1.54 +            appClassLoader = fileManager.getClassLoader(DocumentationTool.Location.DOCLET_PATH);
    1.55 +        } else {
    1.56 +            // construct class loader
    1.57 +            String cpString = null;   // make sure env.class.path defaults to dot
    1.58  
    1.59 -        // do prepends to get correct ordering
    1.60 -        cpString = appendPath(System.getProperty("env.class.path"), cpString);
    1.61 -        cpString = appendPath(System.getProperty("java.class.path"), cpString);
    1.62 -        cpString = appendPath(docletPath, cpString);
    1.63 -        URL[] urls = com.sun.tools.javac.file.Locations.pathToURLs(cpString);
    1.64 -        if (docletParentClassLoader == null)
    1.65 -            appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName));
    1.66 -        else
    1.67 -            appClassLoader = new URLClassLoader(urls, docletParentClassLoader);
    1.68 +            // do prepends to get correct ordering
    1.69 +            cpString = appendPath(System.getProperty("env.class.path"), cpString);
    1.70 +            cpString = appendPath(System.getProperty("java.class.path"), cpString);
    1.71 +            cpString = appendPath(docletPath, cpString);
    1.72 +            URL[] urls = Locations.pathToURLs(cpString);
    1.73 +            if (docletParentClassLoader == null)
    1.74 +                appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName));
    1.75 +            else
    1.76 +                appClassLoader = new URLClassLoader(urls, docletParentClassLoader);
    1.77 +        }
    1.78  
    1.79          // attempt to find doclet
    1.80          Class<?> dc = null;
    1.81 @@ -280,7 +305,8 @@
    1.82              ClassLoader savedCCL =
    1.83                  Thread.currentThread().getContextClassLoader();
    1.84              try {
    1.85 -                Thread.currentThread().setContextClassLoader(appClassLoader);
    1.86 +                if (appClassLoader != null) // will be null if doclet class provided via API
    1.87 +                    Thread.currentThread().setContextClassLoader(appClassLoader);
    1.88                  return meth.invoke(null , params);
    1.89              } catch (IllegalArgumentException exc) {
    1.90                  messager.error(Messager.NOPOS, "main.internal_error_exception_thrown",
    1.91 @@ -296,10 +322,12 @@
    1.92                  throw new DocletInvokeException();
    1.93              } catch (InvocationTargetException exc) {
    1.94                  Throwable err = exc.getTargetException();
    1.95 +                if (apiMode)
    1.96 +                    throw new ClientCodeException(err);
    1.97                  if (err instanceof java.lang.OutOfMemoryError) {
    1.98                      messager.error(Messager.NOPOS, "main.out.of.memory");
    1.99                  } else {
   1.100 -                messager.error(Messager.NOPOS, "main.exception_thrown",
   1.101 +                    messager.error(Messager.NOPOS, "main.exception_thrown",
   1.102                                 docletClassName, methodName, exc.toString());
   1.103                      exc.getTargetException().printStackTrace();
   1.104                  }

mercurial