changeset 8998:d2c34ddac70f

Merge.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 11 Apr 2013 10:39:03 +0200
parents 508ae1a5cada (diff) 6d86ce1297bc (current diff)
children eae432b7c462 9f3a77848ea2
files graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java
diffstat 2 files changed, 43 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 20:43:15 2013 -0700
+++ b/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java	Thu Apr 11 10:39:03 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 20:43:15 2013 -0700
+++ b/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java	Thu Apr 11 10:39:03 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,57 @@
         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();
+                servicesFile.delete();
+            } 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;
     }
 }