Mercurial > hg > truffle
changeset 8997:508ae1a5cada
Fix ServiceProviderProcessor to support multiple providers in the same project.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Wed, 10 Apr 2013 17:12:02 +0200 |
parents | 1c77db9ba064 |
children | d2c34ddac70f |
files | graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java |
diffstat | 2 files changed, 42 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java Wed Apr 10 16:25:47 2013 +0200 +++ b/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java Wed Apr 10 17:12:02 2013 +0200 @@ -24,7 +24,7 @@ import java.lang.annotation.*; -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface ServiceProvider {
--- a/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Wed Apr 10 16:25:47 2013 +0200 +++ b/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Wed Apr 10 17:12:02 2013 +0200 @@ -29,6 +29,7 @@ import javax.lang.model.*; import javax.lang.model.element.*; import javax.lang.model.type.*; +import javax.lang.model.util.*; import javax.tools.Diagnostic.Kind; import javax.tools.*; @@ -81,27 +82,56 @@ return true; } + private void processElement(TypeElement serviceProvider) { + ServiceProvider annotation = serviceProvider.getAnnotation(ServiceProvider.class); + if (annotation != null) { + try { + annotation.value(); + } catch (MirroredTypeException ex) { + TypeMirror serviceInterface = ex.getTypeMirror(); + if (verifyAnnotation(serviceInterface, serviceProvider)) { + String interfaceName = ex.getTypeMirror().toString(); + addProvider(interfaceName, serviceProvider); + } + } + } + } + + private void processOldElements() { + Filer filer = processingEnv.getFiler(); + Elements elements = processingEnv.getElementUtils(); + for (String key : serviceMap.keySet()) { + String filename = "META-INF/services/" + key; + try { + FileObject servicesFile = filer.getResource(StandardLocation.CLASS_OUTPUT, "", filename); + BufferedReader reader = new BufferedReader(new InputStreamReader(servicesFile.openInputStream(), "UTF-8")); + String line; + while ((line = reader.readLine()) != null) { + TypeElement serviceProvider = elements.getTypeElement(line); + if (serviceProvider != null) { + processElement(serviceProvider); + } + } + reader.close(); + } catch (IOException e) { + // old services file not found: do nothing + } + } + } + @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { + processOldElements(); generateServicesFiles(); return true; } for (Element element : roundEnv.getElementsAnnotatedWith(ServiceProvider.class)) { assert element.getKind().isClass(); - ServiceProvider annotation = element.getAnnotation(ServiceProvider.class); - try { - annotation.value(); - } catch (MirroredTypeException ex) { - TypeMirror serviceInterface = ex.getTypeMirror(); - TypeElement serviceProvider = (TypeElement) element; - if (verifyAnnotation(serviceInterface, serviceProvider)) { - String interfaceName = ex.getTypeMirror().toString(); - addProvider(interfaceName, serviceProvider); - } - } + processElement((TypeElement) element); } + return true; } }