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<? extends Processor> 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<? extends Processor> 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<? extends Processor> processors) {
Log log = Log.instance(context);
Iterator<? extends Processor> 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";
}