Mercurial > hg > release > icedtea7-forest-2.1 > langtools
changeset 128:944790f83b57
6748546: javadoc API should be classloader-friendly
Reviewed-by: bpatel
author | jjg |
---|---|
date | Mon, 06 Oct 2008 16:57:15 -0700 |
parents | 539eb80f2a1a |
children | 3fd42dfa6f27 a54ef8459576 |
files | src/share/classes/com/sun/tools/javadoc/DocletInvoker.java src/share/classes/com/sun/tools/javadoc/Main.java src/share/classes/com/sun/tools/javadoc/Start.java |
diffstat | 3 files changed, 113 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Sat Oct 04 22:59:05 2008 -0700 +++ b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Mon Oct 06 16:57:15 2008 -0700 @@ -32,7 +32,6 @@ import com.sun.tools.javac.util.List; import java.net.*; -import java.lang.OutOfMemoryError; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.InvocationTargetException; @@ -70,7 +69,8 @@ } public DocletInvoker(Messager messager, - String docletClassName, String docletPath) { + String docletClassName, String docletPath, + ClassLoader docletParentClassLoader) { this.messager = messager; this.docletClassName = docletClassName; @@ -82,7 +82,10 @@ cpString = appendPath(System.getProperty("java.class.path"), cpString); cpString = appendPath(docletPath, cpString); URL[] urls = pathToURLs(cpString); - appClassLoader = new URLClassLoader(urls); + if (docletParentClassLoader == null) + appClassLoader = new URLClassLoader(urls); + else + appClassLoader = new URLClassLoader(urls, docletParentClassLoader); // attempt to find doclet Class dc = null;
--- a/src/share/classes/com/sun/tools/javadoc/Main.java Sat Oct 04 22:59:05 2008 -0700 +++ b/src/share/classes/com/sun/tools/javadoc/Main.java Mon Oct 06 16:57:15 2008 -0700 @@ -61,6 +61,21 @@ /** * Programmatic interface. + * @param args The command line parameters. + * @param docletParentClassLoader The parent class loader used when + * creating the doclet classloader. If null, the class loader used + * to instantiate doclets will be created without specifying a parent + * class loader. + * @return The return code. + * @since 1.7 + */ + public static int execute(ClassLoader docletParentClassLoader, String... args) { + Start jdoc = new Start(docletParentClassLoader); + return jdoc.begin(args); + } + + /** + * Programmatic interface. * @param programName Name of the program (for error messages). * @param args The command line parameters. * @return The return code. @@ -73,6 +88,22 @@ /** * Programmatic interface. * @param programName Name of the program (for error messages). + * @param args The command line parameters. + * @param docletParentClassLoader The parent class loader used when + * creating the doclet classloader. If null, the class loader used + * to instantiate doclets will be created without specifying a parent + * class loader. + * @return The return code. + * @since 1.7 + */ + public static int execute(String programName, ClassLoader docletParentClassLoader, String... args) { + Start jdoc = new Start(programName, docletParentClassLoader); + return jdoc.begin(args); + } + + /** + * Programmatic interface. + * @param programName Name of the program (for error messages). * @param defaultDocletClassName Fully qualified class name. * @param args The command line parameters. * @return The return code. @@ -87,6 +118,26 @@ /** * Programmatic interface. * @param programName Name of the program (for error messages). + * @param defaultDocletClassName Fully qualified class name. + * @param docletParentClassLoader The parent class loader used when + * creating the doclet classloader. If null, the class loader used + * to instantiate doclets will be created without specifying a parent + * class loader. + * @param args The command line parameters. + * @return The return code. + * @since 1.7 + */ + public static int execute(String programName, + String defaultDocletClassName, + ClassLoader docletParentClassLoader, + String... args) { + Start jdoc = new Start(programName, defaultDocletClassName, docletParentClassLoader); + return jdoc.begin(args); + } + + /** + * Programmatic interface. + * @param programName Name of the program (for error messages). * @param errWriter PrintWriter to receive error messages. * @param warnWriter PrintWriter to receive error messages. * @param noticeWriter PrintWriter to receive error messages. @@ -105,4 +156,33 @@ defaultDocletClassName); return jdoc.begin(args); } + + /** + * Programmatic interface. + * @param programName Name of the program (for error messages). + * @param errWriter PrintWriter to receive error messages. + * @param warnWriter PrintWriter to receive error messages. + * @param noticeWriter PrintWriter to receive error messages. + * @param defaultDocletClassName Fully qualified class name. + * @param docletParentClassLoader The parent class loader used when + * creating the doclet classloader. If null, the class loader used + * to instantiate doclets will be created without specifying a parent + * class loader. + * @param args The command line parameters. + * @return The return code. + * @since 1.7 + */ + public static int execute(String programName, + PrintWriter errWriter, + PrintWriter warnWriter, + PrintWriter noticeWriter, + String defaultDocletClassName, + ClassLoader docletParentClassLoader, + String... args) { + Start jdoc = new Start(programName, + errWriter, warnWriter, noticeWriter, + defaultDocletClassName, + docletParentClassLoader); + return jdoc.begin(args); + } }
--- a/src/share/classes/com/sun/tools/javadoc/Start.java Sat Oct 04 22:59:05 2008 -0700 +++ b/src/share/classes/com/sun/tools/javadoc/Start.java Mon Oct 06 16:57:15 2008 -0700 @@ -54,10 +54,8 @@ /** Context for this invocation. */ private final Context context; - /** - * Name of the program - */ private final String defaultDocletClassName; + private final ClassLoader docletParentClassLoader; private static final String javadocName = "javadoc"; @@ -91,21 +89,45 @@ PrintWriter warnWriter, PrintWriter noticeWriter, String defaultDocletClassName) { + this(programName, errWriter, warnWriter, noticeWriter, defaultDocletClassName, null); + } + + Start(String programName, + PrintWriter errWriter, + PrintWriter warnWriter, + PrintWriter noticeWriter, + String defaultDocletClassName, + ClassLoader docletParentClassLoader) { context = new Context(); messager = new Messager(context, programName, errWriter, warnWriter, noticeWriter); this.defaultDocletClassName = defaultDocletClassName; + this.docletParentClassLoader = docletParentClassLoader; } Start(String programName, String defaultDocletClassName) { + this(programName, defaultDocletClassName, null); + } + + Start(String programName, String defaultDocletClassName, + ClassLoader docletParentClassLoader) { context = new Context(); messager = new Messager(context, programName); this.defaultDocletClassName = defaultDocletClassName; + this.docletParentClassLoader = docletParentClassLoader; + } + + Start(String programName, ClassLoader docletParentClassLoader) { + this(programName, standardDocletClassName, docletParentClassLoader); } Start(String programName) { this(programName, standardDocletClassName); } + Start(ClassLoader docletParentClassLoader) { + this(javadocName, docletParentClassLoader); + } + Start() { this(javadocName); } @@ -390,7 +412,8 @@ // attempt to find doclet docletInvoker = new DocletInvoker(messager, - docletClassName, docletPath); + docletClassName, docletPath, + docletParentClassLoader); } private void setFilter(long filterBits) {