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;
}