FELIX-3550 : Reimplement the SCR Generator

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1355921 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/annotations/src/main/java/org/apache/felix/scrplugin/processing/SCRAnnotationProcessor.java b/scrplugin/annotations/src/main/java/org/apache/felix/scrplugin/processing/SCRAnnotationProcessor.java
index 8c28538..e9b8aac 100644
--- a/scrplugin/annotations/src/main/java/org/apache/felix/scrplugin/processing/SCRAnnotationProcessor.java
+++ b/scrplugin/annotations/src/main/java/org/apache/felix/scrplugin/processing/SCRAnnotationProcessor.java
@@ -32,6 +32,7 @@
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.References;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.felix.scr.annotations.Services;
 import org.apache.felix.scrplugin.SCRDescriptorException;
@@ -132,6 +133,16 @@
             describedClass.add(createService(allServiceTags, scannedClass));
         }
 
+        // references - class level
+        final List<ClassAnnotation> referencesClassTags = scannedClass.getClassAnnotations(References.class.getName());
+        scannedClass.processed(referencesClassTags);
+        for (final ClassAnnotation cad : referencesClassTags) {
+            final ClassAnnotation[] values = (ClassAnnotation[]) cad.getValue("value");
+            if (values != null) {
+                createReferences(Arrays.asList(values), describedClass);
+            }
+        }
+
         // reference - class level
         final List<ClassAnnotation> refClassTags = scannedClass.getClassAnnotations(Reference.class.getName());
         scannedClass.processed(refClassTags);
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
index 3ef92df..0b01981 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
@@ -28,6 +28,7 @@
 
 import org.apache.felix.scrplugin.annotations.AnnotationProcessor;
 import org.apache.felix.scrplugin.description.ClassDescription;
+import org.apache.felix.scrplugin.description.ComponentConfigurationPolicy;
 import org.apache.felix.scrplugin.description.ComponentDescription;
 import org.apache.felix.scrplugin.description.PropertyDescription;
 import org.apache.felix.scrplugin.description.PropertyType;
@@ -405,6 +406,10 @@
                     // spec version must be at least 1.1
                     componentDesc.setSpecVersion(SpecVersion.VERSION_1_1);
                 }
+                if ( componentDesc.getConfigurationPolicy() != ComponentConfigurationPolicy.OPTIONAL ) {
+                    // policy requires 1.1
+                    componentDesc.setSpecVersion(SpecVersion.VERSION_1_1);
+                }
             }
 
             // services, properties, references
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java
index 7b656f6..91e4e50 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java
@@ -157,7 +157,7 @@
      */
     private ClassDescription processClass(final Class<?> annotatedClass, final String location)
     throws SCRDescriptorFailureException, SCRDescriptorException {
-        log.info("Scanning " + annotatedClass.getName());
+        log.debug("Processing " + annotatedClass.getName());
         try {
             // get the class file for ASM
             final String pathToClassFile = annotatedClass.getName().replace('.', '/') + ".class";
@@ -172,11 +172,11 @@
             classReader.accept(classNode, SKIP_CODE | SKIP_DEBUG | SKIP_FRAMES);
 
             // create descriptions
-            final List<ScannedAnnotation> descriptions = extractAnnotation(classNode, annotatedClass);
-            if (descriptions.size() > 0) {
-                // process descriptions
+            final List<ScannedAnnotation> annotations = extractAnnotation(classNode, annotatedClass);
+            if (annotations.size() > 0) {
+                // process annotations and create descriptions
                 final ClassDescription desc = new ClassDescription(annotatedClass, location);
-                aProcessor.process(new ScannedClass(descriptions, annotatedClass), desc);
+                aProcessor.process(new ScannedClass(annotations, annotatedClass), desc);
 
                 log.debug("Found descriptions " + desc + " in " + annotatedClass.getName());
                 return desc;