move to a Map with className as key to merge with javadoc scan

git-svn-id: https://svn.apache.org/repos/asf/maven/plugin-tools/branches/MPLUGIN-189@1333848 13f79535-47bb-0310-9956-ffa450edef68
master
Olivier Lamy 2012-05-04 10:04:16 +00:00
parent 5da55eb1be
commit 06470fdc2a
7 changed files with 56 additions and 16 deletions

View File

@ -71,6 +71,12 @@
<artifactId>asm-commons</artifactId> <artifactId>asm-commons</artifactId>
<version>3.3.1</version> <version>3.3.1</version>
</dependency> </dependency>
<dependency>
<groupId>com.thoughtworks.qdox</groupId>
<artifactId>qdox</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -18,6 +18,8 @@ package org.apache.maven.tools.plugin.annotations;
* under the License. * under the License.
*/ */
import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.descriptor.DuplicateParameterException; import org.apache.maven.plugin.descriptor.DuplicateParameterException;
import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException; import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException;
@ -43,6 +45,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author Olivier Lamy * @author Olivier Lamy
@ -76,9 +79,11 @@ public class JavaAnnotationsMojoDescriptorExtractor
mojoAnnotationsScannerRequest.setDependencies( request.getProject().getCompileClasspathElements() ); mojoAnnotationsScannerRequest.setDependencies( request.getProject().getCompileClasspathElements() );
List<MojoAnnotatedClass> mojoAnnotatedClasses = Map<String, MojoAnnotatedClass> mojoAnnotatedClasses =
mojoAnnotationsScanner.scan( mojoAnnotationsScannerRequest ); mojoAnnotationsScanner.scan( mojoAnnotationsScannerRequest );
JavaClass[] javaClasses = discoverClasses( request );
return toMojoDescriptors( mojoAnnotatedClasses, request ); return toMojoDescriptors( mojoAnnotatedClasses, request );
} }
catch ( DependencyResolutionRequiredException e ) 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<String>) 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<File> toFiles( List<String> directories ) private List<File> toFiles( List<String> directories )
{ {
if ( directories == null ) if ( directories == null )
@ -101,18 +128,19 @@ public class JavaAnnotationsMojoDescriptorExtractor
return files; return files;
} }
private List<MojoDescriptor> toMojoDescriptors( List<MojoAnnotatedClass> mojoAnnotatedClasses, private List<MojoDescriptor> toMojoDescriptors( Map<String, MojoAnnotatedClass> mojoAnnotatedClasses,
PluginToolsRequest request ) PluginToolsRequest request )
throws DuplicateParameterException throws DuplicateParameterException
{ {
List<MojoDescriptor> mojoDescriptors = new ArrayList<MojoDescriptor>( mojoAnnotatedClasses.size() ); List<MojoDescriptor> mojoDescriptors = new ArrayList<MojoDescriptor>( mojoAnnotatedClasses.size() );
for ( MojoAnnotatedClass mojoAnnotatedClass : mojoAnnotatedClasses ) for ( MojoAnnotatedClass mojoAnnotatedClass : mojoAnnotatedClasses.values() )
{ {
MojoDescriptor mojoDescriptor = new MojoDescriptor(); MojoDescriptor mojoDescriptor = new MojoDescriptor();
//mojoDescriptor.setRole( mojoAnnotatedClass.getClassName() ); //mojoDescriptor.setRole( mojoAnnotatedClass.getClassName() );
//mojoDescriptor.setRoleHint( "default" ); //mojoDescriptor.setRoleHint( "default" );
mojoDescriptor.setImplementation( mojoAnnotatedClass.getClassName() ); mojoDescriptor.setImplementation( mojoAnnotatedClass.getClassName() );
mojoDescriptor.setLanguage( "java" );
MojoAnnotationContent mojo = mojoAnnotatedClass.getMojo(); MojoAnnotationContent mojo = mojoAnnotatedClass.getMojo();
@ -138,7 +166,6 @@ public class JavaAnnotationsMojoDescriptorExtractor
mojoDescriptor.setOnlineRequired( mojo.requiresOnline() ); mojoDescriptor.setOnlineRequired( mojo.requiresOnline() );
mojoDescriptor.setPhase( mojo.defaultPhase().id() ); mojoDescriptor.setPhase( mojo.defaultPhase().id() );
mojoDescriptor.setLanguage( "java" );
for ( ParameterAnnotationContent parameterAnnotationContent : mojoAnnotatedClass.getParameters() ) for ( ParameterAnnotationContent parameterAnnotationContent : mojoAnnotatedClass.getParameters() )
{ {

View File

@ -41,7 +41,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -55,22 +55,21 @@ public class DefaultMojoAnnotationsScanner
{ {
private Reflector reflector = new Reflector(); private Reflector reflector = new Reflector();
public List<MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request ) public Map<String, MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request )
throws ExtractionException throws ExtractionException
{ {
List<MojoAnnotatedClass> mojoAnnotatedClasses = new ArrayList<MojoAnnotatedClass>(); Map<String, MojoAnnotatedClass> mojoAnnotatedClasses = new HashMap<String, MojoAnnotatedClass>();
try try
{ {
for ( File classDirectory : request.getClassesDirectories() ) for ( File classDirectory : request.getClassesDirectories() )
{ {
if ( classDirectory.exists() && classDirectory.isDirectory() ) 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 sources to get @since and @deprecated and description of classes and fields.
} }
} }
//TODO scan dependencies to get super class annotations if exist request.getDependencies() //TODO scan dependencies to get super class annotations if exist request.getDependencies()
return mojoAnnotatedClasses; return mojoAnnotatedClasses;
@ -81,10 +80,10 @@ public class DefaultMojoAnnotationsScanner
} }
} }
protected List<MojoAnnotatedClass> scanDirectory( File classDirectory, List<String> includePatterns ) protected Map<String, MojoAnnotatedClass> scanDirectory( File classDirectory, List<String> includePatterns )
throws IOException, ExtractionException throws IOException, ExtractionException
{ {
List<MojoAnnotatedClass> mojoAnnotatedClasses = new ArrayList<MojoAnnotatedClass>(); Map<String, MojoAnnotatedClass> mojoAnnotatedClasses = new HashMap<String, MojoAnnotatedClass>();
DirectoryScanner scanner = new DirectoryScanner(); DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( classDirectory ); scanner.setBasedir( classDirectory );
scanner.addDefaultExcludes(); scanner.addDefaultExcludes();
@ -110,7 +109,8 @@ public class DefaultMojoAnnotationsScanner
analyzeVisitors( mojoClassVisitor ); analyzeVisitors( mojoClassVisitor );
if ( isMojoAnnnotatedClassCandidate( mojoClassVisitor.getMojoAnnotatedClass() ) != null ) if ( isMojoAnnnotatedClassCandidate( mojoClassVisitor.getMojoAnnotatedClass() ) != null )
{ {
mojoAnnotatedClasses.add( mojoClassVisitor.getMojoAnnotatedClass() ); mojoAnnotatedClasses.put( mojoClassVisitor.getMojoAnnotatedClass().getClassName(),
mojoClassVisitor.getMojoAnnotatedClass() );
} }
} }

View File

@ -26,6 +26,7 @@ import org.apache.maven.tools.plugin.extractor.ExtractionException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author Olivier Lamy * @author Olivier Lamy
@ -41,6 +42,6 @@ public interface MojoAnnotationsScanner
static final List<String> acceptedFieldLevelAnnotationClasses = static final List<String> acceptedFieldLevelAnnotationClasses =
Arrays.asList( Parameter.class.getName(), Component.class.getName() ); Arrays.asList( Parameter.class.getName(), Component.class.getName() );
List<MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request ) Map<String, MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request )
throws ExtractionException; throws ExtractionException;
} }

