6748546: javadoc API should be classloader-friendly

Mon, 06 Oct 2008 16:57:15 -0700

author
jjg
date
Mon, 06 Oct 2008 16:57:15 -0700
changeset 129
944790f83b57
parent 128
539eb80f2a1a
child 130
3fd42dfa6f27
child 132
a54ef8459576

6748546: javadoc API should be classloader-friendly
Reviewed-by: bpatel

src/share/classes/com/sun/tools/javadoc/DocletInvoker.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/tools/javadoc/Main.java file | annotate | diff | comparison | revisions
src/share/classes/com/sun/tools/javadoc/Start.java file | annotate | diff | comparison | revisions
     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) {

mercurial