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 }