Mon, 06 Oct 2008 16:57:15 -0700
6748546: javadoc API should be classloader-friendly
Reviewed-by: bpatel
1.1 --- a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Sat Oct 04 22:59:05 2008 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Mon Oct 06 16:57:15 2008 -0700 1.3 @@ -32,7 +32,6 @@ 1.4 import com.sun.tools.javac.util.List; 1.5 1.6 import java.net.*; 1.7 -import java.lang.OutOfMemoryError; 1.8 import java.lang.reflect.Method; 1.9 import java.lang.reflect.Modifier; 1.10 import java.lang.reflect.InvocationTargetException; 1.11 @@ -70,7 +69,8 @@ 1.12 } 1.13 1.14 public DocletInvoker(Messager messager, 1.15 - String docletClassName, String docletPath) { 1.16 + String docletClassName, String docletPath, 1.17 + ClassLoader docletParentClassLoader) { 1.18 this.messager = messager; 1.19 this.docletClassName = docletClassName; 1.20 1.21 @@ -82,7 +82,10 @@ 1.22 cpString = appendPath(System.getProperty("java.class.path"), cpString); 1.23 cpString = appendPath(docletPath, cpString); 1.24 URL[] urls = pathToURLs(cpString); 1.25 - appClassLoader = new URLClassLoader(urls); 1.26 + if (docletParentClassLoader == null) 1.27 + appClassLoader = new URLClassLoader(urls); 1.28 + else 1.29 + appClassLoader = new URLClassLoader(urls, docletParentClassLoader); 1.30 1.31 // attempt to find doclet 1.32 Class dc = null;
2.1 --- a/src/share/classes/com/sun/tools/javadoc/Main.java Sat Oct 04 22:59:05 2008 -0700 2.2 +++ b/src/share/classes/com/sun/tools/javadoc/Main.java Mon Oct 06 16:57:15 2008 -0700 2.3 @@ -61,6 +61,21 @@ 2.4 2.5 /** 2.6 * Programmatic interface. 2.7 + * @param args The command line parameters. 2.8 + * @param docletParentClassLoader The parent class loader used when 2.9 + * creating the doclet classloader. If null, the class loader used 2.10 + * to instantiate doclets will be created without specifying a parent 2.11 + * class loader. 2.12 + * @return The return code. 2.13 + * @since 1.7 2.14 + */ 2.15 + public static int execute(ClassLoader docletParentClassLoader, String... args) { 2.16 + Start jdoc = new Start(docletParentClassLoader); 2.17 + return jdoc.begin(args); 2.18 + } 2.19 + 2.20 + /** 2.21 + * Programmatic interface. 2.22 * @param programName Name of the program (for error messages). 2.23 * @param args The command line parameters. 2.24 * @return The return code. 2.25 @@ -73,6 +88,22 @@ 2.26 /** 2.27 * Programmatic interface. 2.28 * @param programName Name of the program (for error messages). 2.29 + * @param args The command line parameters. 2.30 + * @param docletParentClassLoader The parent class loader used when 2.31 + * creating the doclet classloader. If null, the class loader used 2.32 + * to instantiate doclets will be created without specifying a parent 2.33 + * class loader. 2.34 + * @return The return code. 2.35 + * @since 1.7 2.36 + */ 2.37 + public static int execute(String programName, ClassLoader docletParentClassLoader, String... args) { 2.38 + Start jdoc = new Start(programName, docletParentClassLoader); 2.39 + return jdoc.begin(args); 2.40 + } 2.41 + 2.42 + /** 2.43 + * Programmatic interface. 2.44 + * @param programName Name of the program (for error messages). 2.45 * @param defaultDocletClassName Fully qualified class name. 2.46 * @param args The command line parameters. 2.47 * @return The return code. 2.48 @@ -87,6 +118,26 @@ 2.49 /** 2.50 * Programmatic interface. 2.51 * @param programName Name of the program (for error messages). 2.52 + * @param defaultDocletClassName Fully qualified class name. 2.53 + * @param docletParentClassLoader The parent class loader used when 2.54 + * creating the doclet classloader. If null, the class loader used 2.55 + * to instantiate doclets will be created without specifying a parent 2.56 + * class loader. 2.57 + * @param args The command line parameters. 2.58 + * @return The return code. 2.59 + * @since 1.7 2.60 + */ 2.61 + public static int execute(String programName, 2.62 + String defaultDocletClassName, 2.63 + ClassLoader docletParentClassLoader, 2.64 + String... args) { 2.65 + Start jdoc = new Start(programName, defaultDocletClassName, docletParentClassLoader); 2.66 + return jdoc.begin(args); 2.67 + } 2.68 + 2.69 + /** 2.70 + * Programmatic interface. 2.71 + * @param programName Name of the program (for error messages). 2.72 * @param errWriter PrintWriter to receive error messages. 2.73 * @param warnWriter PrintWriter to receive error messages. 2.74 * @param noticeWriter PrintWriter to receive error messages. 2.75 @@ -105,4 +156,33 @@ 2.76 defaultDocletClassName); 2.77 return jdoc.begin(args); 2.78 } 2.79 + 2.80 + /** 2.81 + * Programmatic interface. 2.82 + * @param programName Name of the program (for error messages). 2.83 + * @param errWriter PrintWriter to receive error messages. 2.84 + * @param warnWriter PrintWriter to receive error messages. 2.85 + * @param noticeWriter PrintWriter to receive error messages. 2.86 + * @param defaultDocletClassName Fully qualified class name. 2.87 + * @param docletParentClassLoader The parent class loader used when 2.88 + * creating the doclet classloader. If null, the class loader used 2.89 + * to instantiate doclets will be created without specifying a parent 2.90 + * class loader. 2.91 + * @param args The command line parameters. 2.92 + * @return The return code. 2.93 + * @since 1.7 2.94 + */ 2.95 + public static int execute(String programName, 2.96 + PrintWriter errWriter, 2.97 + PrintWriter warnWriter, 2.98 + PrintWriter noticeWriter, 2.99 + String defaultDocletClassName, 2.100 + ClassLoader docletParentClassLoader, 2.101 + String... args) { 2.102 + Start jdoc = new Start(programName, 2.103 + errWriter, warnWriter, noticeWriter, 2.104 + defaultDocletClassName, 2.105 + docletParentClassLoader); 2.106 + return jdoc.begin(args); 2.107 + } 2.108 }
3.1 --- a/src/share/classes/com/sun/tools/javadoc/Start.java Sat Oct 04 22:59:05 2008 -0700 3.2 +++ b/src/share/classes/com/sun/tools/javadoc/Start.java Mon Oct 06 16:57:15 2008 -0700 3.3 @@ -54,10 +54,8 @@ 3.4 /** Context for this invocation. */ 3.5 private final Context context; 3.6 3.7 - /** 3.8 - * Name of the program 3.9 - */ 3.10 private final String defaultDocletClassName; 3.11 + private final ClassLoader docletParentClassLoader; 3.12 3.13 private static final String javadocName = "javadoc"; 3.14 3.15 @@ -91,21 +89,45 @@ 3.16 PrintWriter warnWriter, 3.17 PrintWriter noticeWriter, 3.18 String defaultDocletClassName) { 3.19 + this(programName, errWriter, warnWriter, noticeWriter, defaultDocletClassName, null); 3.20 + } 3.21 + 3.22 + Start(String programName, 3.23 + PrintWriter errWriter, 3.24 + PrintWriter warnWriter, 3.25 + PrintWriter noticeWriter, 3.26 + String defaultDocletClassName, 3.27 + ClassLoader docletParentClassLoader) { 3.28 context = new Context(); 3.29 messager = new Messager(context, programName, errWriter, warnWriter, noticeWriter); 3.30 this.defaultDocletClassName = defaultDocletClassName; 3.31 + this.docletParentClassLoader = docletParentClassLoader; 3.32 } 3.33 3.34 Start(String programName, String defaultDocletClassName) { 3.35 + this(programName, defaultDocletClassName, null); 3.36 + } 3.37 + 3.38 + Start(String programName, String defaultDocletClassName, 3.39 + ClassLoader docletParentClassLoader) { 3.40 context = new Context(); 3.41 messager = new Messager(context, programName); 3.42 this.defaultDocletClassName = defaultDocletClassName; 3.43 + this.docletParentClassLoader = docletParentClassLoader; 3.44 + } 3.45 + 3.46 + Start(String programName, ClassLoader docletParentClassLoader) { 3.47 + this(programName, standardDocletClassName, docletParentClassLoader); 3.48 } 3.49 3.50 Start(String programName) { 3.51 this(programName, standardDocletClassName); 3.52 } 3.53 3.54 + Start(ClassLoader docletParentClassLoader) { 3.55 + this(javadocName, docletParentClassLoader); 3.56 + } 3.57 + 3.58 Start() { 3.59 this(javadocName); 3.60 } 3.61 @@ -390,7 +412,8 @@ 3.62 3.63 // attempt to find doclet 3.64 docletInvoker = new DocletInvoker(messager, 3.65 - docletClassName, docletPath); 3.66 + docletClassName, docletPath, 3.67 + docletParentClassLoader); 3.68 } 3.69 3.70 private void setFilter(long filterBits) {