View File

@ -34,6 +34,7 @@ import java.io.File;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author Olivier Lamy * @author Olivier Lamy
@ -50,13 +51,13 @@ public class TestAnnotationsReader
request.setClassesDirectories( Collections.singletonList( new File( "target/test-classes" ) ) ); request.setClassesDirectories( Collections.singletonList( new File( "target/test-classes" ) ) );
request.setIncludePatterns( Arrays.asList( "**/FooMojo.class" ) ); request.setIncludePatterns( Arrays.asList( "**/FooMojo.class" ) );
List<MojoAnnotatedClass> mojoAnnotatedClasses = mojoAnnotationsScanner.scan( request ); Map<String, MojoAnnotatedClass> mojoAnnotatedClasses = mojoAnnotationsScanner.scan( request );
System.out.println( "mojoAnnotatedClasses:" + mojoAnnotatedClasses ); System.out.println( "mojoAnnotatedClasses:" + mojoAnnotatedClasses );
Assertions.assertThat( mojoAnnotatedClasses ).isNotNull().isNotEmpty().hasSize( 1 ); 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( FooMojo.class.getName(), mojoAnnotatedClass.getClassName() );
assertEquals( AbstractMojo.class.getName(), mojoAnnotatedClass.getParentClassName() ); assertEquals( AbstractMojo.class.getName(), mojoAnnotatedClass.getParentClassName() );

View File

@ -66,7 +66,6 @@
<dependency> <dependency>
<groupId>com.thoughtworks.qdox</groupId> <groupId>com.thoughtworks.qdox</groupId>
<artifactId>qdox</artifactId> <artifactId>qdox</artifactId>
<version>1.11</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -229,6 +229,12 @@
<version>1.0-alpha-9-stable-1</version> <version>1.0-alpha-9-stable-1</version>
</dependency> </dependency>
<dependency>
<groupId>com.thoughtworks.qdox</groupId>
<artifactId>qdox</artifactId>
<version>1.11</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.maven.plugin-testing</groupId> <groupId>org.apache.maven.plugin-testing</groupId>
<artifactId>maven-plugin-testing-harness</artifactId> <artifactId>maven-plugin-testing-harness</artifactId>