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;