FELIX-3550 : Reimplement the SCR Generator

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1355894 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 7d8346b..8c28538 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
@@ -205,7 +205,7 @@
         // FELIX-593: immediate attribute does not default to true all the
         // times hence we only set it if declared in the tag
         if (cad.getValue("immediate") != null) {
-            component.setEnabled(cad.getBooleanValue("immediate", false));
+            component.setImmediate(cad.getBooleanValue("immediate", false));
         }
         component.setInherit(cad.getBooleanValue("inherit", true));
         component.setConfigurationPolicy(ComponentConfigurationPolicy.valueOf(cad.getEnumValue("policy",
diff --git a/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
index 9adcbca..da8e7fd 100644
--- a/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
+++ b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
@@ -162,7 +162,7 @@
 
         // immediate
         if (cad.getValue("immediate") != null) {
-            component.setEnabled(cad.getBooleanValue("immediate", false));
+            component.setImmediate(cad.getBooleanValue("immediate", false));
         }
 
         // property
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 ed07973..3ef92df 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
@@ -426,7 +426,7 @@
                     iLog.addError(sde.getMessage(), sde.getSourceLocation());
                 }
             }
-        } while ( inherit && current != null);
+        } while ( current != null);
 
         // PID handling
         if ( componentDesc.isCreatePid() && !container.getProperties().containsKey(org.osgi.framework.Constants.SERVICE_PID)) {
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 f2dcebc..7b656f6 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
@@ -136,9 +136,12 @@
                 final Class<?> annotatedClass = project.getClassLoader().loadClass(src.getClassName());
 
                 final ClassDescription desc = this.processClass(annotatedClass, src.getFile().toString());
-                if (desc != null) {
-                    result.add(desc);
+                if ( desc != null ) {
                     this.allDescriptions.put(annotatedClass.getName(), desc);
+                    if ( desc.getDescriptions(ComponentDescription.class).size() > 0) {
+                        result.add(desc);
+                        log.debug("Found component description " + desc + " in " + annotatedClass.getName());
+                    }
                 } else {
                     this.allDescriptions.put(annotatedClass.getName(), new ClassDescription(annotatedClass, GENERATED));
                 }
@@ -154,6 +157,7 @@
      */
     private ClassDescription processClass(final Class<?> annotatedClass, final String location)
     throws SCRDescriptorFailureException, SCRDescriptorException {
+        log.info("Scanning " + annotatedClass.getName());
         try {
             // get the class file for ASM
             final String pathToClassFile = annotatedClass.getName().replace('.', '/') + ".class";
@@ -174,10 +178,8 @@
                 final ClassDescription desc = new ClassDescription(annotatedClass, location);
                 aProcessor.process(new ScannedClass(descriptions, annotatedClass), desc);
 
-                if (desc.getDescriptions(ComponentDescription.class).size() > 0) {
-                    log.debug("Found component description " + desc + " in " + annotatedClass.getName());
-                    return desc;
-                }
+                log.debug("Found descriptions " + desc + " in " + annotatedClass.getName());
+                return desc;
             }
         } catch (final IOException ioe) {
             throw new SCRDescriptorFailureException("Unable to scan class files: " + annotatedClass.getName(), ioe);
@@ -394,18 +396,7 @@
                     try {
                         scrInfoFile = this.getFile( artifact, ABSTRACT_DESCRIPTOR_ARCHIV_PATH );
                         if ( scrInfoFile != null ) {
-                            final List<ClassDescription> c =  this.parseServiceComponentDescriptor( scrInfoFile, artifact.toString() + ':' + ABSTRACT_DESCRIPTOR_ARCHIV_PATH);
-                            if ( c != null ) {
-                                for(final ClassDescription cd : c) {
-                                    final String name;
-                                    if ( cd.getDescribedClass() == null ) {
-                                        name = cd.getDescription(ComponentDescription.class).getName();
-                                    } else {
-                                        name = cd.getDescribedClass().getName();
-                                    }
-                                    loadedDependencies.put(name, cd);
-                                }
-                            }
+                            this.readServiceComponentDescriptor( scrInfoFile, artifact.toString() + ':' + ABSTRACT_DESCRIPTOR_ARCHIV_PATH);
                             continue;
                         }
                         this.log.debug( "Artifact has no scrinfo file (it's optional): " + artifact );
@@ -429,18 +420,7 @@
                             while ( st.hasMoreTokens() ) {
                                 final String entry = st.nextToken().trim();
                                 if ( entry.length() > 0 ) {
-                                    final List<ClassDescription> c = this.readServiceComponentDescriptor( artifact, entry );
-                                    if ( c != null ) {
-                                        for(final ClassDescription cd : c) {
-                                            final String name;
-                                            if ( cd.getDescribedClass() == null ) {
-                                                name = cd.getDescription(ComponentDescription.class).getName();
-                                            } else {
-                                                name = cd.getDescribedClass().getName();
-                                            }
-                                            loadedDependencies.put(name, cd);
-                                        }
-                                    }
+                                    this.readServiceComponentDescriptor( artifact, entry );
                                 }
                             }
                         } else {
@@ -467,10 +447,22 @@
      * @throws SCRDescriptorException If an error occurrs reading the
      *             descriptors from the stream.
      */
-    private List<ClassDescription> parseServiceComponentDescriptor(
+    private void readServiceComponentDescriptor(
                     final InputStream file, final String location )
     throws SCRDescriptorException {
-        return ComponentDescriptorIO.read( file, this.project.getClassLoader(), iLog, location );
+        final List<ClassDescription> list = ComponentDescriptorIO.read( file, this.project.getClassLoader(), iLog, location );
+        if ( list != null ) {
+            for(final ClassDescription cd : list) {
+                final String name;
+                if ( cd.getDescribedClass() == null ) {
+                    name = cd.getDescription(ComponentDescription.class).getName();
+                } else {
+                    name = cd.getDescribedClass().getName();
+                }
+                loadedDependencies.put(name, cd);
+            }
+        }
+
     }
 
     /**
@@ -481,7 +473,7 @@
      * @throws IOException
      * @throws SCRDescriptorException
      */
-    private List<ClassDescription> readServiceComponentDescriptor( final File artifactFile, String entry ) {
+    private void readServiceComponentDescriptor( final File artifactFile, String entry ) {
         this.log.debug( "Reading " + entry + " from " + artifactFile );
         InputStream xml = null;
         try {
@@ -489,7 +481,7 @@
             if ( xml == null ) {
                 throw new SCRDescriptorException( "Entry " + entry + " not contained in JAR File ", artifactFile.toString());
             }
-            return this.parseServiceComponentDescriptor( xml, artifactFile.toString() + ':' + entry );
+            this.readServiceComponentDescriptor( xml, artifactFile.toString() + ':' + entry );
         } catch ( final IOException mee ) {
             this.log.warn( "Unable to read SCR descriptor file from JAR File " + artifactFile + " at " + entry );
             this.log.debug( "Exception occurred during reading: " + mee.getMessage(), mee );
@@ -501,8 +493,6 @@
                 try { xml.close(); } catch (final IOException ignore) {}
             }
         }
-
-        return null;
     }