diff --git a/maven-plugin-tools-annotations/pom.xml b/maven-plugin-tools-annotations/pom.xml index 5ac0ecc..0c832fb 100644 --- a/maven-plugin-tools-annotations/pom.xml +++ b/maven-plugin-tools-annotations/pom.xml @@ -71,6 +71,12 @@ asm-commons 3.3.1 + + + com.thoughtworks.qdox + qdox + + diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/JavaAnnotationsMojoDescriptorExtractor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/JavaAnnotationsMojoDescriptorExtractor.java index 0fa534c..235e0d9 100644 --- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/JavaAnnotationsMojoDescriptorExtractor.java +++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/JavaAnnotationsMojoDescriptorExtractor.java @@ -18,6 +18,8 @@ package org.apache.maven.tools.plugin.annotations; * under the License. */ +import com.thoughtworks.qdox.JavaDocBuilder; +import com.thoughtworks.qdox.model.JavaClass; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.descriptor.DuplicateParameterException; import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException; @@ -43,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author Olivier Lamy @@ -76,9 +79,11 @@ public class JavaAnnotationsMojoDescriptorExtractor mojoAnnotationsScannerRequest.setDependencies( request.getProject().getCompileClasspathElements() ); - List mojoAnnotatedClasses = + Map mojoAnnotatedClasses = mojoAnnotationsScanner.scan( mojoAnnotationsScannerRequest ); + JavaClass[] javaClasses = discoverClasses( request ); + return toMojoDescriptors( mojoAnnotatedClasses, request ); } catch ( DependencyResolutionRequiredException e ) @@ -87,6 +92,28 @@ public class JavaAnnotationsMojoDescriptorExtractor } } + protected JavaClass[] discoverClasses( final PluginToolsRequest request ) + { + JavaDocBuilder builder = new JavaDocBuilder(); + builder.setEncoding( request.getEncoding() ); + + MavenProject project = request.getProject(); + + for ( String source : (List) project.getCompileSourceRoots() ) + { + builder.addSourceTree( new File( source ) ); + } + + // TODO be more dynamic + File generatedPlugin = new File( project.getBasedir(), "target/generated-sources/plugin" ); + if ( !project.getCompileSourceRoots().contains( generatedPlugin.getAbsolutePath() ) ) + { + builder.addSourceTree( generatedPlugin ); + } + + return builder.getClasses(); + } + private List toFiles( List directories ) { if ( directories == null ) @@ -101,18 +128,19 @@ public class JavaAnnotationsMojoDescriptorExtractor return files; } - private List toMojoDescriptors( List mojoAnnotatedClasses, + private List toMojoDescriptors( Map mojoAnnotatedClasses, PluginToolsRequest request ) throws DuplicateParameterException { List mojoDescriptors = new ArrayList( mojoAnnotatedClasses.size() ); - for ( MojoAnnotatedClass mojoAnnotatedClass : mojoAnnotatedClasses ) + for ( MojoAnnotatedClass mojoAnnotatedClass : mojoAnnotatedClasses.values() ) { MojoDescriptor mojoDescriptor = new MojoDescriptor(); //mojoDescriptor.setRole( mojoAnnotatedClass.getClassName() ); //mojoDescriptor.setRoleHint( "default" ); mojoDescriptor.setImplementation( mojoAnnotatedClass.getClassName() ); + mojoDescriptor.setLanguage( "java" ); MojoAnnotationContent mojo = mojoAnnotatedClass.getMojo(); @@ -138,7 +166,6 @@ public class JavaAnnotationsMojoDescriptorExtractor mojoDescriptor.setOnlineRequired( mojo.requiresOnline() ); mojoDescriptor.setPhase( mojo.defaultPhase().id() ); - mojoDescriptor.setLanguage( "java" ); for ( ParameterAnnotationContent parameterAnnotationContent : mojoAnnotatedClass.getParameters() ) { diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/DefaultMojoAnnotationsScanner.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/DefaultMojoAnnotationsScanner.java index 0a861aa..ee53ffe 100644 --- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/DefaultMojoAnnotationsScanner.java +++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/DefaultMojoAnnotationsScanner.java @@ -41,7 +41,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -55,22 +55,21 @@ public class DefaultMojoAnnotationsScanner { private Reflector reflector = new Reflector(); - public List scan( MojoAnnotationsScannerRequest request ) + public Map scan( MojoAnnotationsScannerRequest request ) throws ExtractionException { - List mojoAnnotatedClasses = new ArrayList(); + Map mojoAnnotatedClasses = new HashMap(); try { for ( File classDirectory : request.getClassesDirectories() ) { if ( classDirectory.exists() && classDirectory.isDirectory() ) { - mojoAnnotatedClasses.addAll( scanDirectory( classDirectory, request.getIncludePatterns() ) ); + mojoAnnotatedClasses.putAll( scanDirectory( classDirectory, request.getIncludePatterns() ) ); // TODO scan sources to get @since and @deprecated and description of classes and fields. } } - //TODO scan dependencies to get super class annotations if exist request.getDependencies() return mojoAnnotatedClasses; @@ -81,10 +80,10 @@ public class DefaultMojoAnnotationsScanner } } - protected List scanDirectory( File classDirectory, List includePatterns ) + protected Map scanDirectory( File classDirectory, List includePatterns ) throws IOException, ExtractionException { - List mojoAnnotatedClasses = new ArrayList(); + Map mojoAnnotatedClasses = new HashMap(); DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir( classDirectory ); scanner.addDefaultExcludes(); @@ -110,7 +109,8 @@ public class DefaultMojoAnnotationsScanner analyzeVisitors( mojoClassVisitor ); if ( isMojoAnnnotatedClassCandidate( mojoClassVisitor.getMojoAnnotatedClass() ) != null ) { - mojoAnnotatedClasses.add( mojoClassVisitor.getMojoAnnotatedClass() ); + mojoAnnotatedClasses.put( mojoClassVisitor.getMojoAnnotatedClass().getClassName(), + mojoClassVisitor.getMojoAnnotatedClass() ); } } diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/MojoAnnotationsScanner.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/MojoAnnotationsScanner.java index c3a6179..2bf9d9a 100644 --- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/MojoAnnotationsScanner.java +++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/MojoAnnotationsScanner.java @@ -26,6 +26,7 @@ import org.apache.maven.tools.plugin.extractor.ExtractionException; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * @author Olivier Lamy @@ -41,6 +42,6 @@ public interface MojoAnnotationsScanner static final List acceptedFieldLevelAnnotationClasses = Arrays.asList( Parameter.class.getName(), Component.class.getName() ); - List scan( MojoAnnotationsScannerRequest request ) + Map scan( MojoAnnotationsScannerRequest request ) throws ExtractionException; } diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/annotations/TestAnnotationsReader.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/annotations/TestAnnotationsReader.java index 1bc5e7d..12b0a15 100644 --- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/annotations/TestAnnotationsReader.java +++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/annotations/TestAnnotationsReader.java @@ -34,6 +34,7 @@ import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; /** * @author Olivier Lamy @@ -50,13 +51,13 @@ public class TestAnnotationsReader request.setClassesDirectories( Collections.singletonList( new File( "target/test-classes" ) ) ); request.setIncludePatterns( Arrays.asList( "**/FooMojo.class" ) ); - List mojoAnnotatedClasses = mojoAnnotationsScanner.scan( request ); + Map mojoAnnotatedClasses = mojoAnnotationsScanner.scan( request ); System.out.println( "mojoAnnotatedClasses:" + mojoAnnotatedClasses ); Assertions.assertThat( mojoAnnotatedClasses ).isNotNull().isNotEmpty().hasSize( 1 ); - MojoAnnotatedClass mojoAnnotatedClass = mojoAnnotatedClasses.get( 0 ); + MojoAnnotatedClass mojoAnnotatedClass = mojoAnnotatedClasses.values().iterator().next(); assertEquals( FooMojo.class.getName(), mojoAnnotatedClass.getClassName() ); assertEquals( AbstractMojo.class.getName(), mojoAnnotatedClass.getParentClassName() ); diff --git a/maven-plugin-tools-java/pom.xml b/maven-plugin-tools-java/pom.xml index 91196ab..4eb2d67 100644 --- a/maven-plugin-tools-java/pom.xml +++ b/maven-plugin-tools-java/pom.xml @@ -66,7 +66,6 @@ com.thoughtworks.qdox qdox - 1.11 diff --git a/pom.xml b/pom.xml index e9934a6..6dec851 100644 --- a/pom.xml +++ b/pom.xml @@ -229,6 +229,12 @@ 1.0-alpha-9-stable-1 + + com.thoughtworks.qdox + qdox + 1.11 + + org.apache.maven.plugin-testing maven-plugin-testing-harness