Mercurial > hg > icedtea8-forest > langtools
changeset 1079:f74e4269a50a
6575445: Update annotation processor to only use java.util.ServiceLoader
Reviewed-by: jjg
author | darcy |
---|---|
date | Fri, 24 Jun 2011 13:52:14 -0700 |
parents | 9eb36cac6b64 |
children | 858ae8fec72f |
files | src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java src/share/classes/com/sun/tools/javac/resources/compiler.properties test/tools/javac/diags/examples.not-yet.txt |
diffstat | 3 files changed, 19 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Jun 23 17:30:49 2011 -0700 +++ b/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jun 24 13:52:14 2011 -0700 @@ -295,59 +295,24 @@ /** * Use a service loader appropriate for the platform to provide an - * iterator over annotations processors. If - * java.util.ServiceLoader is present use it, otherwise, use - * sun.misc.Service, otherwise fail if a loader is needed. + * iterator over annotations processors; fails if a loader is + * needed but unavailable. */ private class ServiceIterator implements Iterator<Processor> { - // The to-be-wrapped iterator. - private Iterator<?> iterator; + private Iterator<Processor> iterator; private Log log; - private Class<?> loaderClass; - private boolean jusl; - private Object loader; + private ServiceLoader<Processor> loader; ServiceIterator(ClassLoader classLoader, Log log) { - String loadMethodName; - this.log = log; try { try { - loaderClass = Class.forName("java.util.ServiceLoader"); - loadMethodName = "load"; - jusl = true; - } catch (ClassNotFoundException cnfe) { - try { - loaderClass = Class.forName("sun.misc.Service"); - loadMethodName = "providers"; - jusl = false; - } catch (ClassNotFoundException cnfe2) { - // Fail softly if a loader is not actually needed. - this.iterator = handleServiceLoaderUnavailability("proc.no.service", - null); - return; - } + loader = ServiceLoader.load(Processor.class, classLoader); + this.iterator = loader.iterator(); + } catch (Exception e) { + // Fail softly if a loader is not actually needed. + this.iterator = handleServiceLoaderUnavailability("proc.no.service", null); } - - // java.util.ServiceLoader.load or sun.misc.Service.providers - Method loadMethod = loaderClass.getMethod(loadMethodName, - Class.class, - ClassLoader.class); - - Object result = loadMethod.invoke(null, - Processor.class, - classLoader); - - // For java.util.ServiceLoader, we have to call another - // method to get the iterator. - if (jusl) { - loader = result; // Store ServiceLoader to call reload later - Method m = loaderClass.getMethod("iterator"); - result = m.invoke(result); // serviceLoader.iterator(); - } - - // The result should now be an iterator. - this.iterator = (Iterator<?>) result; } catch (Throwable t) { log.error("proc.service.problem"); throw new Abort(t); @@ -357,25 +322,21 @@ public boolean hasNext() { try { return iterator.hasNext(); + } catch(ServiceConfigurationError sce) { + log.error("proc.bad.config.file", sce.getLocalizedMessage()); + throw new Abort(sce); } catch (Throwable t) { - if ("ServiceConfigurationError". - equals(t.getClass().getSimpleName())) { - log.error("proc.bad.config.file", t.getLocalizedMessage()); - } throw new Abort(t); } } public Processor next() { try { - return (Processor)(iterator.next()); + return iterator.next(); + } catch (ServiceConfigurationError sce) { + log.error("proc.bad.config.file", sce.getLocalizedMessage()); + throw new Abort(sce); } catch (Throwable t) { - if ("ServiceConfigurationError". - equals(t.getClass().getSimpleName())) { - log.error("proc.bad.config.file", t.getLocalizedMessage()); - } else { - log.error("proc.processor.constructor.error", t.getLocalizedMessage()); - } throw new Abort(t); } } @@ -385,11 +346,9 @@ } public void close() { - if (jusl) { + if (loader != null) { try { - // Call java.util.ServiceLoader.reload - Method reloadMethod = loaderClass.getMethod("reload"); - reloadMethod.invoke(loader); + loader.reload(); } catch(Exception e) { ; // Ignore problems during a call to reload. }
--- a/src/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Jun 23 17:30:49 2011 -0700 +++ b/src/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Jun 24 13:52:14 2011 -0700 @@ -637,8 +637,7 @@ Class names, ''{0}'', are only accepted if annotation processing is explicitly requested compiler.err.proc.no.service=\ - A service loader class could not be found.\n\ - Either java.util.ServiceLoader or sun.misc.Service must be available. + A ServiceLoader was not usable and is required for annotation processing. compiler.err.proc.processor.bad.option.name=\ Bad option name ''{0}'' provided by processor ''{1}'' @@ -647,9 +646,6 @@ compiler.err.proc.processor.cant.instantiate=\ Could not instantiate an instance of processor ''{0}'' -compiler.err.proc.processor.constructor.error=\ - Exception thrown while constructing Processor object: {0} - # 0: string compiler.err.proc.processor.not.found=\ Annotation processor ''{0}'' not found
--- a/test/tools/javac/diags/examples.not-yet.txt Thu Jun 23 17:30:49 2011 -0700 +++ b/test/tools/javac/diags/examples.not-yet.txt Fri Jun 24 13:52:14 2011 -0700 @@ -31,7 +31,6 @@ compiler.err.proc.cant.create.loader # security exception from service loader compiler.err.proc.no.service # JavacProcessingEnvironment: no service loader available compiler.err.proc.processor.bad.option.name # cannot happen? masked by javac.err.invalid.A.key -compiler.err.proc.processor.constructor.error compiler.err.proc.service.problem # JavacProcessingEnvironment: catch Throwable from service loader compiler.err.signature.doesnt.match.intf # UNUSED compiler.err.signature.doesnt.match.supertype # UNUSED