diff -r 400a4e8accd3 -r bdcef2ef52d2 src/share/classes/com/sun/tools/javadoc/DocletInvoker.java --- a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Thu Nov 15 19:54:20 2012 -0800 +++ b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Thu Nov 15 23:07:24 2012 -0800 @@ -32,7 +32,12 @@ import java.net.URL; import java.net.URLClassLoader; +import javax.tools.DocumentationTool; +import javax.tools.JavaFileManager; + import com.sun.javadoc.*; +import com.sun.tools.javac.file.Locations; +import com.sun.tools.javac.util.ClientCodeException; import com.sun.tools.javac.util.List; import static com.sun.javadoc.LanguageVersion.*; @@ -57,6 +62,12 @@ private final Messager messager; + /** + * In API mode, exceptions thrown while calling the doclet are + * propagated using ClientCodeException. + */ + private final boolean apiMode; + private static class DocletInvokeException extends Exception { private static final long serialVersionUID = 0; } @@ -71,24 +82,38 @@ } } - public DocletInvoker(Messager messager, + public DocletInvoker(Messager messager, Class docletClass, boolean apiMode) { + this.messager = messager; + this.docletClass = docletClass; + docletClassName = docletClass.getName(); + appClassLoader = null; + this.apiMode = apiMode; + } + + public DocletInvoker(Messager messager, JavaFileManager fileManager, String docletClassName, String docletPath, - ClassLoader docletParentClassLoader) { + ClassLoader docletParentClassLoader, + boolean apiMode) { this.messager = messager; this.docletClassName = docletClassName; + this.apiMode = apiMode; - // construct class loader - String cpString = null; // make sure env.class.path defaults to dot + if (fileManager != null && fileManager.hasLocation(DocumentationTool.Location.DOCLET_PATH)) { + appClassLoader = fileManager.getClassLoader(DocumentationTool.Location.DOCLET_PATH); + } else { + // construct class loader + String cpString = null; // make sure env.class.path defaults to dot - // do prepends to get correct ordering - cpString = appendPath(System.getProperty("env.class.path"), cpString); - cpString = appendPath(System.getProperty("java.class.path"), cpString); - cpString = appendPath(docletPath, cpString); - URL[] urls = com.sun.tools.javac.file.Locations.pathToURLs(cpString); - if (docletParentClassLoader == null) - appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName)); - else - appClassLoader = new URLClassLoader(urls, docletParentClassLoader); + // do prepends to get correct ordering + cpString = appendPath(System.getProperty("env.class.path"), cpString); + cpString = appendPath(System.getProperty("java.class.path"), cpString); + cpString = appendPath(docletPath, cpString); + URL[] urls = Locations.pathToURLs(cpString); + if (docletParentClassLoader == null) + appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName)); + else + appClassLoader = new URLClassLoader(urls, docletParentClassLoader); + } // attempt to find doclet Class dc = null; @@ -280,7 +305,8 @@ ClassLoader savedCCL = Thread.currentThread().getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(appClassLoader); + if (appClassLoader != null) // will be null if doclet class provided via API + Thread.currentThread().setContextClassLoader(appClassLoader); return meth.invoke(null , params); } catch (IllegalArgumentException exc) { messager.error(Messager.NOPOS, "main.internal_error_exception_thrown", @@ -296,10 +322,12 @@ throw new DocletInvokeException(); } catch (InvocationTargetException exc) { Throwable err = exc.getTargetException(); + if (apiMode) + throw new ClientCodeException(err); if (err instanceof java.lang.OutOfMemoryError) { messager.error(Messager.NOPOS, "main.out.of.memory"); } else { - messager.error(Messager.NOPOS, "main.exception_thrown", + messager.error(Messager.NOPOS, "main.exception_thrown", docletClassName, methodName, exc.toString()); exc.getTargetException().printStackTrace(); }