FELIX-1419 : Add support for nested/inner classes in SCR Plugins (QDox+Annotations). Apply patch from Stefan Seifert

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@818375 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
index d6480ee..99c06eb 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
@@ -388,10 +388,10 @@
      * @return All contained java class descriptions.
      */
     public JavaClassDescription[] getSourceDescriptions() throws MojoExecutionException {
-        final JavaClassDescription[] descs = new JavaClassDescription[this.sources.length];
-        for(int i=0; i<this.sources.length; i++) {
-            final String className = this.sources[i].getClasses()[0].getFullyQualifiedName();
-            descs[i] = this.getJavaClassDescription(className);
+        final JavaClass[] javaClasses = getJavaClassesFromSources();
+        final JavaClassDescription[] descs = new JavaClassDescription[javaClasses.length];
+        for(int i=0; i<javaClasses.length; i++) {
+            descs[i] = this.getJavaClassDescription(javaClasses[i].getFullyQualifiedName());
         }
         return descs;
     }
@@ -408,18 +408,19 @@
         if ( result == null ) {
             this.log.debug("Searching description for: " + className);
             int index = 0;
-            while ( result == null && index < this.sources.length) {
-                final JavaClass javaClass = this.sources[index].getClasses()[0];
+            final JavaClass[] javaClasses = getJavaClassesFromSources();
+            while ( result == null && index < javaClasses.length) {
+                final JavaClass javaClass = javaClasses[index];
                 if ( javaClass.getFullyQualifiedName().equals(className) ) {
                     try {
                         // check for java annotation descriptions - fallback to QDox if none found
                         Class<?> clazz = this.classloader.loadClass(className);
                         if (this.processAnnotations && getAnnotationTagProviderManager().hasScrPluginAnnotation(javaClass)) {
                             this.log.debug("Found java annotation description for: " + className);
-                            result = new AnnotationJavaClassDescription(clazz, this.sources[index], this);
+                            result = new AnnotationJavaClassDescription(clazz, javaClasses[index], this);
                         } else if ( this.parseJavadocs ) {
                             this.log.debug("Found qdox description for: " + className);
-                            result = new QDoxJavaClassDescription(clazz, this.sources[index], this);
+                            result = new QDoxJavaClassDescription(clazz, javaClasses[index], this);
                         }
                     } catch (ClassNotFoundException e) {
                         throw new MojoExecutionException("Unable to load class " + className);
@@ -440,4 +441,24 @@
         }
         return result;
     }
+    
+    /**
+     * Get a list of all {@link JavaClass} definitions four all source files (including nested/inner classes)
+     * @return List of {@link JavaClass} definitions
+     */
+    private JavaClass[] getJavaClassesFromSources() {
+        final List<JavaClass> classes = new ArrayList<JavaClass>();
+        for(int i=0; i<this.sources.length; i++) {
+            for(int j=0; j<this.sources[i].getClasses().length; j++) {
+                final JavaClass clazz = this.sources[i].getClasses()[j];
+                classes.add(clazz);
+                for (int k=0; k<clazz.getNestedClasses().length; k++) {
+                    final JavaClass nestedClass = clazz.getNestedClasses()[k];
+                    classes.add(nestedClass);
+                }
+            }
+        }
+        return classes.toArray(new JavaClass[classes.size()]);
+    }
+    
 }
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationJavaClassDescription.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationJavaClassDescription.java
index 334e9a7..1cf785d 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationJavaClassDescription.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationJavaClassDescription.java
@@ -24,7 +24,7 @@
 import org.apache.felix.scrplugin.tags.qdox.QDoxJavaClassDescription;
 import org.apache.maven.plugin.MojoExecutionException;
 
-import com.thoughtworks.qdox.model.JavaSource;
+import com.thoughtworks.qdox.model.JavaClass;
 
 /**
  * Reading class description based on java annotations. This extends
@@ -38,8 +38,8 @@
      * @param source QDox source
      * @param manager description manager
      */
-    public AnnotationJavaClassDescription(Class<?> clazz, JavaSource source, JavaClassDescriptorManager manager) {
-        super(clazz, source, manager);
+    public AnnotationJavaClassDescription(Class<?> clazz, JavaClass javaClass, JavaClassDescriptorManager manager) {
+        super(clazz, javaClass, manager);
     }
 
     /**
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/qdox/QDoxJavaClassDescription.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/qdox/QDoxJavaClassDescription.java
index ee9a049..8a9c221 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/qdox/QDoxJavaClassDescription.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/qdox/QDoxJavaClassDescription.java
@@ -43,15 +43,12 @@
 
     protected final JavaClassDescriptorManager manager;
 
-    protected final JavaSource source;
-
     /** The compiled class. */
     protected final Class<?> clazz;
 
-    public QDoxJavaClassDescription(Class<?> clazz, JavaSource source, JavaClassDescriptorManager m) {
-        this.javaClass = source.getClasses()[0];
+    public QDoxJavaClassDescription(Class<?> clazz, JavaClass javaClass, JavaClassDescriptorManager m) {
+        this.javaClass = javaClass;
         this.manager = m;
-        this.source = source;
         this.clazz = clazz;
     }