diff -r 86d8d242b0c4 -r aa687b312c97 langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Sat Nov 17 19:01:03 2012 +0000 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Mon Nov 19 11:38:49 2012 -0800 @@ -145,6 +145,7 @@ Source source; private ClassLoader processorClassLoader; + private SecurityException processorClassLoaderException; /** * JavacMessages object used for localization @@ -155,7 +156,15 @@ private Context context; - public JavacProcessingEnvironment(Context context, Iterable processors) { + /** Get the JavacProcessingEnvironment instance for this context. */ + public static JavacProcessingEnvironment instance(Context context) { + JavacProcessingEnvironment instance = context.get(JavacProcessingEnvironment.class); + if (instance == null) + instance = new JavacProcessingEnvironment(context); + return instance; + } + + protected JavacProcessingEnvironment(Context context) { this.context = context; log = Log.instance(context); source = Source.instance(context); @@ -184,6 +193,11 @@ unmatchedProcessorOptions = initUnmatchedProcessorOptions(); messages = JavacMessages.instance(context); taskListener = MultiTaskListener.instance(context); + initProcessorClassLoader(); + } + + public void setProcessors(Iterable processors) { + Assert.checkNull(discoveredProcs); initProcessorIterator(context, processors); } @@ -199,6 +213,23 @@ return Collections.unmodifiableSet(platformAnnotations); } + private void initProcessorClassLoader() { + JavaFileManager fileManager = context.get(JavaFileManager.class); + try { + // If processorpath is not explicitly set, use the classpath. + processorClassLoader = fileManager.hasLocation(ANNOTATION_PROCESSOR_PATH) + ? fileManager.getClassLoader(ANNOTATION_PROCESSOR_PATH) + : fileManager.getClassLoader(CLASS_PATH); + + if (processorClassLoader != null && processorClassLoader instanceof Closeable) { + JavaCompiler compiler = JavaCompiler.instance(context); + compiler.closeables = compiler.closeables.prepend((Closeable) processorClassLoader); + } + } catch (SecurityException e) { + processorClassLoaderException = e; + } + } + private void initProcessorIterator(Context context, Iterable processors) { Log log = Log.instance(context); Iterator processorIterator; @@ -217,18 +248,7 @@ processorIterator = processors.iterator(); } else { String processorNames = options.get(PROCESSOR); - JavaFileManager fileManager = context.get(JavaFileManager.class); - try { - // If processorpath is not explicitly set, use the classpath. - processorClassLoader = fileManager.hasLocation(ANNOTATION_PROCESSOR_PATH) - ? fileManager.getClassLoader(ANNOTATION_PROCESSOR_PATH) - : fileManager.getClassLoader(CLASS_PATH); - - if (processorClassLoader != null && processorClassLoader instanceof Closeable) { - JavaCompiler compiler = JavaCompiler.instance(context); - compiler.closeables = compiler.closeables.prepend((Closeable) processorClassLoader); - } - + if (processorClassLoaderException == null) { /* * If the "-processor" option is used, search the appropriate * path for the named class. Otherwise, use a service @@ -239,14 +259,15 @@ } else { processorIterator = new ServiceIterator(processorClassLoader, log); } - } catch (SecurityException e) { + } else { /* * A security exception will occur if we can't create a classloader. * Ignore the exception if, with hindsight, we didn't need it anyway * (i.e. no processor was specified either explicitly, or implicitly, * in service configuration file.) Otherwise, we cannot continue. */ - processorIterator = handleServiceLoaderUnavailability("proc.cant.create.loader", e); + processorIterator = handleServiceLoaderUnavailability("proc.cant.create.loader", + processorClassLoaderException); } } discoveredProcs = new DiscoveredProcessors(processorIterator); @@ -1473,13 +1494,19 @@ } /** - * For internal use only. This method will be - * removed without warning. + * For internal use only. This method may be removed without warning. */ public Context getContext() { return context; } + /** + * For internal use only. This method may be removed without warning. + */ + public ClassLoader getProcessorClassLoader() { + return processorClassLoader; + } + public String toString() { return "javac ProcessingEnvironment"; }