From ddebc219e5439b5c9e60b4c89f39e6379ef89b0f Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Fri, 4 May 2012 10:04:31 +0000 Subject: [PATCH] support @since @deprecated and description at class level git-svn-id: https://svn.apache.org/repos/asf/maven/plugin-tools/branches/MPLUGIN-189@1333849 13f79535-47bb-0310-9956-ffa450edef68 --- ...avaAnnotationsMojoDescriptorExtractor.java | 88 +++++++++++++++++-- .../DefaultMojoAnnotationsScanner.java | 1 - 2 files changed, 83 insertions(+), 6 deletions(-) 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 235e0d9..d53ee08 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 @@ -19,6 +19,7 @@ package org.apache.maven.tools.plugin.annotations; */ import com.thoughtworks.qdox.JavaDocBuilder; +import com.thoughtworks.qdox.model.DocletTag; import com.thoughtworks.qdox.model.JavaClass; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.descriptor.DuplicateParameterException; @@ -28,6 +29,7 @@ import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.plugin.descriptor.Requirement; import org.apache.maven.project.MavenProject; import org.apache.maven.tools.plugin.DefaultPluginToolsRequest; +import org.apache.maven.tools.plugin.ExtendedMojoDescriptor; import org.apache.maven.tools.plugin.PluginToolsRequest; import org.apache.maven.tools.plugin.annotations.datamodel.ComponentAnnotationContent; import org.apache.maven.tools.plugin.annotations.datamodel.ExecuteAnnotationContent; @@ -44,6 +46,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -82,7 +85,9 @@ public class JavaAnnotationsMojoDescriptorExtractor Map mojoAnnotatedClasses = mojoAnnotationsScanner.scan( mojoAnnotationsScannerRequest ); - JavaClass[] javaClasses = discoverClasses( request ); + Map javaClassesMap = discoverClasses( request ); + + populateDataFromJavadoc( mojoAnnotatedClasses, javaClassesMap ); return toMojoDescriptors( mojoAnnotatedClasses, request ); } @@ -92,7 +97,61 @@ public class JavaAnnotationsMojoDescriptorExtractor } } - protected JavaClass[] discoverClasses( final PluginToolsRequest request ) + /** + * from sources scan to get @since and @deprecated and description of classes and fields. + * + * @param mojoAnnotatedClasses + * @param javaClassesMap + */ + protected void populateDataFromJavadoc( Map mojoAnnotatedClasses, + Map javaClassesMap ) + { + + for ( Map.Entry entry : mojoAnnotatedClasses.entrySet() ) + { + JavaClass javaClass = javaClassesMap.get( entry.getKey() ); + if ( javaClass != null ) + { + entry.getValue().getMojo().setDescription( javaClass.getComment() ); + DocletTag since = findInClassHierarchy( javaClass, "since" ); + if ( since != null ) + { + entry.getValue().getMojo().setSince( since.getValue() ); + } + + DocletTag deprecated = findInClassHierarchy( javaClass, "deprecated" ); + if ( deprecated != null ) + { + entry.getValue().getMojo().setDeprecated( deprecated.getValue() ); + } + } + } + + } + + /** + * @param javaClass not null + * @param tagName not null + * @return docletTag instance + */ + private static DocletTag findInClassHierarchy( JavaClass javaClass, String tagName ) + { + DocletTag tag = javaClass.getTagByName( tagName ); + + if ( tag == null ) + { + JavaClass superClass = javaClass.getSuperJavaClass(); + + if ( superClass != null ) + { + tag = findInClassHierarchy( superClass, tagName ); + } + } + + return tag; + } + + protected Map discoverClasses( final PluginToolsRequest request ) { JavaDocBuilder builder = new JavaDocBuilder(); builder.setEncoding( request.getEncoding() ); @@ -111,7 +170,21 @@ public class JavaAnnotationsMojoDescriptorExtractor builder.addSourceTree( generatedPlugin ); } - return builder.getClasses(); + JavaClass[] javaClasses = builder.getClasses(); + + if ( javaClasses == null || javaClasses.length < 1 ) + { + return Collections.emptyMap(); + } + + Map javaClassMap = new HashMap( javaClasses.length ); + + for ( JavaClass javaClass : javaClasses ) + { + javaClassMap.put( javaClass.getFullyQualifiedName(), javaClass ); + } + + return javaClassMap; } private List toFiles( List directories ) @@ -135,7 +208,7 @@ public class JavaAnnotationsMojoDescriptorExtractor List mojoDescriptors = new ArrayList( mojoAnnotatedClasses.size() ); for ( MojoAnnotatedClass mojoAnnotatedClass : mojoAnnotatedClasses.values() ) { - MojoDescriptor mojoDescriptor = new MojoDescriptor(); + ExtendedMojoDescriptor mojoDescriptor = new ExtendedMojoDescriptor(); //mojoDescriptor.setRole( mojoAnnotatedClass.getClassName() ); //mojoDescriptor.setRoleHint( "default" ); @@ -144,10 +217,15 @@ public class JavaAnnotationsMojoDescriptorExtractor MojoAnnotationContent mojo = mojoAnnotatedClass.getMojo(); + mojoDescriptor.setDescription( mojo.getDescription() ); + mojoDescriptor.setSince( mojo.getSince() ); + mojo.setDeprecated( mojo.getDeprecated() ); + mojoDescriptor.setAggregator( mojo.aggregator() ); mojoDescriptor.setDependencyResolutionRequired( mojo.requiresDependencyResolution() ); mojoDescriptor.setDirectInvocationOnly( mojo.requiresDirectInvocation() ); mojoDescriptor.setDeprecated( mojo.getDeprecated() ); + mojoDescriptor.setThreadSafe( mojo.threadSafe() ); ExecuteAnnotationContent execute = mojoAnnotatedClass.getExecute(); @@ -176,7 +254,6 @@ public class JavaAnnotationsMojoDescriptorExtractor parameter.setDefaultValue( parameterAnnotationContent.defaultValue() ); parameter.setDeprecated( parameterAnnotationContent.getDeprecated() ); parameter.setDescription( parameterAnnotationContent.getDescription() ); - // FIXME olamy wtf ? parameter.setEditable( !parameterAnnotationContent.readonly() ); parameter.setExpression( parameterAnnotationContent.expression() ); mojoDescriptor.addParameter( parameter ); @@ -190,6 +267,7 @@ public class JavaAnnotationsMojoDescriptorExtractor parameter.setRequirement( new Requirement( componentAnnotationContent.role(), componentAnnotationContent.roleHint() ) ); parameter.setEditable( false ); + mojoDescriptor.addParameter( parameter ); } 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 ee53ffe..71bbd39 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 @@ -66,7 +66,6 @@ public class DefaultMojoAnnotationsScanner if ( classDirectory.exists() && classDirectory.isDirectory() ) { mojoAnnotatedClasses.putAll( scanDirectory( classDirectory, request.getIncludePatterns() ) ); - // TODO scan sources to get @since and @deprecated and description of classes and fields. } }