src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java

Print this page

        

*** 293,397 **** } } /** * 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. */ private class ServiceIterator implements Iterator<Processor> { ! // The to-be-wrapped iterator. ! private Iterator<?> iterator; private Log log; ! private Class<?> loaderClass; ! private boolean jusl; ! private Object 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; ! } } - - // 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); } } public boolean hasNext() { try { return iterator.hasNext(); } 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()); } 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); } } public void remove() { throw new UnsupportedOperationException(); } public void close() { ! if (jusl) { try { ! // Call java.util.ServiceLoader.reload ! Method reloadMethod = loaderClass.getMethod("reload"); ! reloadMethod.invoke(loader); } catch(Exception e) { ; // Ignore problems during a call to reload. } } } --- 293,356 ---- } } /** * Use a service loader appropriate for the platform to provide an ! * iterator over annotations processors; fails if a loader is ! * needed but unavailable. */ private class ServiceIterator implements Iterator<Processor> { ! private Iterator<Processor> iterator; private Log log; ! private ServiceLoader<Processor> loader; ServiceIterator(ClassLoader classLoader, Log log) { this.log = log; try { try { ! 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); } } catch (Throwable t) { log.error("proc.service.problem"); throw new Abort(t); } } 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) { throw new Abort(t); } } public Processor next() { try { ! return iterator.next(); ! } catch (ServiceConfigurationError sce) { ! log.error("proc.bad.config.file", sce.getLocalizedMessage()); ! throw new Abort(sce); } catch (Throwable t) { throw new Abort(t); } } public void remove() { throw new UnsupportedOperationException(); } public void close() { ! if (loader != null) { try { ! loader.reload(); } catch(Exception e) { ; // Ignore problems during a call to reload. } } }